1. 언리얼 엔진 5에서 상태 트리(State Tree)를 활용한 AI 제작 [0]

thumbnail

복잡한 AI 로직을 체계적으로 구성하고 다양한 행동 패턴을 구현하는 방법을 단계별로 설명한다.

1.1. 프로젝트 설정 및 기본 AI 구성 요소 [0]

AI 제작을 위한 프로젝트 설정과 필요한 기본 구성 요소를 준비한다.

  1. 새 프로젝트 생성 및 플러그인 활성화 [11]
    • Third Person 템플릿으로 새 프로젝트를 생성한다.
    • Plugins 메뉴에서 State Tree와 Gameplay State Tree 플러그인을 활성화하고 컴퓨터를 재시작한다.
  2. 내비게이션 메시(Nav Mesh) 설정 [17]
    • Nav Mesh Bounds Volume을 월드에 추가하고 전체 맵을 포함하도록 확장한다.
    • Nav Mesh Bounds Volume은 AI가 이동 가능한 영역을 정의하며, P 키를 눌러 디버그 영역을 확인할 수 있다.
  3. AI 기본 구성 요소 생성 [23]
    • AI 캐릭터 생성: Character 클래스를 상속받아 BP_Enemy라는 이름의 적 캐릭터 블루프린트를 생성한다.
    • AI 컨트롤러 생성: AI Controller 클래스를 상속받아 AIC_Enemy라는 이름의 AI 컨트롤러 블루프린트를 생성한다.
      • AI 컨트롤러는 AI 캐릭터의 의사결정을 담당하는 '뇌' 역할을 한다.
      • 캐릭터는 이동, 애니메이션, 물리적 존재감을 담당한다.
      • 이러한 분리는 AI 로직 관리 및 재사용을 용이하게 한다.
    • 상태 트리 생성: Artificial Intelligence 메뉴에서 State Tree를 선택하고, 추가 기능이 있는 State Tree AI Component를 사용한다. ST_Enemy라는 이름으로 생성한다.
  4. 적 캐릭터 기본 설정 [37]
    • BP_Enemy 블루프린트에서 Skeletal Mesh를 Manny로, Animation Class를 ABP_Manny로 설정한다.
    • 캐릭터의 위치와 회전을 조정하여 올바르게 배치한다.
    • Defaults 패널에서 Pawn 섹션의 Auto Possess AI를 Place in World or Spawned로 변경하고, AI Controller Class를 AIC_Enemy로 설정한다.
    • AIC_Enemy 블루프린트의 컴포넌트에 State Tree AI를 추가하고, State Tree를 ST_Enemy로 설정한다.

1.2. 순찰 경로 설정 및 인터페이스 활용 [53]

AI가 순찰할 경로를 설정하고, 이를 AI 컨트롤러와 연동하기 위해 인터페이스를 사용한다.

  1. 순찰 경로 액터 생성 [54]
    • BP_PatrolPath라는 이름의 액터를 생성하고 Spline Component를 추가한다.
    • 스플라인 컴포넌트를 드래그하여 AI가 따라갈 경로를 생성한다.
    • Alt 키를 누른 채 스플라인 포인트를 드래그하여 새로운 포인트를 생성하고, 경로가 루프를 형성하도록 한다.
  2. 순찰 경로 변수 설정 [59]
    • BP_Enemy 블루프린트에 Patrol Path 변수를 BP_PatrolPath 타입으로 추가한다.
    • Patrol Path 변수를 Instance Editable 및 Expose on Spawn으로 설정하여 월드에서 쉽게 설정할 수 있도록 한다.
    • 월드에 배치된 BP_Enemy의 디테일 패널에서 Patrol Path 변수에 생성한 BP_PatrolPath를 할당한다.
  3. 인터페이스를 활용한 정보 전달 [71]
    • Get Patrol Path 인터페이스 생성:
      • Interface 타입으로 INT_GetPatrolPath를 생성한다.
      • 함수 Get Patrol Path를 추가하고, BP_PatrolPath 타입의 Patrol Path 출력 변수를 설정한다.
    • 인터페이스 구현 및 변수 설정:
      • BP_Enemy 블루프린트의 Class Settings에서 INT_GetPatrolPath 인터페이스를 구현한다.
      • 구현된 Get Patrol Path 함수에서 Patrol Path 변수를 출력으로 연결한다.
    • AI 컨트롤러에서 순찰 경로 정보 활용:
      • AIC_Enemy 블루프린트에서 Event Possess 시 Pawn을 변수로 저장한다.
      • 저장된 Pawn에서 Get Patrol Path 함수를 호출하여 순찰 경로 정보를 가져온다.
      • 가져온 Patrol Path 액터에서 Spline Component를 가져온다.
      • Get Number of Spline Points를 사용하여 총 순찰 지점 수를 얻고, Total Patrol Points 변수에 저장한다.
      • Current Patrol Points 변수를 0으로 초기화한다.

1.3. 상태 트리 기본 상태 및 순찰 로직 구현 [108]

상태 트리를 사용하여 AI의 순찰 상태를 정의하고, 순찰 경로를 따라 이동하는 로직을 구현한다.

  1. Patrol 상태 및 태스크 생성 [123]
    • ST_Enemy 상태 트리에서 Patrol이라는 새 상태를 생성한다.
    • Patrol 상태에 대한 태스크로 ST_Patrol을 생성한다.
    • ST_Patrol 태스크에서 Event Execute 시 AIC_Enemy 타입의 변수를 생성하고, 이를 통해 INT_AIC_IC_Patrol 인터페이스의 Patrol 이벤트를 호출한다.
    • Finish Task 노드를 사용하여 태스크를 종료하고, On Uncompleted 상태 전환을 통해 Patrol 상태로 다시 돌아가도록 설정한다.
    • 태스크에 AI Controller 컨텍스트를 제공한다. 컨텍스트는 상태 트리가 실행될 때 AI 컨트롤러와 같은 외부 객체에 대한 참조를 제공하여, AI가 실행 중인 컨트롤러, 제어되는 폰, 사용 가능한 인식 데이터 등에 접근할 수 있도록 한다.
  2. 순찰 이동 로직 구현 [158]
    • AIC_Enemy 블루프린트에서 Event Patrol을 트리거하는 Increase Patrol Point 커스텀 이벤트를 생성한다.
    • Event Patrol에서 AI Move To 노드를 사용하여 BP_Enemy의 Patrol Path 스플라인의 다음 지점으로 이동시킨다.
    • Get Location at Spline Point 노드를 사용하여 월드 좌표의 위치를 가져온다.
    • 이동이 성공하면 Increase Patrol Point 이벤트를 호출한다.
    • Increase Patrol Point 이벤트에서 Current Patrol Points를 1 증가시키고, Total Patrol Points와 비교하여 마지막 지점이면 0으로 초기화한다.
    • 이후 다시 Patrol 이벤트를 호출하여 다음 지점으로 이동하도록 한다.
    • ABP_Manny 애니메이션 블루프린트에서 Idle 상태를 제거하여 AI가 이동 시 글라이딩하는 현상을 방지한다.
  3. AI 감지(Perception) 설정 [191]
    • E_EnemySenses 열거형 생성: Sight, Hearing, Damage 세 가지 감각을 정의하는 열거형을 생성한다.
    • AI Perception 컴포넌트 추가: AIC_Enemy에 AI Perception 컴포넌트를 추가한다.
    • 감각 설정: AI Sight Config, AI Damage Sense Config, AI Hearing Config를 추가하고, Dominant Sense를 AI Sight로 설정한다.
      • Sight의 Sight Radius를 750, Lose Sight Radius를 1250으로 설정한다.
      • 모든 감각에 대해 Detect 옵션을 활성화한다.
    • On Perception Updated 이벤트 처리:
      • On Perception Updated 이벤트에서 업데이트된 액터 목록을 순회한다.
      • Can Sense Actor 함수를 생성하여 특정 액터가 특정 감각으로 감지되었는지 확인한다.
      • Get Actors Perception을 사용하여 액터에 대한 감지 정보를 얻고, Last Sensed Stimulus를 통해 감지된 감각을 확인한다.
      • Successfully Sensed 출력을 통해 액터를 처음 감지했는지, 또는 시야를 잃었는지 등을 판단한다.
    • 플레이어 감지 테스트:
      • Third Person Character 블루프린트에서 N 키를 눌러 데미지를 보고하고, M 키를 눌러 소음을 보고하는 기능을 추가한다.
      • Report Damage Event와 Report Noise Event를 사용하여 AI가 데미지나 소음을 감지하도록 한다.
      • AI Hearing Config의 Detect 옵션에서 Enemy, Neutral, Friendly를 모두 활성화하여 소음 감지를 제대로 작동시킨다.

1.4. 플레이어 추격 및 공격 로직 구현 [306]

AI가 플레이어를 감지했을 때 추격하고 공격하는 로직을 상태 트리와 인터페이스를 통해 구현한다.

  1. Chase Player 인터페이스 및 상태 추가 [306]
    • Chase Player 인터페이스 함수 추가: AIC_Enemy에 Chase Player라는 이름의 함수를 가진 인터페이스를 추가한다.
    • Attack Target 변수 설정: AIC_Enemy에 Attack Target 변수를 Actor 타입으로 추가한다. 플레이어를 감지하면 이 변수에 플레이어의 참조를 저장하고, 시야를 잃으면 초기화한다.
    • Chase 상태 생성: ST_Enemy에 Chase라는 새 상태를 생성한다.
    • ST_Chase 태스크 생성: Chase 상태에 대한 태스크로 ST_Chase를 생성한다.
      • Event Enter State에서 AIC_Enemy 컨텍스트를 가져와 Chase Player 인터페이스 함수를 호출한다.
      • Finish Task 노드를 사용하여 태스크를 종료한다.
  2. 추격 로직 구현 [316]
    • AIC_Enemy의 Chase Player 함수에서 AI Move To 노드를 사용하여 Attack Target으로 이동시킨다.
    • Validated Get을 사용하여 Attack Target이 유효한지 확인 후 이동을 실행한다.
    • ST_Enemy에서 Chase 상태로 전환하는 Event 트랜지션을 추가하고, Chase 태그를 사용한다.
    • AI가 플레이어를 감지하면 Send State Tree Event를 통해 Chase 태그를 보내 Chase 상태로 전환시킨다.
    • 플레이어 시야를 잃으면 Patrol 상태로 돌아가도록 설정한다.
  3. 공격 애니메이션 및 상태 추가 [436]
    • Punch 애니메이션 몽타주 생성: Anim 폴더에 AN_Punch라는 이름의 애니메이션 몽타주를 생성한다.
    • Attack 커스텀 이벤트 생성: BP_Enemy 블루프린트에서 Attack이라는 커스텀 이벤트를 생성한다.
      • Play Montage 노드를 사용하여 AN_Punch 몽타주를 재생한다.
      • Attack Finished 이벤트 디스패처를 생성하고, 몽타주 재생 완료 시 호출한다.
    • Attack 상태 생성: ST_Enemy에 Attack이라는 새 상태를 생성한다.
    • ST_Attack 태스크 생성: Attack 상태에 대한 태스크로 ST_Attack을 생성한다.
      • Event Enter State에서 AIC_Enemy 컨텍스트를 가져와 Attack 함수를 호출한다.
      • Assign on Attack Finished를 통해 Attack Finished 이벤트 디스패처에 바인딩하고, 완료 시 Finish Task를 호출한다.
    • 상태 전환 설정:
      • Chase 상태에서 Attack 상태로 전환하는 On State Succeeded 트랜지션을 추가한다.
      • Attack 상태에서 Chase 상태로 전환하는 On State Succeeded 트랜지션을 추가한다.
  4. 캡슐 클리핑 문제 해결 [528]
    • Player BP Third Person Character 블루프린트의 Camera Boom 컴포넌트에서 Do Collision Test를 비활성화하여 공격 시 발생하는 카메라 움직임 문제를 해결한다.

1.5. 조사(Investigate) 로직 구현 [380]

AI가 소리나 피해를 감지했을 때 해당 위치로 이동하여 조사하는 로직을 구현한다.

  1. Investigate 상태 및 태스크 생성 [380]
    • ST_Enemy에 Investigate라는 새 상태를 생성한다.
    • ST_Investigate 태스크를 생성하고, Event Enter State에서 AIC_Enemy 컨텍스트를 가져온다.
    • AIC_Enemy에서 Investigate Finished 이벤트 디스패처를 생성하고, ST_Investigate 태스크에서 이를 바인딩하여 Finish Task를 호출한다.
  2. 조사 이동 로직 구현 [396]
    • ST_Investigate 태스크에서 AI Move To 노드를 사용하여 감지된 위치(Stimulus Location)로 이동시킨다.
    • 이동이 성공하면 Investigate Finished 이벤트 디스패처를 호출한다.
    • Patrol 상태에서 Investigate 상태로 전환하는 On Event 트랜지션을 추가하고, Investigate 태그를 사용한다.
    • Investigate 상태에서 Patrol 상태로 전환하는 On State Succeeded 트랜지션을 추가한다.
  3. 감지된 위치로 이동 및 조사 [427]
    • AI가 소리나 피해를 감지하면 Investigate 태그를 사용하여 Investigate 상태로 전환시킨다.
    • AI는 감지된 위치로 이동하여 조사하며, 조사가 완료되면 다시 Patrol 상태로 돌아간다.
    • 만약 조사 중 플레이어를 감지하면 Chase 상태로 전환된다.

2. AI 행동 패턴 시뮬레이션 및 최종 점검 [286]

thumbnail

구현된 AI의 다양한 행동 패턴을 테스트하고 최종적으로 점검한다.

2.1. AI 행동 시나리오 테스트 [286]

다양한 상황에서 AI의 행동을 테스트하고 문제점을 파악한다.

  1. 데미지 감지 및 반응 테스트 [286]
    • N 키를 눌러 데미지를 발생시키면 AI가 데미지를 감지하고 해당 위치로 이동한다.
  2. 소음 감지 및 반응 테스트 [294]
    • M 키를 눌러 소음을 발생시키면 AI가 소음을 감지하고 해당 위치로 이동한다.
    • 소음 감지 범위(Max Range)를 조절하여 AI의 반응 거리를 조정할 수 있다.
  3. 플레이어 추격 및 공격 테스트 [369]
    • AI가 플레이어를 시야에 감지하면 Chase 상태로 전환되어 플레이어를 추격한다.
    • 플레이어에게 도달하면 Attack 상태로 전환되어 공격한다.
  4. 시야 상실 후 순찰 복귀 테스트 [377]
    • AI가 플레이어를 시야에서 놓치면 Patrol 상태로 돌아가 순찰 경로를 다시 시작한다.
  5. 종합적인 AI 행동 시뮬레이션 [514]
    • AI가 소리를 듣고 조사하러 갔다가 플레이어를 발견하면 추격하고 공격한다.
    • 플레이어를 놓치면 다시 순찰로 복귀하는 등 복합적인 행동을 수행한다.

2.2. 추가 정보 및 프로젝트 파일 안내 [8]

튜토리얼의 추가 정보와 프로젝트 파일 접근 방법을 안내한다.

  1. 프로젝트 파일 및 추가 자료 안내 [8]
    • 완전한 프로젝트 파일, 보너스 콘텐츠, 상태 트리 설명 문서는 Patreon에서 얻을 수 있다.
  2. 커뮤니티 참여 안내 [547]
    • 언리얼 엔진 학습 커뮤니티에 참여하여 개발자들과 교류할 수 있다.