현재 듣고 있는 곡 - 마셜・맥시마이저
가사가 의외로 의미가 깊은 노래라서 좋아한다
우선 체력바의 GUI를 바꿔보자, 너무 기본 기본하다
전 글에서 찾은 에셋을 사용할 계획이다
뭔가 생각한것 보다 애매한데 그러려니 하자
갑자기 골드를 획득했을때 연출을 추가하고 싶어졌다
당장 해보자
약간 dark souls의 죽는 효과와 비슷하게 하려 한다
의도한 느낌으로 완성했다
..................
..........
.......
...
..
.
문제가 생겼다
오브젝트를 생성할때
골드 오브젝트가
Instantiate(Text ,gameObject.transform.position,Quaternion.identity);
이렇게 해버리면 이상한 곳에서 생성된다
해결법은 Rect transform을 어떻게 사용해야 할 것 같다
RectTransform rectTransform = GetComponent<RectTransform>();
rectTransform.anchoredPosition = new Vector3(0f, -290f, 0f);
이런 식으로 고정시켜 버리면?
그래도 이상한 곳으로 가버린다
start에 두었는데 Update로 해보자
또 문제를 찾았다
UI가 Canvas를 하위로 자동으로 들어가지 않는데
갑자기 느꼈는데,
Instantiate(Text ,gameObject.transform.position,Quaternion.identity);
를 하는게 아니라
setative를 사용해야 할 것 같다
RectTransform rectTransform = GetComponent<RectTransform>();
rectTransform.anchoredPosition = new Vector3(0f, -290f, 0f);
imageComponent = GetComponent<Image>();
initialColor = new Color(0,0,0,0);
targetColor = new Color(initialColor.r, initialColor.g, initialColor.b, maxAlpha); // 목표 투명도 설정
imageComponent.color = new Color(initialColor.r, initialColor.g, initialColor.b, 0f);
StartCoroutine(FadeImage());
UI가 현재 사용하는 스크립트의 일부이다
여기에 setactive와 bool변수를 사용해서 새롭게 만들어 보자
void Start()
{
RectTransform rectTransform = GetComponent<RectTransform>();
rectTransform.anchoredPosition = new Vector3(0f, -290f, 0f);
imageComponent = GetComponent<Image>();
initialColor = new Color(0,0,0,0);
targetColor = new Color(initialColor.r, initialColor.g, initialColor.b, maxAlpha); // 목표 투명도 설정
}
void Update(){
if(isactive == true){
gameObject.SetActive(isactive);
imageComponent.color = new Color(initialColor.r, initialColor.g, initialColor.b, 0f);
StartCoroutine(FadeImage());
isactive = false;
}
else if(isactive == false){
imageComponent.color = new Color(initialColor.r, initialColor.g, initialColor.b, 0f);
gameObject.SetActive(isactive);
}
if(des){
Destroy(gameObject);
}
}
bool변수를 통해서 초기화와 코루틴 함수 호출을 만들었다
테스트를 했는데 안된다
변수가 아니라, setactive자체를 손봐야 할 것 같다
대충 의도한 느낌이다
텍스트도 동일하게 작업해주면 끝이다
글에 적지 못한 2시간의 노가다가 담긴 결과물이다
이제 상점을 만들어 보자
상점은 마을에 배치할 예정이다
근데 하지 전에 우선 오브젝트 정리를 해야겠다
필요한 오브젝트를 찾는데 너무 많은 시간이 필요하다
대충 빈 오브젝트를 만들어서 칸을 분리했다
이렇게 하면 분류를 나눠서 확인할 수 있다
계속해서 상점을 만들 방법을 생각해 보자
우선 확정적으로 상점에 진입하는 버튼이 필요하니, 레이무 신사에 진입하는 스크립트를 참고하여 제작하면 된다
다만 원래는
public class goto_reimu : MonoBehaviour
{
// 버튼을 눌렀을 때 호출되는 함수
public void GoToReimuScene()
{
SceneManager.LoadScene("Reimu"); // "Reimu" 씬으로 이동
}
}
이런식으로 씬을 옮기는 방식이였다면
이번에는 카메라를 다른 카메라로 바꾸는 방법을 사용하려 한다
public class CameraSwitch : MonoBehaviour
{
public Camera camera1;
public Camera camera2;
private bool isCamera1Active = true;
void Start()
{
camera1.enabled = true;
camera2.enabled = false;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
isCamera1Active = !isCamera1Active;
SwitchCameras();
}
}
void SwitchCameras()
{
if (isCamera1Active)
{
camera1.enabled = true;
camera2.enabled = false;
}
else
{
camera1.enabled = false;
camera2.enabled = true;
}
}
}
카메라 관리 스크립트를 만든뒤 테스트
이상없이 잘 되는것을 확인했다
이렇게 카메라 이동으로 씬 이동을 구현할 경우 문제점이 크게 2개 정도가 생각나는데
1. 상점으로 이동했을때 플레이어가 이동 될 수 있다
2. world씬에서 사용하는 UI가 살아있다
일단 플레이어 이동부터 막아보자
대충 생각나는것은, bool변수를 만들고, 거기에 이동 알고리즘을 넣어버리면 될 것 같다
if(ismove)
transform.position = newPosition;
이런식으로 말이다
플레이어의 이동을 막았다
이제 UI들을 전부 하나의 오브젝트로 묶은 뒤, 플레이어의 ismove변수로 엮어버리면 될 것 같으니 해보자
이렇게 하나의 오브젝트로 엮은 뒤
그 오브젝트를 꺼버리면, 모든 오브젝트가 false가 된다
그럼, 이 오브젝트의 true, false를 player의 ismove와 엮으면 된다
이것은 자신이 하는게 아닌, 제 3의 항상 씬에 있는 오브젝트가 관리하는 것이 좋을 것 같다
이전에 만들어둔 Fight_reset 오브젝트를 사용하면 될 것 같다
public class Fight_reset : MonoBehaviour
{
void Start()
{
}
// Update is called once per frame
void Update()
{
Gamemanager.Instance.iswin = false;
Gamemanager.Instance.fightend = false;
}
}
그냥 변수 하나를 초기화 하기 위해 만들어 둔 오브젝트이다
여기에 코드를 추가 하자
public class Fight_reset : MonoBehaviour
{
public GameObject World_UI;
public GPSManager player;
void Start()
{
}
// Update is called once per frame
void Update()
{
World_UI.SetActive(player.ismove);
Gamemanager.Instance.iswin = false;
Gamemanager.Instance.fightend = false;
}
}
이렇게 코드를 추가한다
public class goto_shop : MonoBehaviour
{
public GPSManager player;
// 버튼을 눌렀을 때 호출되는 함수
public void GoTo()
{
player.ismove = false;
}
}
이제 상점 입장 버튼에 ismove를 false하도록 하고 체크 해 보자
버튼을 누르면 world에서 사용되는 모든 ui가 false된다
여기에 카메라 변경도 넣으면 카메라도 같이 변경된다
이때, 카메라를 좀 더 편하게 이동하기 위해 스크립트를 수정해보자
public class CameraSwitch : MonoBehaviour
{
public Camera camera1;
public Camera camera2;
private int isCamera1Active = 1;
void Start()
{
camera1.enabled = true;
camera2.enabled = false;
}
void Update()
{
if(isCamera1Active == 1){
camera1.enabled = true;
camera2.enabled = false;
}
else if(isCamera1Active == 2){
camera1.enabled = false;
camera2.enabled = true;
}
}
}
이제 int값을 수정하는 것으로 카메라를 이동시킬 수 있다
이런식으로 카메라 이동과 UI변환을 구현할 수 있다
비슷하게 상점에서 나가는 버튼도 구현해 두자
public class out_btn_shop : MonoBehaviour
{
public GPSManager player;
public CameraSwitch cameraswitch;
// 버튼을 눌렀을 때 호출되는 함수
public void GoTo()
{
player.ismove = true;
cameraswitch.isCamera1Active = 1;
}
}
이제 다음 문제점을 해결해 보자
상점에 나갔다가 들어오면 상점 UI가 남아 있다
이것 또한 player의 ismove에 영향을 받도록 만들자
Fight_reset에 코드를 추가한다
void Update()
{
if(player.ismove == true){
World_UI.SetActive(true);
Shop_UI.SetActive(false);}
else{
World_UI.SetActive(false);
Shop_UI.SetActive(true);}
Gamemanager.Instance.iswin = false;
Gamemanager.Instance.fightend = false;
}
나중에 스파게티가 될 것 같은 예감이 든다
정상 작동한다
만세!
상점 UI는 밤에 이어서 만들기로 하자
머리아파...