[UNITY]유니티 TIPS::상태로 로직을 구성하는 State 패턴 | 프로그래밍 디자인패턴, 요약정리

https://www.youtube.com/watch?v=uFKd7JbI5QY&list=PL412Ym60h6uufFJlxsKcYkOtRu-PIsLuA&index=2

이 영상은 유니티에서 사용되는 스테이트 패턴의 이해를 돕기 위한 강의입니다. 스테이트 패턴은 객체의 내부 상태에 따라 스스로 행동을 변화시키는 기법으로, 특히 게임 개발에서 캐릭터 애니메이션을 제어하는 데 자주 사용됩니다. 강의에서는 FSM(유한 상태 기계) 구조를 바탕으로 상태 전환의 구현 방법과 그 중요성을 설명합니다. 이러한 디자인 패턴을 적용하면 유연한 시스템 설계와 함께 유지보수성을 크게 향상시킬 수 있습니다. 상태 패턴을 통해 복잡성을 줄이고 각 상태를 명시적으로 캡슐화하는 차원에서 유용한 정보를 제공합니다.

🎮 유니티의 스테이트 패턴 활용 이해하기

  • 유니티를 이용하면 이미 다양한 디자인 패턴을 사용하고 있는 것이며, 그 중 스테이트 패턴도 포함된다.

  • 메카님 시스템을 통해 애니메이션 상태 전이를 다이어그램으로 확인할 수 있으며, 이는 스테이트 패턴에 기반을 둔 FSM의 한 예이다.

  • 게임 개발에서는 애니메이션NPC 제어를 위해 스테이트 패턴이 주요하게 사용되며, 유니티는 이를 시스템적으로 구현해 두었다.

  • 스테이트 패턴은 다양한 오브젝트의 상태를 제어하므로, 유연한 시스템 설계와 복잡성 감소에 기여한다.

 

🎮 스테이트 패턴 데모 및 개요

  • 스테이트 패턴은 객체의 내부 상태에 따라 행동을 변화시키는 디자인 패턴으로, 캐릭터 애니메이션과 다양한 상태에서 활용된다.

  • 이 데모는 강의에서 제공된 간단한 예제로, 캐릭터가 세 가지 상태(워크, 점프 등)로 전환되는 모습을 보여준다.

  • 유니티 스퀘어 웹사이트에서 데모 및 이북 자료를 제공하며, 필요한 자료를 다운로드할 수 있다.

  • 스테이트 패턴은 캐릭터 애니메이션 외에도 네트워크 상태 등 다양한 분야에 적용될 수 있다.

 

🛠️ 스테이트 패턴의 유연성과 유지보수성

  • 스테이트 패턴을 사용하는 장점은 각 상태를 클래스별로 분리하여 로직을 캡슐화하고 전환을 유연하게 처리할 수 있다는 것이다.

  • 상태가 추가될 때마다 클래스가 늘어나는 경향이 있어 복잡성이 증가할 수 있으나, 이를 통해 가독성과 유지보수성이 향상된다.

  • 디자인 패턴 적용이 항상 필요한 것은 아니며, 필요에 따른 선택적 적용이 중요하다.

  • 스테이트 패턴은 프로젝트의 규모에 따라 적용 여부를 결정할 수 있는 유용한 도구다.

 

🎮 FSM을 활용한 스테이트 패턴 이해

  • 스테이트 패턴은 FSM(Finite State Machine)을 통해 시스템화된 방식으로 사용되며, 이는 유한 상태 기계라고도 불린다.

  • 캐릭터의 여러 상태(예: 스탠딩, 점프, 워킹) 간의 전환은 특정 조건에 따라 이루어지며, 이는 상태 전환 이벤트와 상태 유지 관리에 필수적이다.

  • 코드를 간단히 유지하는 대신, 스테이트 인터페이스를 활용하여 명확하고 확장 가능한 상태 관리를 제공하는 것이 중요하다.

  • AI 로직에서도 FSM을 활용할 수 있으며, 예를 들어 몬스터의 AI는 상태에 따라 힐링, 패트롤, 어택, 도망가는 행동을 관리할 수 있다.

 

 FSM(유한 상태 기계)의 개념과 활용

  • 스테이트 패턴은 FSM(Finite State Machine)의 형태로 게임에 적용되며, 특정 시스템화를 통해 상태 전이를 관리한다.

  • 다양한 상태가 존재하며, 대표적으로 스탠딩, 걷기, 점프가 있다. 예를 들어 스탠딩 상태에서 걷기로 전환하는 등의 이벤트가 발생한다.

  • FSM을 구현할 때는 상태, 전환, 이벤트, 동작의 네 가지 요소를 포함하여 구성한다.

  • 기본적인 FSM 구조는 복잡한 기능 추가시 확장성이 떨어져 다른 디자인 패턴이나 인터페이스를 활용하여 보다 효율적으로 설계해야 한다.

 

스테이트 패턴의 구현 및 전환 조건

  • 스테이트 패턴은 특정 상황에 따라 캐릭터의 상태를 변경하며, 각 상태에 대한 전환 조건을 설정하는 데 유용하다.

  • 상태 전환의 예시로, 캐릭터가 지면에 있을 때점프할 때 상태를 변경하며, 이동을 시작하면 워크 상태로 전환된다.

  • 각각의 상태에 대해 별도의 조건 클래스를 만들어 유지보수의 용이성을 높일 수 있다.

  • 유니티의 스테이트 머신은 각 상태를 통합 관리하고, 현재 상태를 업데이트하는 역할을 담당한다.

 

몬스터 AI의 상태 기반 구현 예시

  • 게임에서 몬스터의 AI를 구현할 때는 FSM(유한 상태 기계)을 활용하여 상태를 관리한다는 점이 중요하다.

  • 몬스터의 상태는 네 가지로 구분되며, 힐링, 패트롤, 어택, 도망가는 등의 행동을 취할 수 있다.

  • 플레이어의 피가 적어지면 몬스터는 도망가서 힐링하고, 이후 순찰을 시작하며, 플레이어와의 접촉 시 공격하는 등 상황에 따라 상태를 변경한다.

  • 이를 통해 몬스터 AI는 복잡한 행동 패턴을 효과적으로 표현할 수 있으며, 예시로는 레이드 게임 AI의 구현이 있다.

 

스테이트 머신 비헤이비어의 활용

  • 유니티 프로젝트에서는 스테이트 머신 비헤이비어가 여러 애니메이터 상태에 부착되어 있어 이를 통해 상태 간 전환을 관리한다.

  • 스크립터블 오브젝트를 통해 상태를 구체화하고, 이러한 구조는 유지보수성과 확장성을 크게 향상시킨다.

  • 상태에 따라 각기 다른 클래스를 개별적으로 만들어, 캐릭터의 행동(추적, 공격 등)을 구분하고 이를 쉽게 수정 가능하게 한다.

  • 최종적으로 각 상태가 갖는 로직을 통해 더 유연하고 자연스러운 캐릭터 행동을 구현할 수 있으며, 이는 프로젝트의 품질을 높인다.

 

상태 패턴의 장점과 확장성

  • 상태를 추가해야 할 경우, 기존 코드를 수정하지 않고도 새로운 상태를 쉽게 추가할 수 있다.

  • 디자인 패턴은 개발 초기에는 다소 복잡하게 느껴지지만, 확장성과 유지보수에 있어 큰 장점을 제공한다.

  • 대부분의 디자인 패턴이 그러한 특성을 가지므로, 확장성을 고려해 접근할 필요가 있다.

 

📝 스테이트 패턴의 특징과 장단점

  • 스테이트 패턴은 객체의 내부 상태에 따라 행동을 변화시키고, 상태별로 클래스를 캡슐화하여 유지보수성과 확장성을 높인다.

  • 다양한 상황에서 적용 가능한 예로는 캐릭터 애니메이션 상태네트워크 연결 상태 등이 있다.

  • 클래스 수가 증가하면 복잡성이 증가할 수 있으며, 구조를 이해하지 못하면 복잡하게 느껴질 수 있다.

  • 모든 디자인 패턴은 장점단점이 있으므로, 상황에 맞게 적용 여부를 신중히 판단해야 한다.