유니티 일기

탑다운 2D RPG - 대화창 UI 구축하기

mky 2025. 8. 30. 23:47

골드메탈님의 유튜브 강의를 보고 배운 걸 정리하였습니다.

 

1. 대화창 UI

- 길이를 변형시켜도 이미지가 깨지지 않게하기 위해서 이미지 타입을 Sliced로 변경

-> Sliced 옵션을 사용하려면 Sprite 설정이 필요 -> Sprite 모서리를 잡기 위해 스프라이트 에디터에서 Border값 입력

 

- Anchor를 사용하여 항상 아래쪽에 붙어있게 설정

  - Shift를 사용하여 중심점까지 내리면 여백 계산이 쉬워짐

 

-판넬 이미지 안에 텍스트 생성

 

2. 데이터 전달

- 데이터 전달을 위한 게임매니저 생성

using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    public Text talkText;
    public GameObject scanObject;
    public static GameManager instance = null;
    void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
    }

    public void Action(GameObject scanObj)
    {
        scanObject = scanObj;
        talkText.text = "이것의 이름은 " + scanObject.name + "이라고 한다.";
    }

}
// Scan Object
if(Input.GetButtonDown("Jump") && scanObject != null) 
    //Debug.Log("this is : " + scanObject.name);
    GameManager.instance.Action(scanObject);

- UI 프로그래밍 전에 꼭 먼저 UnityEngine.UI 넣기

- 인스펙터 창에서 public 변수 잊지 말고 채우기

 

3. 상태 전환

- SetActive()함수로 숨기기 & 보여주기를 구현

- 상태 저장용 변수를 추가

- 대화할 때, 플레이어가 움직여서 이탈할 우려가 있음 -> 상태 변수를 사용하여 플레이어 이동을 제한

using TMPro;
using UnityEngine;
using UnityEngine.UI;


public class GameManager : MonoBehaviour
{
    public GameObject talkPanel;
    public TextMeshProUGUI talkText;
    public GameObject scanObject;
    public bool isAction; // 상호작용 중인지 아닌지 판단

    public static GameManager instance = null;
    void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
    }

    public void Action(GameObject scanObj)
    {
        if (isAction) // Enter Action
        {
            isAction = false;
        }
        else
        {
            isAction = true;
            scanObject = scanObj;
            talkText.text = "이것의 이름은 " + scanObject.name + "이라고 한다.";
        }

        talkPanel.SetActive(isAction);
    }

}
// Check Button Down or Up
bool hDown = GameManager.instance.isAction ? false : Input.GetButtonDown("Horizontal");
bool vDown = GameManager.instance.isAction ? false : Input.GetButtonDown("Vertical");
bool hUp = GameManager.instance.isAction ? false : Input.GetButtonUp("Horizontal");
bool vUp = GameManager.instance.isAction ? false : Input.GetButtonUp("Vertical");
// Scan Object & Action
if (Input.GetButtonDown("Jump") && scanObject != null) 
    //Debug.Log("this is : " + scanObject.name);
    GameManager.instance.Action(scanObject);

 

4. UI 애니메이션

- UI 이미지 안에 UI 이미지 생성

- UI도 애니메이션 적용 가능

- 애니메이션 적용된 오브젝트를 선택하면 애니메이션 편집 가능

  - Add Property에서 Anchored Position 선택 (Anchor가 적용된 UI는 Anchored Position 선택)

  - 3개 키프레임 중에서 가운데만 Y값을 변경

- 반복성 애니메이션은 파일을 클릭해서 Loop Time 체크