게임의 시각적인 정보를 사용자에게 제공하는 인터페이스다
// <Event System>
// 키보드, 마우스, 터치, 등을 게임오브젝트에 이벤트를 전송하는 방법
// Event System이 씬에 없는 경우 UI가 반응하지 않으니 주의



UI 요소들을 가지고 있는 UI 구성틀
모든 UI는 캔버스 위에서 표현된다
위치가 겹칠 경우 나중에 그려지는 UI 요소가 이전 UI 요소를 덮어씀 (해당 문제는 SortGroup을 통해 해결한다)

UI위치를 수정하려면 canvase를 더블 클릭하면 된다

그리고 씬 창에서 2D 모드로 바꿔준다

UI 편집은 게임의 상황과 무관하다 버튼이 게임 화면을 가린것처럼 씬 창에서 보여도, 실제로 게임에서는 영향이 없다


오버레이가 많이 쓰인다
캔버스 내 UI 요소의 전체적인 크기와 비율을 제어한다

Graphic Raycaster레이캐스트 기능을 사용해서 마우스 클릭을 인식한다.
캔버스, 이벤트 시스템 게임 오브젝트가 필수로 포함된다
버튼에 화살표가 생기는 것을 볼 수있는데

여기서 비주얼라이즈 버튼이 활성화 되어 있으면 보이는거다

인풋 매니저에서 편집 가능하다


Alt를 누르면서 하면 UI 위치도 같이 변한다





Font Asset 에서 직접 폰트를 넣어줘야 한다


Lazy Initialization 처럼 UI를 처음 만들 때 생성 되는 것도 비슷하다// 텍스트매니저 프로를 사용한다
using TMPro;
using UnityEngine;
// UI 를 추가
using UnityEngine.UI;
public class ScoreUI : MonoBehaviour
{
// 버튼 컴포넌트
//[SerializeField] Button button;
// 스크롤바 컴포넌트
//[SerializeField] Scrollbar hpbar;
// 토글 컴포넌트
//[SerializeField] Toggle toggle;
// 텍스트 컴포넌트
// [SerializeField] Text text;
// 텍스트는 레거시라서 쓰지 않는다
// TMP_Text 클래스를 쓴다
[SerializeField] TMP_Text textUI;
//private void Update()
//{
// // 스코어를 스트링으로 바꾼다
// // 업데이트마다 스트링을 불러와 확인하는 것은 효율적이지 않다
// // 이벤트를 사용해야 한다
// textUI.text = PracticeSingleton.Instance.score.ToString();
//}
private void Update()
{
// 싱글톤에 저장되는 스코어를 스트링으로 바꿔서 저장한다
textUI.text = $"Score : {PracticeSingleton.Instance.score.ToString()}";
}
}
옵저버 패턴(이벤트)을 이용한다스코어에 변동이 있을 때만 스코어를 갱신하도록 해보자. MVC 패턴으로 구현한다
MVC 패턴에서 M에 해당한다public event Action<int> OnScoreChanged;
private int score;
public int Score { get { return score; } set { score = value; OnScoreChanged?.Invoke(score); } }
public int maxScore;
public void GetScore(int score)
{
Score += score;
if(Score> maxScore)
{
maxScore = this.score;
}
}
MVC 패턴에서 C에 해당한다private void OnEnable()
{
SetScore(PracticeSingleton.Instance.Score);
PracticeSingleton.Instance.OnScoreChanged += SetScore;
}
private void OnDisable()
{
PracticeSingleton.Instance.OnScoreChanged -= SetScore;
}
private void SetScore(int score)
{
textUI.text = score.ToString();
}
이벤트에 점수 표기 함수(SetScore)를 추가한다. 이렇게 하면 업데이트마다 최신화 하는게 아니라, 점수가 바뀔 때마다 최신화 된다
MVC 패턴에서 V에 해당한다
Model : 데이터(변수 함수 등), View : 사용자 인터페이스(UI,View), Controller : 로직(분리된 View와 Model을 관리하기 위한 알고리즘)을 분리하여 프로그램을 관리하는 패턴논리 로직을 처리설계패턴 중에서 구현이 간단함Model과 View 둘이 의존성을 갖지 않도록 주의한다MVP(Model-View-Presenter)MVVM(Model-View-ViewModel)using UnityEngine;
using UnityEngine.Events;
namespace DesignPattern
{
public class Model
{
private int data;
public int Data
{
set
{
Debug.Log("[Model] Change data");
data = value;
OnDataChanged?.Invoke(value);
}
get
{
return data;
}
}
public UnityAction<int> OnDataChanged;
}
public class View
{
public Controller controller;
public void UpdateData(int data)
{
Debug.Log("[View] Update data");
}
public void Input()
{
Debug.Log("[View] Input");
controller.Logic();
}
}
public class Controller
{
public Model model;
public void Logic()
{
Debug.Log("[Controller] Logic");
model.Data += 1;
}
}
public class MVCTester
{
public void Test()
{
Model model = new Model();
View view = new View();
Controller controller = new Controller();
view.controller = controller;
controller.model = model;
model.OnDataChanged += view.UpdateData;
view.Input();
// 1. [View] Input
// 2. [Controller] Logic
// 3. [Model] Change data
// 4. [View] Update data
}
}
}