Menu
CoddyTech

상태 머신

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 37번째.

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을 호출합니다.

challenge icon

챌린지

중급

상태 머신으로 플레이어의 상태를 실행하세요.

  1. StateMachine.cs에서 public class StateMachine과 public IState Current { get; private set; }를 작성하고, 현재 상태를 틱하는 Tick()을 작성하세요.
  2. ChangeState(IState next)는 현재 상태와 같으면 아무 작업도 하지 않습니다. 그렇지 않으면 Exit를 호출하고, Current를 설정한 다음 Enter를 호출합니다.
  3. Player: Start에서 machine, walk, sneak을 만들고 걷기 상태로 전환합니다. Update에서는 스페이스 키를 누르고 있는 동안 몰래 걷고, 그렇지 않으면 걷도록 한 다음 틱합니다.

‘플레이’를 누르고 스페이스 키를 길게 누르세요: Sneak: enter. 그런 다음 ‘확인’을 누르세요.

직접 해보기

// StateMachine: Current, ChangeState 및 Tick

Unity 게임 아키텍처의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드