상태 머신
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 29번째.
Beacon의 SetState 메서드는 상태가 있는 모든 객체에서 동일하게 작성될 것입니다. 포탑, 적, 문이 그렇습니다. 이 코드는 현재 상태를 보관하고 상태를 바꾸는 상태 머신이라는 별도의 클래스에 둘 수 있습니다. 각 객체는 코드를 반복하는 대신 상태 머신 하나를 만들고 호출합니다:
public class StateMachine
{
public IState Current { get; private set; }
public void ChangeState(IState next)
{
Current?.Exit();
Current = next;
Current.Enter();
}
public void Tick()
{
Current?.Tick();
}
}
public class Beacon : MonoBehaviour
{
public Renderer lamp;
private StateMachine machine = new StateMachine();
private IState blink;
private IState steady;
void Start()
{
blink = new BlinkState(lamp);
steady = new SteadyState();
machine.ChangeState(steady);
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame) machine.ChangeState(machine.Current == steady ? blink : steady);
machine.Tick();
}
}첫 번째 ChangeState에서는 떠날 상태가 없습니다. Current는 null이고, ?.는 Exit 호출을 건너뜁니다. 섹션 1에서 ?.가 Unity의 가짜 null을 놓친다고 경고했습니다. 이는 파괴된 Unity 객체에 관한 내용이며, 상태는 일반 C# 객체이므로 여기서는 ?.를 안전하게 사용할 수 있습니다. Current에는 private set이 적용되어 있으므로, 어떤 스크립트도 ChangeState와 그 안의 Exit 및 Enter를 거치지 않고 상태를 바꿀 수 없습니다.
두 상태가 같은 것을 건드릴 때는 ChangeState 내부의 순서가 중요합니다. Exit가 이전 상태에서 바꾼 것을 되돌린 다음, Enter가 새 상태를 설정하므로 새 상태가 마지막으로 적용됩니다. DarkState의 Enter가 램프를 끄고 BlinkState의 Exit보다 먼저 실행됐다면, 그 Exit가 램프를 다시 켜서 어두운 상태가 되었을 것입니다. StateMachine도 일반 클래스입니다. 비컨, 포탑, 적은 각각 new를 사용해 자신만의 상태 머신을 만들고 Update에서 해당 머신의 Tick을 호출합니다.
챌린지
중급살금살금 이동하려면 Space를 누르고 있으세요. PlayerStates.cs에 WalkState와 SneakState가 준비되어 있습니다. 각 상태의 Enter와 Exit는 어떤 일이 일어나는지 기록하고(Walk: enter, Sneak: exit...), Tick은 플레이어의 Move()를 호출합니다. 이 상태들을 실행하는 머신을 작성하세요.
StateMachine.cs에 일반 클래스StateMachine을 작성하세요. 머신만 설정할 수 있는 publicCurrent속성과, 이전 상태의 Exit를 실행한 다음 새 상태의 Enter를 실행하는ChangeState(IState next)메서드, 현재 상태의 Tick을 실행하는Tick()메서드를 만드세요.- 플레이어는 매 프레임 자신의 상태를 요청하므로, 현재 상태와 이미 같은 상태를 전달받은
ChangeState는 아무 작업도 하지 않습니다. Exit와 Enter를 호출하지 않습니다. Player.cs에machine이라는 이름의StateMachine필드를 추가하세요. Start에서 머신과 두 상태를 만들고(각 상태에는 플레이어를 전달), 걷기를 시작하세요. Update에서는 Space를 누르고 있는 동안 살금살금 이동하는 상태로, 그렇지 않으면 걷는 상태로 전환한 다음 머신의 Tick을 호출하세요.
Play를 누르고, 걸어 보세요. Space를 누른 채 계속 걸은 다음 Check를 누르세요.
직접 해보기
// StateMachine: Current, ChangeState 및 Tick
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.