P1: 새로운 프로젝트 시작

홍신영·2025년 4월 7일

Unity

목록 보기
65/69

오늘부터 새로운 프로젝트를 시작해보려고 한다.
기간을 가능한 짧게 가져가려고 하고 이번에 플레이 스토어 출시를 목표로 도전해볼 예정이다.

먼저 UI부터 작업해보자.
마음은 천천히 처음 인트로 씬부터 작업해본다.

인트로씬 요소 설명
📱 해상도 1080 x 1920 (9:16) 모바일 기준
🎨 배경 화면 전체 배경 이미지
📝 타이틀 중앙 상단 ("카피바라고오오" 등)
✋ Touch to Play 중앙 하단에서 깜빡임
▶️ Play 버튼 "Touch to Play" 위에 위치, 클릭 시 로비 씬으로 전환

이정도면 무난한 구성이라 생각하고 구현해보자.
중간에 하다보니 구조 욕심이 나서 설계를 조금 늘려보았다.

인트로 씬을 만드니, 추가적으로 3개의 씬이 있을거같았다.
아마도 IntroScene, LobbyScene, PlayScene
정도가 될 것이다.

이렇게 씬 마다 Base가 되는 (기본적으로 생성되는 UI이 있을 거고) 추가적인 PopupUI가 있을 것이다.

그래서 이 Base가 되는 UI를 관리해줄것 같다.
그래서 BaseScene을 만들어 일단은 이름과 초기화 작업만 해두었다.

각 씬이 상속받도록 구성한것. 다음과 같다.

//UIBaseScene
public abstract class UIBaseScene : MonoBehaviour
{
    public abstract string SceneName { get; }

    protected virtual void Init()
    {
        Debug.Log($"{SceneName}, init");
    }

    private void Start()
    {
        Init();
    }
}

이제 이 base를 상속받는 인트록 씬을 만들자.
인트로 씬은 위에서 구상한대로 작업을 하려니 굳이 더 나누지 않고, 한 번에 기능을 다 넣어도 괜찮을 것 같았다.

그래서 한 번에 다 넣어보자.

public class UIIntroScene : UIBaseScene
{
    public override string SceneName => "IntroScene";

    [SerializeField] private TextMeshProUGUI tmp_Title;
    [SerializeField] private TextMeshProUGUI tmp_TouchToPlay;
    [SerializeField] private Button Btn_play;
    [SerializeField] private float blinkSpeed = 0.7f;

    protected override void Init()
    {
        base.Init();
        Btn_play.onClick.AddListener(OnClickPlay);
        StartCoroutine(BlinkTouchTmp());
    }

    private void OnClickPlay()
    {
        SceneManager.LoadScene("LobbyScene");
    }
    
    private IEnumerator BlinkTouchTmp()
    {
        while (true)
        {
            tmp_TouchToPlay.alpha = tmp_TouchToPlay.alpha == 1 ? 0 : 1;
            yield return new WaitForSeconds(blinkSpeed);
        }
    }
}

초기화에 버튼 이벤트 등록과 깜빡거리는 텍스트를 코루틴으로 구성하였다.

자 이제 이 인트로 씬의 기본이 되는 UI인 UIIntroScene 생성해주는 스크립트를 짜보자.

public class SceneUIManager : MonoBehaviour
{
    [SerializeField] private Transform uiRoot;

    private void Start()
    {
        string sceneName = SceneManager.GetActiveScene().name;
        GameObject uiPrefab = Resources.Load<GameObject>($"UI/UI_{sceneName}");

        if (uiPrefab != null)
        {
            GameObject uiInstance = Instantiate(uiPrefab, uiRoot);
            uiInstance.name = uiPrefab.name;
        }
        else
        {
            Debug.LogError($"Can't find UI Prefab {sceneName}");
        }
    }
}

간단하게 root로 위치를 받아주고, base에서 상속받도록한 씬의 이름으로 로드하여 root에 Resource.Load를 이용해 생성해주었다.

일단 인트로 씬은 간단히 마무리하고 나중에 디자인 바꾸며 더 수정해보도록 하자.

profile
게임 클라이언트 개발자 / 게임 QA

0개의 댓글