ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (25) 메인맵 제작#3
    Galaxy Ball/2. 싱글플레이 - 스토리모드 2024. 6. 12. 17:55

    대부분의 틀은 거의 잡힌 상황이다. 이제 남은건 나머지 스테이지를 배치하는것, 그리고 각종 짜잘한 수정사항들이다

     

    우선 사소한것들부터 수정해보도록 하겠다

     

     

    튜토리얼 씬이나 메인씬이나 똑같이 있는 위치 초기화 버튼. 현재는 어떤 씬에서 누르던 튜토리얼씬을 로드한다

     

     this.BacktoCenter.onClick.AddListener(() =>
     {
         ButtonAudio.Play();
         this.Stop_Channel.gameObject.SetActive(false);
    
         Time.timeScale = 1;
         ispause = false;
    
         if (StageGameManager.StageClearID <= 5)
         {
             SceneManager.LoadScene("Stage");
         }
         else if(StageGameManager.StageClearID >= 6)
         {
             SceneManager.LoadScene("Main Stage");
         }

     

    그러니 StageClearID를 이용하여 간단하게 수정해주자. 이렇게하면 각각 맞는 위치에 위치 초기화를 해주게 된다

     

    클리어 씬도 마찬가지다. 스테이지 클리어를 클릭했을때 각각 맞는 씬으로 돌아가야 한다

      void OnMouseDown()
      {
          StageGameManager gameManager = FindObjectOfType<StageGameManager>();
          if (gameManager.StageClearID <= 5)
          {
              SceneManager.LoadScene("Stage");
          }
          else if (gameManager.StageClearID > 5)
          {
              SceneManager.LoadScene("Main Stage");
          }
      }

     

    이 역시 StageClearID를 사용하여 조절해주었다

     

    Fail씬도 마찬가지. 여기서 "잠시 머리좀 식히자.." 를 클릭하면 스테이지 맵으로 이동하는데

    이것도 위와 마찬가지로 똑같이 코드를 수정해주었다

     

    이스터에그인 이런 씬도 마찬가지. 여기는 StageClearID값을 가져오지 않고

    무조건 클릭시 메인메뉴로 나가도록 했다

     

    -----------------------------------------------------

     

    자 이번엔 중요한 기능 하나를 추가하려고 한다. 

     

    아무래도 컨셉이 우주다 보니 지금 보다시피 맵이 너무 넓다. 이것보다 더 넓어질수도 있다. 

    지금은 태양계 컨셉이니 망정이지 더 넓은 컨셉으로 간다면 어떻게 다음 스테이지를 찾아 진행할 수 있을까

     

    그래서 네비게이션 시스템을 하나 만들어주려고 한다

     

    왼쪽이 플레이어 시점이고 오른쪽이 진행해야할 행성이 있는곳이다. 

     

     

    (23) 메인맵 제작#1

    이제 드디어 메인맵을 제작하려 한다. 이것을 위해 총 4가지의 에셋을 구입하였다  우선 임시로 완성된 기본 화면이다. 이제 이 사진을 하나씩 하나씩 뜯어보자   우선 백그라운드 역할을 해

    sangeun00.tistory.com

    위 글에 적은대로 클리어할 차례인 스테이지에 저런 노란색 구체를 생성해주었는데

    플레이어의 위치를 기준으로 총 4가지 방향의 화살표를 만들어준뒤,

    노랑 구체가 오른쪽위에 있다면 오른쪽 화살표와 왼쪽 화살표를, 왼쪽 아래에 있다면 왼쪽 화살표와 아래 화살표를 

    활성화 시켜주는 방식으로 간단하게 네비게이션을 구현해보려고 한다

     

    간단한 화살표 이미지를 구해 캔버스에 Nevigation 이름으로 빈 오브젝트를 만든뒤 이미지를 4개를 만들어 넣어주자

    이제 이 4개의 화살표들을 상황에 따라 활성화/비활성화 해보도록 하겠다

     

    그리고 이제 스크립트를 작성해보자. 내가 원하는건 2가지이다

     

    1. Clearhere(Clone)과 Main Player 오브젝트를 찾아 위치값 출력

    2. public으로 4가지의 화살표를 입력받은뒤 둘의 좌표값 차이에 따라 알맞는 화살표 활성화/비활성화

     

    우선 1번부터 해보자

     

    using UnityEngine;
    
    public class Navigation : MonoBehaviour
    {
        private GameObject clearhereObject;
        private GameObject mainPlayerObject;
    
        void Start()
        {
            clearhereObject = GameObject.Find("Clearhere(Clone)");
            if (clearhereObject == null)
            {
                Debug.LogError("Clearhere(Clone) 오브젝트를 찾을 수 없습니다.");
            }
    
            mainPlayerObject = GameObject.Find("Main Player");
            if (mainPlayerObject == null)
            {
                Debug.LogError("Main Player 오브젝트를 찾을 수 없습니다.");
            }
        }
    
        void Update()
        {
            if (clearhereObject != null)
            {
                Debug.Log("Clearhere(Clone) 위치: " + clearhereObject.transform.position);
            }
    
            if (mainPlayerObject != null)
            {
                Debug.Log("Main Player 위치: " + mainPlayerObject.transform.position);
            }
        }
    }

     

    정말 간단하게 두개의 오브젝트를 찾아 Update에서 두 오브젝트의 위치값을 실시간으로 출력해주게 한다

     

    오류가 발생했다. 생각해보니 Clearhere(Clone)은 Main Player와 달리 게임이 시작되기 전부터

    있었던 존재가 아니라 게임이 시작되고 나서 생성되는 존재기 때문에 Start에서 찾을수가 없을것이다

     

    using UnityEngine;
    
    public class Navigation : MonoBehaviour
    {
        // 오브젝트 참조 변수
        private GameObject clearhereObject;
        private GameObject mainPlayerObject;
    
        void Start()
        {
            // Main Player 오브젝트 찾기
            mainPlayerObject = GameObject.Find("Main Player");
            if (mainPlayerObject == null)
            {
                Debug.LogError("Main Player 오브젝트를 찾을 수 없습니다.");
            }
        }
    
        void Update()
        {
            // Clearhere(Clone) 오브젝트가 아직 없으면 찾기 시도
            if (clearhereObject == null)
            {
                clearhereObject = GameObject.Find("Clearhere(Clone)");
                if (clearhereObject != null)
                {
                    Debug.Log("Clearhere(Clone) 오브젝트를 찾았습니다.");
                }
            }
    
            // Clearhere(Clone) 및 Main Player 오브젝트의 위치 출력
            if (clearhereObject != null)
            {
                Debug.Log("Clearhere(Clone) 위치: " + clearhereObject.transform.position);
            }
    
            if (mainPlayerObject != null)
            {
                Debug.Log("Main Player 위치: " + mainPlayerObject.transform.position);
            }
        }
    }

     

    그럼 Clearhere는 Update에서 찾아주면 된다

     

    이러면 위치값도 잘 구해지는것을 확인할 수 있다. 그럼 이제 2번을 해보자

     

    2. public으로 4가지의 화살표를 입력받은뒤 둘의 좌표값 차이에 따라 알맞는 화살표 활성화/비활성화

     

    using UnityEngine;
    
    public class Navigation : MonoBehaviour
    {
        private GameObject clearhereObject;
        private GameObject mainPlayerObject;
    
        public GameObject Top;
        public GameObject Bottom;
        public GameObject Left;
        public GameObject Right;
    
        void Start()
        {
            mainPlayerObject = GameObject.Find("Main Player");
            if (mainPlayerObject == null)
            {
                Debug.LogError("Main Player 오브젝트를 찾을 수 없습니다.");
            }
        }
    
        void Update()
        {
            if (clearhereObject == null)
            {
                clearhereObject = GameObject.Find("Clearhere(Clone)");
            }
    
            if (clearhereObject != null)
            {
                UpdateActivation();
            }
        }
    
        void UpdateActivation()
        {
            Vector3 mainPlayerPosition = mainPlayerObject.transform.position;
            Vector3 clearherePosition = clearhereObject.transform.position;
    
            bool isTop = clearherePosition.y > mainPlayerPosition.y;
            bool isBottom = clearherePosition.y <= mainPlayerPosition.y;
            bool isLeft = clearherePosition.x < mainPlayerPosition.x;
            bool isRight = clearherePosition.x >= mainPlayerPosition.x;
    
            Top.SetActive(isTop);
            Bottom.SetActive(isBottom);
            Left.SetActive(isLeft);
            Right.SetActive(isRight);
    
        }
    }

     

    코드는 어려울게 없다. 만약 Clearhere(Clone)까지 성공적으로 찾았다면 UpdateActivation 메서드를 실행한다

     

    그리고 이 메서드에서 bool타입 변수를 4개 선언해주고 여기서 활성화를 해야할지 말아야할지 여부를 결정하게 한다

     

     

     

    오... 잘된다

     

Designed by Tistory.