TIL

25.04.08 TIL

gaon99 2025. 4. 8. 21:08

최종 프로젝트 3일차

 

1. 오늘 학습 키워드

StartUI


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

BaseUI와 ControllerUI의 부모 스크립트를 제작하여, 이를 상속받는 방식으로 작업을 해보았다.

 

우선 각 UI들의 토대인 부모 스크립트다. 이 부분은 처음 해보는 방식이라 많이 서투르지만,

 

핵심은 이 부모를 상속받고, BaseUI을 상속받은 스크립트가 동작을 메서드로 구현하게 되고

Controller를 상속받는 스크립트는 패널의 흐름? 을 제작하는 느낌이다.

using System.Collections.Generic;
using UnityEngine;

public class ControllerUI : MonoBehaviour
{
   protected List<BaseUI> allUIs = new();

   public virtual void InitAllUIs()
   {
      foreach (var ui in allUIs)
      {
         ui.Initialize();
      }
   }

   public virtual void ShowUI(BaseUI targetUI)
   {
      foreach (var ui in allUIs)
      {
         ui.Hide();
      }
      targetUI.Show();
   }
   protected virtual void Start()
   {
      InitAllUIs();
   }
}

public class BaseUI : MonoBehaviour
{
  public virtual void Initialize() { }

  public virtual void Show()
  {
    gameObject.SetActive(true);
    OnShow();
  }

  public virtual void Hide()
  {
    OnHide();
    gameObject.SetActive(false);
  }
  protected virtual void OnShow() { }
  protected virtual void OnHide() { }
}

 

오늘 작성한 스타트 UI를 보면, 이렇게 작성하는게 맞는지 확신은 없다만, 어떤 오브젝트를 사용하는지, 

그리고 텍스트에 대한 메서드를 이 StartUI에 작성을 했다.

그리고 Initialize를 통해 초기화 해야할 부분을 작성해주었다.

버튼은 현재 어떤식으로 구현할 지 생각만 해둔 것을 적어만 두었다. 그래서 아직 오류가 있어서 주석 처리를 해 두었고,

코루틴을 사용해서 글씨를 한 글자씩 출력이 되도록 하였고, 만약 \n을 만났을 경우 입력이 있을 경우 다음으로 넘어가도록 작성했다.

using System.Collections;
using System.Collections.Generic;
using System.Text;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class StartUI : BaseUI
{
    [Header("Panel")] [SerializeField] private GameObject titlePanel;
    [SerializeField] private GameObject descPanel;
    [SerializeField] public GameObject selectPanel;

    [Header("Desc")] [SerializeField] private TextMeshProUGUI descText;

    private Dictionary<string, Button> buttons = new();
    public bool isFirst=true;
    
    public override void Initialize()
    {
        buttons.Clear();
        isFirst = PlayerPrefs.GetInt("Confirm") == 0;
        // InitButtons();
    }

    private void InitButtons()
    {
        buttons.Add("start", buttons["start"]);
        buttons.Add("stage", buttons["stage"]);
        buttons.Add("game", buttons["game"]);
    }

    public void InitTitlePanel()
    {
        titlePanel.SetActive(true);
        selectPanel.SetActive(false);
        descPanel.SetActive(false);
    }
    public void Desc()
    {
        titlePanel.SetActive(false);
        descPanel.SetActive(true);
        StartCoroutine(TextTextEffect("테스트로 작성하는 스트링입니다\n 짧으면 효과를 보기 힘드니 \n아무 말이나 잠시 적겠습니다."));
        PlayerPrefs.SetInt("Confirm", 1);
    }

    public void Selection()
    {
        titlePanel.SetActive(false);    
        descPanel.SetActive(false);
        selectPanel.SetActive(true);
        Debug.Log(PlayerPrefs.GetInt("Confirm"));
    }

    public void Test()
    {
        PlayerPrefs.SetInt("Confirm", 0);
    }
    IEnumerator TextTextEffect(string text)
    {
        descText.text = string.Empty;

        StringBuilder stringBuilder = new();

        for (int i = 0; i < text.Length; i++)
        {
            char currentChar = text[i];

            if (currentChar == '\n') // 줄바꿈을 만났을 경우, 입력 대기
            {
                stringBuilder.Append(currentChar);
                descText.text = stringBuilder.ToString();

                yield return new WaitUntil(() => Input.anyKeyDown);

            }
            else
            {
                stringBuilder.Append(text[i]);
                descText.text = stringBuilder.ToString();
                yield return new WaitForSeconds(0.05f);
            }
        }
        yield return new WaitUntil(() => Input.anyKeyDown);
        Selection();
    }
}

 

마지막으로 컨트롤러를 작성했다. 이 부분도 코루틴을 통해, 타이틀에서 입력을 받아 다음 패널로 이동하도록 제작했다.

using System.Collections;
using Unity.VisualScripting;
using UnityEditor;
using UnityEngine;

public class StartController : ControllerUI
{
    public StartUI startUI;

    public override void ShowUI(BaseUI targetUI)
    {
        base.ShowUI(targetUI);
    }

    protected override void Start()
    {
        allUIs.Add(startUI);
        base.Start();
        startUI.InitTitlePanel();
        StartCoroutine(WaitForInput());
    }
    IEnumerator WaitForInput()
    {
        yield return new WaitUntil(() => Input.anyKeyDown);
        if (startUI.isFirst)
        {
            startUI.Desc();
        }
        else
        {
            startUI.Selection();
        }
    }
}

3. 학습하며 겪었던 문제점 & 에러

 

내가 생각한 흐름은 초회일 경우 타이틀에서 클릭을 하면 설명 패널이 나오고, 설명 패널에서 글이 다 출력이 되고나서 클릭이 있을 시에,

이제 선택창으로 넘어가는 그런 느낌을 생각했는데, 초회든 아니든 선택 패널로 스킵이 되었다.

 

오류를 수정하기 위해서 Desc()를 코루틴으로 변환도 시켜보았지만 되질 않았고, 디버그를 찍어보고 싶었지만, 무슨 오류가 있었는지,

중단점이 빨간 점으로 되어야하는데, 금지 표시로 변해있었다. 그래서 컴퓨터 재부팅도 해보고, 오류가 기억이 안나지만, 디버깅시에 오류가 뜨길래 그 부분을 스킵했더니, 유니티에서 파란색 버그로 변해있었다.

 

디버깅을 하며 아 이게 인풋이 중첩이 되는건가? 하는 생각도 했어서, 인풋을 anyKeyDown에서 다른 인풋으로 변경도 해보았지만 여전했었다.

그러면 글자가 타이핑이 되는 코루틴에 문제가 있다고 생각하고 코드를 살펴보니,

 

글자가 생성이 다 되고 나서 키 입력받는 코드가 누락이 되어있었다.

그래서 내가 인지하기도전에 다음 패널로 넘어갔던 것 같다.

 

이를 수정해주니 내가 원하는 대로 해결이 되었다.


4. 내일 학습 할 것은 무엇인지

 

스타트 씬 UI작업을 마무리하고, 라이브 2d를 좀 넣어보려고한다

'TIL' 카테고리의 다른 글

25.04.10 TIL  (0) 2025.04.10
25.04.09 TIL  (0) 2025.04.09
25.04.07 TIL  (0) 2025.04.07
25.04.04 TIL  (0) 2025.04.04
25.03.28 TIL  (0) 2025.03.28