오늘 배운것
https://unity.com/kr/resources/level-up-your-code-with-game-programming-patterns
유니티 공식 문서를 참고
오브젝트 안에 세개의 자식이 있음.
거리에 따라 정밀하게 보이냐, 안보이냐 구분 가능
StateMachine

using UnityEngine; public interface IState { public void Enter(); public void Exit(); public void Execute(); }using System; using System.ComponentModel.Design.Serialization; using Unity.IO.LowLevel.Unsafe; using UnityEngine; // 상태패턴을 적용하는 클래스 public class StateMachine { public IState CurrentState { get; private set; } PlayerController player; // 상태패턴, 다양한 상태를 정의 public IdleState idleState; public RunState runState; public AttackState attackState; public SpinState spinState; public DeadState deadState; //옵저버 패턴, 상태 변경 시 알림을 위한 이벤트 public event Action<IState> stateChanged; // Action<IStat>파라미터로IState타입을 건네주는 event public StateMachine(PlayerController player) { this.player = player; // 상태 패턴, 각 상태를 개별적으로 초기화 idleState = new IdleState(player); runState = new RunState(player); attackState = new AttackState(player); deadState = new DeadState(player); spinState = new SpinState(player); } // 초기 상태 설정 public void Initialize(IState state) { CurrentState = state; state.Enter(); // 옵저버 패턴, 초기 상태 설정 시 옵저버(StateDisplayer)에게 알림 stateChanged?.Invoke(state); } // 상태 전환 메서드 public void TransitionTo(IState nextState) { //상태 패턴, 현재 상태 종료 및 새로운 상태로 전환 CurrentState.Exit(); CurrentState = nextState; CurrentState.Enter(); // 옵저버 패턴, 상태 변경시 옵저버(StateDisplayer)에게 알림 stateChanged?.Invoke(CurrentState); // stateChanged가 null이 아닐 때만, Inovke()호출 } public void Execute() { CurrentState.Execute(); } }
Observer Pattern

유니티, C# 에서의 델리게이트와 같다. 델리게이트가 곧 이 옵저버 패턴인 것이다. 델리게이트 사용하면 옵저버 객체들을 리스트로 관리할 필요가 없다
상태머신과 옵저버 패턴은 스크립트에 주석을 달았음.
<옵저버 패턴> using TMPro; using UnityEngine; public class StateDisplayer : MonoBehaviour { public TextMeshPro stateLabel; PlayerController player; private void Awake() { player = GetComponent<PlayerController>(); } private void OnEnable() { // 옵저버 패턴, 상태가 변경되면 옵저버에 현재 상태 전달 player.stateMachine.stateChanged += OnStateChanged; } private void OnDisable() { // 옵저버 패턴, 상태변경 옵저버 해제 player.stateMachine.stateChanged -= OnStateChanged; } // 옵저버패턴, 상태변경시 호출되는 메서드 void OnStateChanged(IState state) { // 현재 상태 이름을 UI에 표시 stateLabel.text = state.GetType().Name; } }using TMPro; using UnityEngine; public class StateDisplayer : MonoBehaviour { public TextMeshPro stateLabel; PlayerController player; private void Awake() { player = GetComponent<PlayerController>(); } private void OnEnable() { // 옵저버 패턴, 상태가 변경되면 옵저버에 현재 상태 전달 player.stateMachine.stateChanged += OnStateChanged; } private void OnDisable() { // 옵저버 패턴, 상태변경 옵저버 해제 player.stateMachine.stateChanged -= OnStateChanged; } // 옵저버패턴, 상태변경시 호출되는 메서드 void OnStateChanged(IState state) { // 현재 상태 이름을 UI에 표시 stateLabel.text = state.GetType().Name; } }
프로젝트로 디자인패턴을 공부하니 기존에 이론을 알고 있었지만, 그 이론이 체감이 되니 이해가 빠르게 되는 느낌이다.