개요
스마트 오브젝트(Smart Objects) 는 레벨 내 배치되는 오브젝트로, AI 에이전트와 플레이어가 상호작용할 수 있습니다. 스마트 오브젝트는 상호작용에 필요한 모든 정보를 포함합니다.
크게 보면 스마트 오브젝트는 예약 시스템을 통해 사용할 수 있는 레벨 내 활동 세트를 나타냅니다. 이 시스템은 레벨 내 모든 스마트 오브젝트를 트래킹하며, AI 에이전트가 스마트 오브젝트를 ‘예약’하여 다시 사용 가능한 상태가 되기 전까지 다른 에이전트는 스마트 오브젝트를 사용할 수 없게 합니다.
목표
이 퀵스타트 가이드에서는 AI 에이전트를 사용해 스마트 오브젝트를 만들고 사용하는 방법을 설명합니다.
목적
-
AI 에이전트가 스마트 오브젝트에 도달할 때 사용할 수 있는 AI 게임플레이 비헤이비어 및 비헤이비어 정의를 만듭니다.
-
애니메이션 몽타주를 플레이하기 위해 비헤이비어 정의를 보유한 스마트 오브젝트를 만듭니다.
-
비헤이비어 트리와 비헤이비어 트리 태스크가 있는 간단한 AI 비헤이비어를 만듭니다.
-
레벨 내 스마트 오브젝트를 찾아서 사용할 수 있는 AI 에이전트를 만듭니다.
1 - 필수 설정
-
3인칭(Third Person) 템플릿을 바탕으로 새 블루프린트(Blueprint) 프로젝트를 만듭니다.
-
메인 메뉴에서 세팅(Settings) > 플러그인(Plugins) 으로 이동한 다음 플러그인(Plugins) 창을 엽니다.
-
게임플레이(Gameplay) 섹션에서 스마트 오브젝트(Smart Objects), AI 비헤이비어(AI Behaviors), 게임플레이 비헤이비어 스마트 오브젝트(Gameplay Behavior Smart Objects) 플러그인을 활성화합니다. 재시작하라는 메시지가 뜨면 에디터를 재시작합니다.
섹션 결과
이 섹션에서는 새 프로젝트를 만들고 스마트 오브젝트 및 AI 비헤이비어 플러그인을 활성화했습니다. 이제 AI 에이전트를 위한 AI 게임플레이 비헤이비어를 만들 차례입니다.
2 - AI 게임플레이 비헤이비어 만들기
이 섹션에서는 에이전트가 스마트 오브젝트 슬롯에 도달했을 때 할 행동을 정의하는 게임플레이 비헤이비어와 게임플레이 구성 블루프린트를 만듭니다.
-
콘텐츠 브라우저(Content Browser) 에서 우클릭한 다음 기본 에셋 생성(Create Basic Asset) 섹션에서 블루프린트 클래스(Blueprint Class) 를 선택합니다.
-
부모 클래스 선택(Pick Parent Class) 창에서 모든 클래스(All Classes) 섹션을 펼친 다음, 게임플레이 비헤이비어(Gameplay Behavior) 를 검색하여 선택합니다. 선택(Select) 을 클릭하고, 새 에셋의 이름을 BP_SO_Behavior_PlayMontage 로 지정합니다.
-
새 블루프린트 클래스를 생성한 다음 게임플레이 비헤이비어 구성(Gameplay Behavior Config) 을 검색하여 선택합니다. 선택(Select) 을 클릭하고, 새 에셋의 이름을 BP_SO_BehaviorConfig 로 지정합니다.
-
콘텐츠 브라우저(Content Browser) 에서 BP_SO_BehaviorConfig 를 더블 클릭하여 엽니다. 디테일(Details) 패널로 이동한 다음 비헤이비어 클래스(Behavior Class) 드롭다운을 클릭합니다. BP_SO_Behavior_PlayMontage 를 선택합니다. 블루프린트를 컴파일하고 저장합니다.
-
콘텐츠 브라우저(Content Browser) 에서 BP_SO_Behavior_PlayMontage 를 더블 클릭하여 엽니다. 함수(Functions) 옆에 있는 오버라이드(Override) 드롭다운을 클릭한 뒤 OnTriggeredCharacter 를 선택합니다.
-
Event OnTriggeredCharacter 노드의 Avatar 핀을 우클릭한 뒤 변수로 승격(Promote to Variable) 을 선택합니다.
-
Avatar 변수를 이벤트 그래프(Event Graph) 로 드래그한 뒤 Get Avatar 를 선택합니다. Avatar 노드에서 드래그한 다음 Get Component by Class 를 검색해 선택합니다.
-
컴포넌트 클래스(Component Class) 드롭다운을 클릭한 뒤 스켈레탈 메시 컴포넌트(Skeletal Mesh Component) 를 검색하여 선택합니다.
-
이벤트 그래프(Event Graph) 에서 우클릭한 뒤 Play Montage 를 검색하여 선택합니다.
-
Get Component by Class 노드의 Return Value 핀을 Play Montage 노드의 In Skeletal Mesh Component 핀에 연결합니다.
-
Set Avatar 노드를 Play Montage 노드에 연결합니다.
-
-
Play Montage 노드에서 Montage to Play 드롭다운을 클릭합니다. 목록에서 애니메이션 몽타주를 선택합니다.
사용 가능한 애니메이션이 없다면 언리얼 엔진 마켓플레이스에서 애니메이션 스타터 팩과 같은 무료 애니메이션 에셋 팩을 다운로드하면 됩니다. 또한 애니메이션 시퀀스를 우클릭하고 생성(Create) > 애님몽타주 생성(Create AnimMontage) 을 선택하여 애니메이션 몽타주로 변환할 수도 있습니다.
-
Avatar 변수를 이벤트 그래프(Event Graph) 로 드래그한 뒤 Get Avatar 를 선택합니다. Avatar 노드에서 드래그한 다음 End Behavior 를 검색해 선택합니다.
-
Play Montage 노드의 On Completed 및 On Interrupted 핀을 End Behavior 노드와 연결합니다.
-
블루프린트를 컴파일하고 저장합니다.
이 예시에서는 Play Anim Montage 노드가 아닌 Play Montage 노드를 사용하기 때문에 행동을 끝낼 때 On Completed 및 On Interrupted 핀을 사용합니다. 이렇게 하면 애니메이션의 재생이 끝날 때까지 스마트 오브젝트가 차지된 상태를 유지합니다.
섹션 결과
이 섹션에서는 에이전트가 스마트 오브젝트 슬롯에 도달했을 때 애니메이션 몽타주를 플레이하는 데 사용할 게임플레이 비헤이비어와 게임플레이 구성 블루프린트를 만들었습니다. 이제 스마트 오브젝트가 사용할 비헤이비어 정의를 만들 차례입니다.
3 - 스마트 오브젝트 정의 데이터 에셋 만들기
이 섹션에서는 각 스마트 오브젝트 슬롯의 행동을 정의할 스마트 오브젝트 정의 데이터 에셋(Smart Object Definition Data Asset)을 만듭니다.
-
콘텐츠 브라우저(Content Browser) 에서 우클릭하고 기타(Miscellaneous) > 데이터 에셋(Data Asset) 을 선택합니다.
-
데이터 에셋 인스턴스 클래스 선택(Pick Class for Data Asset Instance) 창에서 스마트 오브젝트 정의(Smart Object Definition) 를 검색해 선택합니다.
-
선택(Select) 을 클릭해 에셋을 만들고 이름을 SO_Definition_PlayMontage 로 지정합니다.
-
-
콘텐츠 브라우저(Content Browser) 에서 SO_Definition_PlayMontage 를 더블 클릭해 엽니다. 스크롤을 내려 스마트 오브젝트(Smart Object) 섹션으로 이동한 다음 슬롯(Slots) 옆에 있는 추가 (+)(Add (+)) 버튼을 눌러 새 슬롯을 만듭니다. 행동을 수행할 때 AI 에이전트가 사용하게 될 슬롯입니다.
-
디폴트 비헤이비어 정의(Default Behavior Definitions) 옆의 추가 (+)(Add (+)) 버튼을 클릭한 다음, 인덱스 0(Index 0) 에서 게임플레이 비헤이비어 스마트 오브젝트 정의(Gameplay Behavior Smart Object Behavior Definition) 를 선택합니다. 게임플레이 비헤이비어 구성(Gameplay Behavior Config) 드롭다운을 클릭하고 BP_SO_BehaviorConfig 를 선택합니다.
-
블루프린트를 저장한 후 닫습니다.
섹션 결과
이 섹션에서는 스마트 오브젝트의 각 슬롯을 정의하는 스마트 오브젝트 정의 데이터 에셋과 디폴트 비헤이비어 정의를 만들었습니다.
4 - 스마트 오브젝트 만들기
이 섹션에서는 레벨에서 에이전트가 찾아서 사용할 수 있는 스마트 오브젝트를 만듭니다.
-
콘텐츠 브라우저(Content Browser) 에서 우클릭한 다음 기본 에셋 생성(Create Basic Asset) 섹션에서 블루프린트 클래스(Blueprint Class) 를 선택합니다.
-
부모 클래스 선택(Pick Parent Class) 창에서 액터(Actor) 클래스 버튼을 클릭해 에셋을 생성합니다. 새 에셋 이름을 BP_SO_RunBT 로 지정합니다.
-
콘텐츠 브라우저(Content Browser) 에서 BP_SO_RunBT 를 더블 클릭해 엽니다. 컴포넌트(Components) 창에서 + 추가(Add) 버튼을 클릭합니다. 스마트 오브젝트(Smart Object) 를 검색해 선택합니다.
-
스마트 오브젝트(SmartObject) 컴포넌트를 선택한 상태로 디테일(Details) 패널로 이동한 뒤 스마트 오브젝트(Smart Object) 섹션으로 스크롤을 내립니다. 정의 에셋(Definition Asset) 드롭다운을 클릭하고 SO_Definition_PlayMontage 를 선택합니다.
-
블루프린트를 컴파일하고 저장합니다.
섹션 결과
이 섹션에서는 스마트 오브젝트를 만들고 슬롯의 디폴트 비헤이비어를 정의하는 비헤이비어 정의를 추가했습니다.
5 - AI 에이전트의 비헤이비어 트리 만들기
이 섹션에서는 AI 에이전트가 레벨에서 스마트 오브젝트를 찾아서 사용하는 데 필요한 비헤이비어를 만듭니다. 단순한 비헤이비어 트리 1개와 커스텀 비헤이비어 트리 태스크 2개를 사용합니다.
비헤이비어 트리와 블랙보드 만들기
-
콘텐츠 브라우저(Content Browser) 에서 우클릭하고 AI > 블랙보드(Blackboard) 를 선택합니다. 블랙보드의 이름을 BB_SO_Agent 로 지정합니다.
-
BB_SO_Agent 를 더블 클릭해 엽니다. 새 키(New Key) 드롭다운을 클릭한 뒤 스마트 오브젝트 클레임 핸들(SO Claim Handle) 을 선택합니다. 키 이름을 ClaimHandle 로 지정합니다. 블랙보드를 저장한 후 닫습니다.
-
콘텐츠 브라우저(Content Browser) 에서 우클릭하고 AI > 비헤이비어 트리(AI > Behavior Tree) 를 선택합니다. 비헤이비어 트리의 이름을 BT_SO_Agent 로 지정합니다.
비헤이비어 트리 태스크 만들기
스마트 오브젝트 찾기(Finding Smart Objects)
-
콘텐츠 브라우저(Content Browser) 에서 우클릭한 다음 기본 에셋 생성(Create Basic Asset) 섹션에서 블루프린트 클래스(Blueprint Class) 를 선택합니다.
-
모든 클래스(All Classes) 섹션에서 BT 태스크 블루프린트 베이스(BT Task Blueprint Base) 를 검색해 선택한 뒤 선택(Select) 을 클릭합니다. 블루프린트 이름을 BTT_FindSmartObject 로 지정합니다.
-
콘텐츠 브라우저(Content Browser) 에서 BTT_FindSmartObject 를 우클릭한 뒤 복제(Duplicate) 를 선택합니다. 새 블루프린트 이름을 BTT_UseSmartObject 로 지정합니다.
-
콘텐츠 브라우저(Content Browser) 에서 BTT_FindSmartObject 를 더블 클릭해 엽니다. 이벤트 그래프(Event Graph) 에서 우클릭한 뒤 Event Receive Execute AI 를 검색해 선택합니다.
-
Event Receive Execute AI 노드의 Owner Controller 핀에서 드래그한 뒤 Get Blackboard 를 검색해 선택합니다.
-
Get Blackboard 노드의 Return Value 핀을 우클릭한 뒤 변수로 승격(Promote to Variable) 을 선택합니다. 변수의 이름을 Blackboard 로 지정합니다.
-
Event Receive Execute AI 노드를 Set Blackboard 노드에 연결합니다.
-
-
Event Receive Execute AI 노드의 Controller Pawn 핀에서 드래그한 뒤 Get Actor Location 을 검색해 선택합니다.
-
Get Actor Location 노드의 Return Value 핀에서 드래그한 뒤 Subtract 를 검색해 선택합니다.
-
Get Actor Location 노드의 Return Value 핀에서 드래그한 뒤 Add 를 검색해 선택합니다.
-
두 노드의 X , Y , Z 값을 2000 으로 설정합니다. 이렇게 하면 에이전트 주위로 4000 x 4000 유닛, 즉 40 x 40 미터의 검색 박스가 만들어집니다.
-
-
이벤트 그래프(Event Graph) 에서 우클릭한 뒤 Make Box 를 검색해 선택합니다.
-
Subtract 노드를 Make Box 노드의 Min 핀에 연결합니다.
-
Add 노드를 Make Box 노드의 Max 핀에 연결합니다.
-
-
이벤트 그래프(Event Graph) 에서 우클릭한 뒤 Get Smart Object Subsystem 을 검색해 선택합니다.
-
Smart Object Subsystem 노드에서 드래그한 뒤 Find Smart Objects 를 검색해 선택합니다.
-
Find Smart Objects 노드의 Request 핀에서 드래그해 Make SmartObjectRequest 를 선택합니다.
-
-
Make Box 노드의 Return Value 핀을 Make SmartObjectRequest 노드의 Query Box 핀에 연결합니다.
-
Make SmartObjectRequest 노드의 Filter 핀에서 드래그해 Make SmartObjectRequestFilter 를 선택합니다.
-
Behavior Definition Classes 핀에서 드래그하고 Make Array 를 검색해 선택합니다.
-
Make Array 노드의 드롭다운을 클릭하고 GameplayBehaviorSmartObjectBehaviorDefinition 을 선택합니다.
-
Set Blackboard 노드를 Find Smart Objects 노드에 연결합니다.
-
-
지금까지 만든 블루프린트는 이런 모습입니다.
-
Find Smart Objects 노드의 Out Results 핀을 우클릭한 뒤 변수로 승격(Promote to Variable) 을 선택합니다. Out Results 노드를 Blackboard 노드와 연결합니다.
-
Out Results 노드의 핀에서 드래그한 뒤 Is Valid Index 를 검색해 선택합니다.
-
Is Valid Index 노드에서 드래그한 뒤 Branch 를 검색해 선택합니다. Out Results 노드를 Branch 노드와 연결합니다.
-
-
Branch 노드의 False 핀에서 드래그한 뒤 Finish Execute 를 검색해 선택합니다. 근처에 검색 기준을 만족하는 스마트 오브젝트가 없으면 Out Results 는 무효가 됩니다.
-
이벤트 그래프(Event Graph) 에서 Smart Object Subsystem 노드를 만듭니다. 노드에서 드래그한 뒤 Claim 을 검색해 선택합니다.
-
Branch 노드의 True 핀을 Claim 노드에 연결합니다.
-
Out Results 변수를 이벤트 그래프(Event Graph) 로 드래그해 가져온 다음 Get Out Results 를 선택합니다. 이 노드에서 드래그한 뒤 Random Array Item 을 검색해 선택합니다.
-
Random 노드에서 드래그한 뒤 Claim 노드의 Request Results 핀에 연결합니다.
-
-
Claim 노드의 Return Value 핀을 우클릭한 뒤 변수로 승격(Promote to Variable) 을 선택합니다. 변수의 이름을 ClaimHandle 로 지정합니다.
-
Claim Handle 노드 핀에서 드래그한 뒤 Is Valid Smart Object Claim Handle 을 검색해 선택합니다.
-
*Is Valid Smart Object Claim Handle 노드의 Return Value 핀에서 드래그한 뒤 Branch** 를 검색해 선택합니다.
-
-
Branch 노드의 False 핀에서 드래그한 뒤 Finish Execute 를 검색해 선택합니다.
-
Blackboard 변수를 이벤트 그래프(Event Graph) 로 드래그한 뒤 Get Blackboard 를 선택합니다.
-
Blackboard 노드에서 드래그하여 Set Value as SOClaim Handle 을 검색해 선택합니다.
-
Branch 노드의 True 핀을 Set Value as SOClaim Handle 노드에 연결합니다.
-
Set Value as SOClaim Handle 노드의 Key Name 핀을 우클릭한 뒤 변수로 승격(Promote to Variable) 을 선택합니다.
-
Key Name 변수를 선택한 상태로 디테일(Details) 패널로 이동한 뒤 인스턴스 편집가능(Instance Editable) 체크 박스를 활성화합니다. 디폴트값(Default Value) 을 ClaimHandle 로 설정합니다.
-
-
ClaimHandle 변수를 드래그한 뒤 Set Value as SOClaim Handle 노드의 Value 핀에 연결합니다.
-
Set Value as SOClaim Handle 노드에서 드래그한 뒤 Finish Execute 를 검색해 선택합니다. 노드의 Success 체크 박스를 활성화합니다.
-
블루프린트를 컴파일하고 저장합니다.
스마트 오브젝트 사용하기
-
콘텐츠 브라우저(Content Browser) 에서 BTT_UseSmartObject 를 더블 클릭해 엽니다. 이벤트 그래프(Event Graph) 에서 우클릭한 뒤 Event Receive Execute AI 를 검색해 선택합니다.
-
Event Receive Execute AI 노드의 Owner Controller 핀에서 드래그한 뒤 Get Blackboard 를 검색해 선택합니다.
-
Get Blackboard 노드의 Return Value 핀에서 드래그한 뒤 Get Value as SOClaim Handle 을 검색해 선택합니다.
-
Get Value as SOClaim Handle 노드의 Key Name 핀을 우클릭한 뒤 변수로 승격(Promote to Variable) 을 선택합니다.
- Key Name 변수를 선택한 상태로 디테일(Details) 패널로 이동한 뒤 인스턴스 편집가능(Instance Editable) 체크 박스를 활성화합니다. 디폴트값(Default Value) 을 ClaimHandle 로 설정합니다.
-
Get Value as SOClaim Handle 노드의 Return Value 핀에서 드래그한 뒤 Use Claimed Gameplay Behavior Smart Object 를 검색해 선택합니다.
-
Get Value as SOClaim Handle 노드를 Use Claimed Smart Object 노드에 연결합니다.
-
Event Receive Execute AI 노드의 Owner Controller 핀에서 드래그하여 Use Claimed Smart Object 노드의 Controller 핀에 연결합니다.
-
-
Use Claimed Smart Object 노드의 On Succeeded 핀에서 드래그한 뒤 Finish Execute 를 검색해 선택합니다. 노드의 Success 체크 박스를 활성화합니다.
-
블루프린트를 컴파일하고 저장합니다.
비헤이비어 트리 만들기
-
콘텐츠 브라우저(Content Browser) 에서 BT_SO_Agent 를 더블 클릭해 엽니다. Root 노드에서 드래그해 Selector 를 선택합니다.
-
Selector 노드에서 드래그해 Sequence 를 선택합니다.
-
Selector 노드에서 드래그해 Wait 를 선택합니다. 이 노드에 따라 에이전트가 스마트 오브젝트를 성공적으로 검색하지 못한 경우, 5초 동안 기다린 뒤 새로운 스마트 오브젝트를 찾게 됩니다.
-
Sequence 노드가 Wait 노드의 왼쪽에 있어야 합니다. 이렇게 하면 비헤이비어 트리에서 시퀀스가 먼저 실행됩니다.
-
-
Sequence 노드에서 드래그해 BTT_FindSmartObjects 를 선택합니다.
-
Sequence 노드에서 드래그해 BTT_UseSmartObjects 를 선택합니다.
-
Sequence 노드에서 드래그해 Wait 를 선택합니다. 노드를 선택한 상태에서 Wait Time 을 2.0 으로, Random Deviation 을 0.5 로 설정합니다. 이 노드에 따라 에이전트는 1.5~2.5초 동안 기다린 뒤 새로운 스마트 오브젝트를 찾게 됩니다.
-
비헤이비어 트리를 저장한 후 닫습니다.
섹션 결과
이 섹션에서는 에이전트가 레벨에서 스마트 오브젝트를 찾아서 사용할 수 있도록 비헤이비어 트리와 비헤이비어 트리 태스크를 만들었습니다.
6 - AI 에이전트 생성하기
이 섹션에서는 레벨에서 스마트 오브젝트를 찾아서 사용할 AI 에이전트를 만듭니다.
-
콘텐츠 브라우저(Content Browser) 에서 BP_ThirdPersonCharacter 블루프린트를 더블 클릭하여 엽니다.
-
이벤트 그래프(Event Graph) 의 모든 노드를 선택한 뒤 삭제합니다. 이벤트 그래프(Event Graph) 에서 우클릭한 뒤 Event Possessed 를 검색해 선택합니다.
-
Event Possessed 노드의 New Controller 핀에서 드래그한 뒤 AI 컨트롤러에 형변환(Cast to AI Controller) 을 검색해 선택합니다. Event Possessed 노드를 AI 컨트롤러에 형변환(Cast to AI Controller) 노드에 연결합니다.
-
AI 컨트롤러에 형변환(Cast to AI Controller) 노드의 As AIController 핀에서 드래그한 뒤 Run Behavior Tree 를 검색해 선택합니다. BTAsset 드롭다운을 클릭하고 BT_SO_Agent 를 선택합니다.
-
블루프린트를 컴파일하고 저장합니다.
섹션 결과
이 섹션에서는 레벨에서 스마트 오브젝트를 찾을 AI 에이전트 블루프린트를 만들었습니다. 또한, 애니메이션 몽타주가 올바르게 재생되도록 애니메이션 블루프린트를 수정했습니다.
7 - 스마트 오브젝트 테스트하기
이제 에이전트가 레벨 내 스마트 오브젝트를 찾아서 사용할 수 있도록 테스트할 차례입니다.
-
메인 툴바에서 콘텐츠 추가(Add Content)(+) > 볼륨(Volumes) > NavMeshBoundsVolume 을 클릭하여 새 내비게이션 메시(Navigation Mesh) 액터를 레벨에 추가합니다. 에이전트가 목적지까지 이동할 수 있도록 메시의 스케일을 조절해 레벨을 모두 커버합니다.
-
레벨에 여러 BP_SO_RunBT 블루프린트를 드래그합니다.
-
레벨에 ThirdPersonCharacter 블루프린트를 드래그합니다.
-
시뮬레이트(Simulate) 를 눌러 에이전트가 레벨 내 스마트 오브젝트를 찾아서 사용할 수 있는지 확인합니다.
섹션 결과
이 섹션에서는 에이전트가 레벨 내 스마트 오브젝트를 찾아서 사용할 수 있다는 것을 확인했습니다.