TIL - 24.04.11 최종 프로젝트

Amberjack·2024년 4월 11일
1

TIL

목록 보기
72/83
post-thumbnail

24.04.11 최종 프로젝트

오늘은 튜터님과의 면담, 최종 프로젝트 병합 작업을 진행했다.

튜터님과의 면담

게임 클라이언트 프로그래머 외에 기획자나 게임 디자인, PM에도 관심이 있는데 이 경우 어떻게 준비를 하면 좋을까요? 신입으로도 뽑아가나요?

PM은 아무래도 신입을 뽑지 않음(전체적인 프로세스를 알아야 하기 때문). 기획자, 디자이너는 포트폴리오 준비 시 직군의 특수성에 따라 준비를 해야 할 것. 신입을 채용하기는 한다.

저희는 데이터를 엑셀을 ScriptableObject로 만들어서 관리를 하는데 현직에서는 어떻게 데이터를 관리하나요?

똑같이 엑셀을 SO로 만들어서 관리를 하심. 규모가 있는 게임의 경우 서버가 필요하기 때문에, 엑셀에 있는 데이터를 서버로 보내는 방식으로. CSV 방식?

엑셀을 사용하는 이유 : PM이나 기획자 분들이 밸런싱을 할 때, 지표를 보며 고치기 용이하기 위해 엑셀을 사용한다.

서로 다른 클래스를 사용할 때 Awake와 Start의 호출 시기를 빌드 세팅에서 순서를 맞추는 방식을 사용하지 않고 맞추는 방식이 있을까요?

Start나 Awake에서 해야될 일들을 Init() 함수를 만들어서 해당 기능을 총괄하는 Manager에서 Start, Awake 진행 후 Init() 함수들을 불러 순서를 조절한다.

포트폴리오를 보실 때 트러블 슈팅을 중점으로 보신다고 하셨는데 트러블 슈팅은 몇가지를 선정하는 것이 좋을까요?

프로젝트마다 대표적으로 주요 사례를 3가지 정도만 잘 정리를 하기. 너무 많아도 안 본다.

튜터님께서 면접관이라면 면접을 볼 때 어떤 질문을 하실 것 같나요?

보통 일반적으로 많이 물어보는 것이 ‘주변에 같이 작업을 했던 팀원들이 나에 대해서 어떻게 말할 것 같냐.’ 에 대해 많이 물어보심. 이 사람이 그동안 주변 사람들에게서 어떤 평을 들으며 작업을 했는지 알 수 있기 때문. 자기 소개, 포트폴리오 내용에 따라서 어떻게 문제 해결을 했는지, 말로써 설명을 하도록. 본인의 장단점!

OnDisable, OnDestroy에서 싱글톤 호출 시 에러 발생

오늘 발생한 문제 중, 등록한 이벤트를 해제하기 위해 OnDestroy나 OnDisable에서 싱글톤 Instance를 호출하는 코드를 작성했었다.

private void OnDisable()
{
    InventoryController.Instance.nextStage -= RemoveAllItems;
    DungeonManager.Instance.OnStageEnd -= SetConsumableDuration;
}

그런데, 이렇게 코드를 작성하면 유니티 게임 종료 시 에러가 발생을 했다.

OnDestroy에서 객체를 생성하고 있지 않냐는 유니티의 에러였다. 고민해본 결과, 싱글톤을 하기 위해 작성한 Instance를 return 하는 코드에서 Instance를 생성할 가능성이 있기 때문에 발생하는 문제인 것 같다.

public class SingletoneBase<T> : MonoBehaviour where T : MonoBehaviour
{
    // 프로퍼티
    private static T _instance;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                string typeName = typeof(T).FullName;
                GameObject go = new GameObject(typeName);
                _instance = go.AddComponent<T>();

                DontDestroyOnLoad(go);
            }

            return _instance;
        }
    }

    ...
}

SingletoneBase에서 싱글톤을 만들기 위해 Instance를 Get할 때, _instance가 null일 경우 새로 객체를 생성할 수 있기 때문에 에러가 발생하는 것 같다.

이를 해결하기 위해 미리 캐싱을 해서 사용하는 방식으로 했다.

DungeonManager _dungeonManager;

...

private void OnDisable()
{
    InventoryController.Instance.nextStage -= RemoveAllItems;
    _dungeonManager.OnStageEnd -= SetConsumableDuration;
}

0개의 댓글