08/25 디자인 패턴 실습 - State Machine, Command 패턴

댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.

댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
상태 패턴
상태 패턴(State Pattern)은 캐릭터가 현재 어떤 상태에 있는지에 따라 행동을 구분해서 관리하는 방식입니다. 처음에는 Update 안에서 키 입력과 상태 변경을 모두 처리해도 됩니다. 하지만 이동, 점프, 공격, 피격, 사망, 스킬이 붙으면 조건문이 빠르게 복잡해집니다. 예를 들어 공격 중에는 이동을 막아야 하는지, 피격 중에는 점프가 가능한지처럼 상태마다 가능한 행동을 계속 조건문으로 검사하게 되면 코드가 길어지고 수정하기도 어려워집니다. 상태 패턴을 사용하면 이동, 점프, 공격 같은 각각의 상태에 필요한 동작을 분리해서 관리할 수 있기 때문에 조건문을 줄일 수 있고, 새로운 상태가 추가되더라도 기존 코드를 크게 수정하지 않아도 되어 유지보수와 확장이 쉬워집니다.
StateMachine과 IState
IState는 각 상태가 공통으로 가져야 할 동작을 정의한 규칙(계약) 입니다. 하나의 상태는 시작될 때 Enter(), 유지되는 동안 매 프레임 Tick(), 종료될 때 Exit()를 실행합니다. 예를 들어 공격 상태라면 Enter()에서 공격 애니메이션을 시작하고 이동을 잠그고, Tick()에서 공격 시간을 계산하며, Exit()에서 이동 잠금을 해제할 수 있습니다. 이렇게 상태마다 시작·진행·종료 시 해야 할 일을 같은 구조로 만들 수 있습니다.
public interface IState
{
void Enter();
void Tick();
void Exit();
}
StateMachine은 여러 상태 중 현재 어떤 상태가 실행되고 있는지를 관리하고 상태 전환을 담당하는 객체입니다. ChangeState()가 호출되면 기존 상태의 Exit()를 실행한 뒤 현재 상태를 새로운 상태로 변경하고, 새 상태의 Enter()를 호출합니다. 이후 Tick()을 통해 현재 상태의 Tick()을 매 프레임 실행합니다. 즉, IState가 각 상태가 어떻게 동작할지에 대한 규칙이라면, StateMachine은 현재 상태를 보관하고 상태 전환과 실행 순서를 관리하는 역할을 합니다.
public class AttackState : IState
{
public void Enter()
{
Debug.Log("공격 시작");
}
public void Tick()
{
Debug.Log("공격 중");
}
public void Exit()
{
Debug.Log("공격 종료");
}
}
모델(외형)과 게임 동작을 담당하는 본체 오브젝트의 분리

Player와 Monster의 실제 모델을 루트 오브젝트에 바로 넣지 않고 GFX라는 하위 오브젝트 아래에 분리해두면, 게임 로직과 외형을 서로 독립적으로 관리할 수 있습니다.
이동, 공격, 체력, 상태 처리 같은 기능은 Player나 Monster 루트에 그대로 유지하고, 보이는 모델만 GFX 아래에 배치하는 방식입니다.
렇게 구성하면 나중에 새로운 몬스터를 만들 때 기존 몬스터의 기능과 구조를 그대로 재사용하면서 GFX 아래의 모델만 다른 모델로 교체할 수 있기 때문에 프리팹을 새로 설계하는 작업이 줄어들고, 캐릭터 외형을 변경하거나 다양한 몬스터를 확장하기도 쉬워집니다.

우리들의 게임 발매 이야기

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다
