본문 바로가기
다이어리/내일배움 개발일지

게임개발캠프 - 팀과제(C) 2일차

by E.Clone 2024. 1. 25.

과정명 : 내일배움캠프 Unity 게임개발 3기

전체진행도 : 24일차

부분진행도 : Chapter3.2 - 2일차

작성일자 : 2024.01.25(목)

개발일지 목록 : 클릭


1. 진행중인 과정에 대해

오늘의 악마, 절대 팝업되지 않는 설정 패널

팀 과제 탕후루 만들기 2일차이다. 기본적인 게임진행 로직, 장면디자인과 상호작용을 오늘 대부분 완료한 것으로 보인다.

다만 자잘한 버그가 정말 많고 하나하나 별 거 아닌 기능인데 해결이 안되어 아주 골칫거리이다.

오는 수요일까지 과제제출 및 결과 발표라 생각보다 여유 시간이 될 지 모르겠다.

오후에는 챌린지 클래스 세션이 있었다. 델리게이트에 관한 소개와 예시로 세션을 진행하였다. 전혀 몰랐던 내용이긴 하지만 파이썬에서도 비슷한 방식으로 함수를 사용했기 때문에 흡수하는 데에 무리는 없었다.

 

2. 오늘 학습에 대해

[Serialized] 에 대해 새로 배운 사용법

팀원 한명이 에디터에서 플레이 버튼을 누르고 [Serialized]를 통해 변수가 바뀌는 걸 보며 디버깅을 한다는 얘기를 들었다. 생각 못 해본 방법이었는데 꽤나 괜찮다고 생각했다.

싱글톤 오브젝트의 치명적인 단점

예를 들어 ButtonManager.cs에서 '패널을 활성화하는 메서드'를 작성한 후, 다른 씬의 버튼에서 이걸 사용하려고 한다면 에디터의 버튼 이벤트로 작용하는 OnClick에 ButtonManager 오브젝트를 드래그 할 수가 없어, 스크립트로 할당하는 게 강제되는 것으로 보인다.

구글링이랑 GPT를 통해 알아봐도 스크립트의 구성을 다르게 하는 것 말고 깔끔한 해결법은 없는 것으로 보인다.

싱글톤 오브젝트를 사용 시 문제점 두번째

씬 전환 등을 할 때 Start나 Awake가 실행되지 않기 때문에 다른 방안을 모색해야 했다.

씬의 로딩이 완료되고 다른 오브젝트들이 만들어진 후 스크립트를 실행하는 방법의 예는 아래와 같다.

    private void Start()
    {
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    private void OnDestroy()
    {
        SceneManager.sceneLoaded -= OnSceneLoaded;
    }

    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        FindAndAssignUIElements(scene);
    }

    private void FindAndAssignUIElements(Scene scene)
    {
        // 로드되는 씬 이름에 따라 UI를 로드
        if (scene.name == "_TitleScene")
        {
            GameObject canvasObject = GameObject.Find("Canvas");
            highscore = GameObject.Find("HighScore").GetComponent<Text>();
            settingsPanel = GameObject.Find("SettingUI");
        }
        else if (scene.name == "_MainScene")
        {
            GameObject canvasObject = GameObject.Find("Canvas");
            pausedPanel = canvasObject.transform.Find("PauseUI").gameObject;
            settingsPanel = GameObject.Find("SettingUI");
            score = canvasObject.transform.Find("ScoreUI").transform.Find("Score").GetComponent<Text>();
            resultPanel = canvasObject.transform.Find("ResultUI").gameObject;
            resultScore = canvasObject.transform.Find("ResultUI").transform.Find("ScoreText").GetComponent<Text>();
            resultHighScore = canvasObject.transform.Find("ResultUI").transform.Find("HighScoreText").GetComponent<Text>();
        }

        // 씬 로드 이벤트 발생할 때마다 초기 상태를 비활성화로 설정
        SetPanelActive(settingsPanel, false);
        SetPanelActive(pausedPanel, false);
        SetPanelActive(resultPanel, false);
    }

씬의 이름에 따라 여러 UI 오브젝트들을 UIManager에 할당해준다. 다만 이런 방식은 UIManager가 처음 생성될 때는 작용하지 않는 것으로 보인다. SettingUI 오브젝트를 어째선지 다른 방법을 동원해도 UIManager에 할당하지 못하여 아직도 타이틀메뉴에서 세팅 창을 열지 못하는 상태이다. 정말 단순한 방법으로도 되지 않은 것으로 보아 무언가 알 수 없는 꼬임이 발생한 것 같다.

3. 과제에 대해

  • 팀 프로젝트 버그픽스 위주로 계속 진행하기
반응형