본문 바로가기

블루프린팅/9. 인공지능

[09.인공지능] 내비게이션(탐색) 행동 만들기

적의 첫 번째 목표는 맵에 만든 지점 사이를 이동시키는 것이다. 이를 달성하기 위해, 적이 탐색할 지점을 맵에 만든 다음, 적이 순환적으로 각 지점으로 이동하도록 하는 행동을 세팅한다.

 

패트롤(순찰)지점 세팅

인공지능이 순찰할 경로를 만드는 것부터 시작한다. 트리거 스피어는 오버랩이벤트를 생성하고 게임에 숨겨지기 때문에 순찰 지점을 나타내기 위해 사용할 것이다. BP_EnemyCharacter의 각 인스턴스는 두 개의 순찰 지점 사이를 탐색할 수 있기 때문에 우리는 적어도 두 개의 순찰 지점이 필요하다.

다음 단계에 따라 순찰 지점을 작성한다.

1. 레벨 에디터에서 툴바에 있는 +만들기 버튼을 클릭후 Basic>트리거 스피어를 클릭한다. 바닥 아무곳에나 배치한다.

2. 디테일 패널에서  Sphere Trigger를 선택후 F2를 눌 PatrolPoint1로 이름을 변경한다.

3. 다른 트리거 스피어를 만들고  PatrolPoint2로 이름을 지정한다. 두 지점사이의 이동이 눈에 띄도록 첫 번째 순찰 지점에서 멀리 배치한다.

패트롤포인트가 구축되면, 적의 지성을 만드는 단계로 갈수 있다.

 

블랙보드 키 만들기

블랙보드는 키와 값을 사용해서 정보를 저장한다. BB_EnemyBlackboard는 두개의 키를 사용하는데, 현재 순찰 지점을 저장하기 위한 키와 플레이어 캐릭터에 대한 참조를 저장하기 위한 키다. 이 정보는 비헤이비어 트리에서 참조된다.

 

1. 콘텐트 브라우저에서 BB_EnemyBlackBaord를 연다.

2. 새 키를 클릭하고 오브젝트를 키 타입으로 선택한다. 이름을 CurrentPatrolPoint로 바꾸고 디테일패널의 KeyType을 확장해 BaseClass를 Actor로 바꾼다.

3. 이제 PlayerCharacter의 키를 만들어 보겠다. 새 키를 클릭하고 오브젝트를 키 타입으로 선택한다.

4. 새 키의 이름을 PlayerCharacter로 지정한다. 키 타입 옆의 확장 화살표를 클릭하고 베이스 클래스를 Character로 변경한다.

5. 저장후 에디터에서 나와 레벨에디터로 돌아온다.

이제 Blackboard내의 Current PatrolPoint키의 값을 레벨의 실제 순찰 지점으로 세팅해야한다. 이작업은 BP_enemyCharacter블루프린트에서 한다.

 

BP_enemyCharacter블루프린트에서 변수 만들기

BP_enemyCharacter블루프린트에서 변수를 만들어 순찰 지점을 저장하고, 블랙보드의 키 이름을 정한다.

변수를 생성하려면 다음 단계를 수행한다.

1. BP_EnemyCharacter 블루프린트를 연다.

2. 내 블루프린트 패널의 변수 카테고리에서 + 버튼을 클릭해서 변수를 추가하고 PatrolPoint1로 이름을 지정한다. 변수타입은 Object Types> Actor>Object Reference로 지정한다.

3. 디테일 패널에서 변수 타입 액터 밑의 Instance Editable을 체크한다.

4. 동일한 단계로 PatrolPoint2를 만든다. 

5. CurrentPatrolPoint라는 액터변수를 만든다 인스턴스 편집기능속성을 선택하지 않는다.

6. PatrolPointKeyName라는 다른 액터 변수를 만든다. 변수타입을 Name으로 하고 컴파일후 기본값을 CurrentPatrolPoint로 설정한다. Instance Editable은 체크하지 않는다. 변수 패널의 감은 눈꺼플은 Instance Editable이 아니라는 아이콘이다.

7. 이제 이런 변수를 사용해서 BB_EnemyBlackboard블랙보드의 값을 업데이트 할 수 있다

 

 

현재 순찰 지점 키 업데이트

여러 곳에서 사용될 BB_EnemyBlackboard의 Current Patrol Point 키를 업데이트하기 위한 매크로를 만들 것이다. 

1. 내블루프린트 패널에서 매크로 카테고리의 +버튼을 클릭해서 매크로를 생성하고 UpdatePatrolPointBB로 변경한다.

2. 디테일 패널의 In/Out 파라미터를 생성한다. Type은 Exec로 한다.

3. 그리드 빈곳을 우클릭해서 Get Blackboard를 추가하고 Return Value핀을 끌어 Set Value as Object를 추가한다.

4.  Set Value as Object의 Key Name핀을 끌어 GET Patrol Point Key Name노드를 추가한다.

5. Set Value as Object의 Object Value핀을 끌어 GET Current Patrol Point노드를 추가한다.

6. Inputs와 Set Value as Object와 Outputs를 연결해주고 컴파일 세이브 한다.

이제  BP_EnemyCharacter 인스턴스가 순찰포인트와 겹치는 시점을 확인해서 BB_EnemyBlackboard의 CurrentPatrolPoint키를 업데이트해야한다.

 

순찰지점 겹침

 Actor Begin Overlap 이벤트를 사용해 BP_EnemyCharacter의 인스턴스가 두 순찰 지점 중 하나에 도달하는지 확인후 이동중인 방향으로 순찰 지점을 변경한다.

 

CurrentPatrolPoint 변수를 업데이트 할때마다 UpdatePatrolPointB매크로를 호출해야 한다.

BeginPlay 이벤트에서는 초기순찰 지점을 CurrentPolutionPoint로 세팅하고 PatrolPointBB  매크로를 업데이트 한다.

 

1. BP_EnemyCharacter의 현재 순찰 지점에서 BeginPlay 이벤트의 흰색 실행핀에서 와이어를 끌어 Set Current Patrol Point 노드를 추가한다.

2, SET Current Patrol Point의 입력 핀에서 와이어를 끌어 Get Patrol Point1노드를 추가한다.

3. SET Currnet Patrol Point의 흰색 출력 핀에서 와이어를 끌어 Update PatrolPoint BB매크로를 추가한다.

4. 이제 순찰 지점을 교체하는 ActorBeginOverlap 이벤트를 만들어보겠다. 이벤트는 먼저 적이 PatrolPoint1과 겹치는지 확인한다. True면 이벤트는 PatrolPoint2를 CurrentPatrolPoint로 세팅한다 

5. false일 경우 적이 Patrol Point 2와 겹치는지 여부를 확인한다. 이 경우 이벤트는 PatrolPoint1을 Current Patrol Point로 세팅한다.

6. 전체그래프이다. 겹칩곳이PatrolPoint1이면 PatrolPoint2로 Patrol2면 Patrol Point1으로  세팅해서 Update Patrol PointBB마크로로 BackBoard의 PatrolPoint를 업데이트 해준다.

7. 블루프린트를 컴파일 하고 저장한다.