#4 UI 프레임워크 리팩토링 [점프던전]

신지한·2024년 8월 27일
0

개발일지

목록 보기
9/9
post-thumbnail

📢 개발일지에 앞서서

본 게임개발일지는 본인이 게임개발에 참여한 게임에 대한 얘기이며
게임개발에 느낀점이나 시행착오 등을 기록하기위해 작성된 글입니다
공부해나가는 입장으로서 부족한점이 많아 이해해주시면 감사하겠습니다

🎬 유니티 인프런 강의 수강후기

이번 점프맵을 개발하면서 가장 개선하려했던 점은 게임의 구조적 설계였다

이전에 개발했던 픽셀포커디펜스는 게임을 처음 개발하다보니 성공적으로 개발한데에 비해 게임이 구조적으로 잘 설계되어있지 않아있었고 이후에 유지보수에 힘이든 경험이 있었다

이번 점프던전은 혼자 개발을 담당하기도 하고 스스로 자기계발을 하고자 하는 목표가 있었기에 좀 더 구조적으로 훌륭한 게임을 만들고자 하는 목표를 가지고 있다


하지만 게임의 전체적인 게임 설계 방법을 알아보기위해 인터넷 서핑으로 찾기엔 너무 많고 다른 정보들이 있어서 참고하기엔 한계가 있었고 서적이나 공식 문서를 통해서도 알 수 있었지만 좀 더 체계적인 교육을 들어보고싶어 강의를 알아보게 되었다

<강의링크 👉 유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지>

인프런에 BurningCarrot 강사님께서 진행하신 <유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지> 를 수강하였다

해당 강의는 게임의 로직에 대해 강의하는게 아닌 상용 게임에서 사용되는 핵심 시스템의 구현에 대해 강의해 주었기 때문에 나에게 필요한 강의라고 생각들었다

특히 게임을 효율적으로 관리하기 위해선 유저의 데이터의 관리가 중요했고 구현 과정에서 UI 프레임워크의 설계에 대해 특히 자세하게 배울 수 있었기 때문에 좋았다

수강한 강의 내용을 활용하여 기존에 구현하였던 점프던전의 UI 및 유저 데이터 관리를 좀 더 보완하였고 이에 대한 내용을 포스팅하려고한다


📃 점프던전 UI 프레임워크 개선


1. UI들이 씬에 전부 생성이 되어있음

기존에 구현했던 UI들은 전부 Canvas상에서 이미 오브젝트가 생성되어 있었다

이는 씬을 로딩할 시에 씬을 무겁게하여 로딩을 느리게할 수 있으며 추가 작업을 해야할 시에 씬 자체를 수정해야해서 추후의 형상 관리에 문제가 생길 수도 있다

2. UI 관리가 전부 한 스크립트 상에서만 이루어졌음

위와같이 기존에 구현했던 UI는 모두 UIManager에서 기존에 생성되어있던 오브젝트들을 모두 입력한 후 관리하였고 버튼 이벤트 또한 ButtonEvent라는 함수에 버튼의 tag와 name을 비교하며 사용하는 방식으로 구현하였다

이는 새로운 UI 혹은 새로운 Button의 기능 구현 시 스크립트의 전체를 수정해야하는 과정이 생기므로 이는 객체지향에 바람직하지 않다고 볼 수 있다

이를 해결하기위해 UI의 프레임워크를 다음과 같이 개선하였다

📌 UIManager : UI 요소를 관리하는 메인 시스템으로 UI를 생성하고 이미 생성된 UI는 Pool에다가 저장하여 열려있을땐 Open Pool, 닫혀있을땐 Close Pool로 오브젝트 풀링을 사용하여 관리함

📌 BaseUI : 게임의 UI가 상속받는 기본 클래스로 UI 초기화, 정보 설정, 요소의 기본 기능 등을 제공

📌 BaseUIData : UI가 생성될 때 매개변수로 전달되는 UI에 필요한 정보

//Stage UI Data
public class StageUIData : BaseUIData
{
    public int StartAmount;
    public int ChapterNum;
    public int StageNum;
    public float ClearTime;
}

//Stage UI
public class StageUI : BaseUI
{
    public Image[] Stars = new Image[3];
    public TextMeshProUGUI StageInfoTxt;
    public TextMeshProUGUI ClearTime;

    private StageUIData m_StageUIData;

    public override void SetInfo(BaseUIData uiData)
    {
        base.SetInfo(uiData);

        m_StageUIData = uiData as StageUIData;
        if(m_StageUIData == null)
        {
            Logger.LogError("StageUIData is invalid");
            return;
        }

        for (int i = 0; i < Stars.Length; i++)
        {
            Stars[i].gameObject.SetActive(i < m_StageUIData.StartAmount);
        }

        StageInfoTxt.text = $"{((ChapterType)m_StageUIData.ChapterNum).ToString()} - {m_StageUIData.StageNum}";
        float clearTime = m_StageUIData.ClearTime;
        ClearTime.text = $"{(int)clearTime/3600:D2}:{(int)clearTime%3600/60:D2}:{clearTime%60:00.00}";
    }

    public void OnClickAdBtn() { }

    public void OnClickStartBtn()
    {
        UIManager.Instance.Fade(false, false, () =>
        {
            SceneLoader.Instance.LoadScene(SceneType.MainGame);
            UIManager.Instance.Fade(true, true);
        });

        CloseUI();
    }
}

비교적 짧은 코드를 예시로 가져와보았다

📌 UI 프레임워크 개선 결과

개선하기 전과 비교했을 때 씬 자체에 UI 오브젝트들이 미리 생성되어있지 않기 때문에 씬이 깔끔해졌고 로딩도 좀 더 가볍게 할 수 있도록 되었다

하나의 스크립트에서 전체의 UI를 관리하는게 아닌 UI 마다 스크립트를 생성하고 이를 BaseUI를 상속받게 하여 동적으로 생성함으로써 유지보수 측면에서 좀더 수월하도록 구현하였다


🤔 앞으로의 계획

현재 강의를 통해 UI의 프레임워크 및 유저 데이터 관리 시스템에 대한 구현을 거의 다 마친 상태이다

강의 내용을 토대로 내가 새롭게 구현해야할 UI들을 추가해나가고 이에 기능을 계속해서 더해가는 방향으로 구현하고 있는데 강의에서 얻은 지식들이 많은 도움이 되고있다

점프던전이 새롭게 지원사업을 받아 진행하고 있는 만큼 게임의 개발 진행속도를 높여서 빠르게 빠르게 진행하고 있다

빠르게 진행하는 와중에도 구조적으로 좋은 설계를 하려고하니 조금 어려움이 있지만 최대한 좋은 코드를 만들기 위해 계속해서 노력해나갈 계획이다

profile
게임 개발자

0개의 댓글

관련 채용 정보