[내배캠] 유니티 숙련 팀프로젝트#1

Sungchan Ahn(안성찬)·2024년 11월 1일

내일배움캠프

목록 보기
53/104

내 역할

우리 조는 마인크래프트 같은 생존게임을 만들기로 했다. 내 역할은 여러 종류의 적 AI를 구현하는 것이다. 적은 여러 야생동물들로 아래와 같이 구성했다.

  • Aggressive Animals (선공하는 동물)

    • 멧돼지 Boar
    • 곰 Bear
    • 늑대 Wolf(추후에 무리(그룹)형 동물로 변경하면 좋을 것 같다)
  • Passive Animals (공격 O, 선공 X)

    • 들소 Bison
    • 개 Dog
  • Non-attack Animals

    • 다람쥐 Squirrel
    • 사슴 Dear
    • 토끼 Rabbit
    • 칠면조 Turkey

동물들은 다음과 같은 상태를 가진다.

  • Idle (기본 정지 상태)
  • Wander (기본적으로 어슬렁거리며 돌아다니는 상태)
  • Alerted (플레이어가 감지범위 안으로 들어왔을 때, 정지해서 플레이어를 바라보며 경계하는 상태 - Aggressive는 해당 없음)
  • Chase (Non-attack은 해당 없음, 공격을 받았을 때 플레이어를 추적하는 상태 (Aggressive - 감지범위, 시야범위 안에 들어오는 경우에도 플레이어를 즉시 추적))
  • Attack (공격 상태, 공격 대기 시간이 있음)
  • Escape (Non-attack의 경우 플레이어에게 공격을 받으면 도망 상태가 된다. Passive의 경우 체력이 10% 이하가 되면 도망 상태가 된다. Aggressive는 해당 없음)
  • Dead (체력이 0 이하가 되면 죽은 상태가 되어 죽는 animation이 실행되고, 아이템을 드랍한다.)

위에서 정한 상태를 바탕으로 디자인 패턴 중 하나인 상태 패턴을 이용해 적의 AI를 구현하는 것을 목표로 잡았다. 그래서 먼저 상태 패턴에 대해 알아보자.

상태 패턴

개념

객체의 상태에 따라 다른 행동을 하는 상황에서 상태를 객체화하여 현재 상태를 나타내는 객체에게 행동을 위임한다.

  • 상태에 따른 행동을 별도의 클래스로 각각 구현하기 때문에 상태가 바뀔 때마다 그 상태에 해당하는 객체를 불러온다.
  • 상태 간의 전환에 관한 로직은 별도로 구현해야 한다.

장점

  • 기존의 코드 수정 없이 상태를 확장하거나 줄일 수 있다.
  • 상태 전이에 따른 로직 변경이 쉽다.
  • 캡슐화 하여 동적으로 할당이 가능하다.

구현 방법

다음 세 가지를 핵심적으로 작성해야 한다.

  • Context : 객체의 상태를 저장하고 행동을 정의
  • abstract class State 또는 IState : 상속 받은 자식 클래스들로 연결할 수 있는 추상 클래스 또는 인터페이스
  • 구체적인 State 클래스 : 각 상태를 구체적으로 구현한 클래스
public enum AIState
{
    Idle,
    Wander,
    Alerted,
    Chase,
    Attack,
    Escape,
    Dead
}

---

public class StateContext
{
    public IState currentState;

    private readonly Creature _creature;

    public StateContext(Creature creature)
    {
        _creature = creature;
    }

    public void Transition(IState newState)
    {
        if (currentState != null) currentState.OnStateExit();

        currentState = newState;
        currentState.OnStateEnter();
    }
}
// 상태 변경 반영 및 실행

---

public interface IState
{
    public void OnStateEnter();
    public void OnStateUpdate();
    public void OnStateExit();
}

---

public class WanderState : MonoBehavior, IState
AlertedState
ChaseState
AttackState
// 각 상태의 행동 로직 구현

---

public class Creature : MonoBehaviour
{
	// 상태 변경 로직 구현
}
profile
게임 개발 기록

0개의 댓글