ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 내일배움캠프 23일차 TIL - 유니티 입문 팀 프로젝트 2
    TIL/Unity 2024. 5. 17. 21:02

     

    [학습목표]

    유니티 입문 주차 팀 프로젝트를 진행하고 필수 요구사항 기능 구현을 완료한다.

    [학습내용]

    시작 화면 구성

    우선 팀원별로 역할을 분배하여 시작하였다. 나는 게임이 시작하는 스타트 씬을 맡아서 구현하였다.

    StartScene

     

    와이어 프레임에 따라 세 개의 버튼을 배치하였고, 각각 버튼에 알맞는 기능을 구현하였다. 기능 구현이 우선이기 때문에 하얀 사각형은 나중에 알맞은 이미지로 바꾸고 배경도 추가해야 한다.

    public void QuitGame()
    {
        // 구동 환경이 유니티 에디터일 경우
        #if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
        // 구동 환경이 응용프로그램일 경우
        #else
            Application.Quit();
        #endif
    }

     

    종료 버튼 기능을 구현하던 중, Application.Quit()을 실행하여도 게임이 종료하지 않는 현상이 있었다. 그래서 구글에 찾아보니, 에디터 환경에서는 해당 메서드가 동작하지 않는다고 한다. 빌드한 후에 응용프로그램 상태에서는 작동한다고 한다.

    그래서 #if 문을 이용하여 유니티 에디터일 경우에는 다른 코드로 종료할 수 있도록 수정해주었다.

     

    게임 방법 UI

     

    시작 화면 두 번째에 있는 게임 방법 버튼을 클릭하였을 경우에는 위의 UI가 활성화되도록 구현했다. 마찬가지로 기능 구현이 우선이기에 나중에 상세한 설명과 디자인이 추가되어야 할 것이다.

    따로 닫기 버튼을 만들지 않고 패널의 아무곳을 클릭하면 다시 비활성화 되도록 구현했다. 이건 따로 스크립트를 작성하지 않고 버튼 컴포넌트 자체 기능으로 구현해줬다.

    OnClick 시 SetActive()가 false로 되도록

     

    시작화면 구성을 마칠 쯤 되니, 다른 팀원들도 각자 씬 기초 구현을 완료했다. 스타트 씬에서 필요한 게 더 뭐가 있을까 고민하다가 게임 매니저를 만들었다. 스타트 씬에서 초기화 되고, 싱글톤 디자인으로 계속 들고 있을 오브젝트다.

    게임 매니저

    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    public class GameManager : MonoBehaviour
    {
        public static GameManager Instance;
    
        [SerializeField] private GameObject mushroom;
        private float intervalTime = 1f;
        private bool isPlaying = false;
        
        public int totalScore = 0;
    
        public void Awake()
        {
            if (Instance == null)
            {
                Instance = this;
                DontDestroyOnLoad(this);
            }
        }
    
        public void FixedUpdate()
        {
            if (isPlaying)
            {
                if (intervalTime > 0)
                {
                    intervalTime -= Time.fixedDeltaTime;
                }
                else
                {
                    MakeMushroom();
                    intervalTime = 1;
                }
            }
        }
    
        public void GameStart()
        {
            isPlaying = true;
            Time.timeScale = 1f;
            totalScore = 0;
        }
    
        public void GameOver()
        {
            isPlaying = false;
        }
    
        public void GamePause()
        {
            Time.timeScale = 0f;
        }
    
        public void MakeMushroom()
        {
            Instantiate(mushroom);
        }
    
    }

     

    이 게임 매니저에서는 게임의 시작과 정지, 그리고 게임의 핵심 로직인 버섯 생성 등을 담당할 예정이다. 점수 등의 정보도 들고 있어야 하기 때문에 씬이 바뀌어도 파괴되지 않도록 DontDestroyOnLoad()도 사용해주었다.

    [결과물]

    현재까지 다른 팀원들과 구현한 것들이다.

    플레이 화면

     

    플레이 중 일시정지

     

    종료 화면

     

    https://github.com/LolDaeNam/AvoidTeemoMushroom

     

    GitHub - LolDaeNam/AvoidTeemoMushroom

    Contribute to LolDaeNam/AvoidTeemoMushroom development by creating an account on GitHub.

    github.com

     

    [회고]

    게임 매니저를 만들 동안 다른 팀원들은 버섯(탄막)이나 씬 이동, 점수 시스템 등의 다른 기능을 구현했다. 그 과정에서 유니티의 같은 씬을 수정하였기 때문에 깃허브 충돌이 발생했다. 이 충돌을 해결하는 데 많은 시간을 투자했다. 일단 핵심 기능 구현은 다행히 끝났으나, 충돌 처리에 너무 많은 노력과 시간을 쏟아부은 거 같다.

     

    다음에 구현해야 할 기능들로는 HP 시스템, 난이도 시스템, 아이템, 캐릭터 변경 등이 있다. 특히 난이도 시스템을 오늘 거의 구현했는데, 깃허브 충돌 처리 과정에서 날아가버렸다. 그래도 핵심적인 것들은 기억하고 있으니 다음에 바로 구현할 수 있을 거 같다.

    그래서 우선 다음 주에는 난이도 시스템을 먼저 구현할 예정이다. HP 시스템은 팀원이 맡을 거 같다. 주말에 시간이 난다면 이미지 등을 직접 그려봐야겠다.