오늘부터 새로운 프로젝트를 시작해보려고 한다.
기간을 가능한 짧게 가져가려고 하고 이번에 플레이 스토어 출시를 목표로 도전해볼 예정이다.
먼저 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를 이용해 생성해주었다.
일단 인트로 씬은 간단히 마무리하고 나중에 디자인 바꾸며 더 수정해보도록 하자.