상태 패턴은 게임 개발에서 유용하게 사용되는 디자인 패턴이다
어떤 객체가 상태에 따라 행위를 다르게 할 때, 상태를 if문 같은 조건문으로 직접 체크해 상태에 따른 행동을 호출하는 것이 아니라 상태를 객체화해서 필요에 따라 다르게 행동하도록 위임하는 패턴이다
객체의 특정 상태를 클래스로 선언하고 클래스에서 해당 상태에서 할 수 있는 행동을 메서드로 정의한다

namespace StatePattern
{
public interface IState
{
void Study();
}
}
public class Sleep : IState
{
public void Study()
{
Debug.Log("졸려서 공부가 안됩니다");
}
}
public class Fine : IState
{
public void Study()
{
Debug.Log("멀쩡하게 공부합니다");
}
}
상태의 인터페이스를 선언하고 이를 상속받는 상태(Fine, Sleep)를 생성한다
학생 클래스를 만들어 상태 정보를 저장하게 하자
public class Student
{
/// <summary>
/// 학생의 현재 상태
/// </summary>
private IState state;
public int health = 100;
public Student()
{
SetState();
}
public void SetState()
{
if (health < 30)
state = new Sleep();
else
state = new Fine();
}
public void Study()
{
SetState();
state.Study();
}
}
학생의 체력을 뜻하는 health 값에 따라 SetState에서 상태 값을 결정한다.
학생의 Study 함수를 실행하면 먼저 현재 체력에 따라 어떤 상태인지 결정한 후 state의 Study를 실행해 멀쩡하면 Fine의 Study가, 졸리면 Sleep의 Study가 실행된다
이 학생을 관리하는 클래스인 School을 보자
public class School : MonoBehaviour
{
private void Start()
{
Student student = new Student();
student.Study();
student.health = 20;
student.Study();
}
}
학생 클래스를 만들어 학생이 공부를 하게 한 다음 임의로 학생의 체력을 깎고 공부를 시켜보자
게임을 실행하면 로그가 다음과 같이 뜬다

효율적으로 쓰려면 Student에서 체력에 맞게 알아서 상태가 변경되면 좋을 것 같음
이렇게 간단하게 상태 패턴을 알아보았다