박하의 나날

[Blueprint] 블루프린트로 돌아다니는 AI 만들기

프로그래밍/Unreal

 

 

블루프린트로 만들어본 AI.

최종은 돌아다니면서 플레이어를 만나면 플레이어를 공격하게까지고,

이번 포스팅은 맵에서 돌아다니게 까지'ㅅ'

 

 

 

1. 몬스터를 조종하기 위해서는 인공지능이 주체가 되어야 한다.

Blueprint - 모든 클래스 - AIController를 검색해서 BP_EnemyController라는 블루프린트를 만들고,

엑터의 디폴트 설정 메뉴에서 AI Controller Class를 BP_EnemyController로 바꾼다.
바로 위에 Auto Posses AI설정이 Place in World로 되어있다면,
몬스터가 레벨에 배치될때 자동으로 컨트롤러도 같이 스폰된다.

 

 

 

 

2.인공지능 로직

AI컨트롤러에 두 리소스를 사용해 움직이도록 로직을 추가한다.
시퀀스 노드를 이용해서 먼저 블랙보드를 사용하고 그 다음에 비헤이비어 트리를 사용하도록 한다.

블랙보드: 의사결정에 필요한 데이터를 블랙보드에 저장한다,
현재 상황에서 발생한 사건 중 행동에 영향을 미치는 부분간추려 데이터로 저장한다.
비헤이비어트리:블랙보드에 저장된 데이터를 기반으로 자신이 해야 할 행동을 결정한다.

 

 

 


2.1.정찰기능 - 블랙보드 설정


블랙보드를 열어 세 개의 키를 추가한다.

 

HomeLoc 스폰위치, TargetLoc 정찰할 목표위치, IdleTime 대기시간.

 

 

 


BP_EnemyController로 돌아가서 블랙보드의 키 값들을 초기화한다.
몬스터의 시작위치를 저장하기 위해 GetBlackBoard노드를 사용해서 가져오고 Set Valeu As Vector명령으로 벡터 값을 초기화시켜준다.

 

 

이름 유형 변수로 되어 있는 Key Name핀에 HomeLoc값을 전달해주고, 적이 스폰된 위치를 노드 명령의 Vector Value핀 값에 연결한다.
시작 위치가 몬스터 스폰 위치가 될테니 AI컨트롤러가 점유하는 폰의 위치를 연결해주면 된다.
이를 위해 GetControlledPaw명령을 사용한다.

 

 

2.1.정찰기능 - 비헤이비어 트리

몬스터가 수행할 행동을 지정한다.

 

비헤이비어트리에서의 행동은 Task라는 단위로 지정된다.
테스크는 단독으로 실행할 수 없고 하나를 사용하더라도 항상 Composite이라는 특별한 노드를 사용해 그룹을 만들어 주어야한다.
여러 개의 테스크가 Composite으로 묶일 때에는 우선순위가  항상 왼쪽에서 오른쪽으로 정해져서, 왼쪽에서 오른쪽 차례대로 테스크가 수행된다.

 


시퀀스라는 컴포짓을 사용해 Wiat Blackboard Time 테스크랑 MoveTo테스크가 차례대로 실행하도록 한다.
시퀀스는 테스크의 결과가 성공이면 다음 순위의 테스크를 실행하는 컴포짓이다.

 

 

그리고 NavMeshBoundsVolume 추가.

P를 누르면 돌아다닐 면적이 표시가 된다.

 

여기까지하면 몬스터가 한번 이동하고 제자리에 서있다.
비헤이비어트리의 진행을 살펴보면 컴포짓은 주기적으로 반복되지만 블랙보드의 TargetLoc키 값이 변경되지 않아서 MoveTo테스크가 바로 종료되었기 때문이다.

 

 

2.1.2 테스크 제작

 

 

BTT_NewTargetLoc으로 이름을 변경한다.

 

 

 

테스크는 Receive Execute이벤트에서 부터 시작하고,
이 이벤트에 들어오는 Owner Actor는 AI 컨트롤러가 된다.


이 핀은 Actor 타입으로 들러오기때문에 테스크 제작시에는 형변환을 해주어야한다.

제작한 스폰위치에서 10미터 이내의 이동 가능한 거리를 찾아서 블랙보드의 TargetLoc키에 저장하는 것이 이 테스크에서 수행할 명령이다.

HomeLoc, TargetLoc이라는 변수를 생성하고 BlackBoardKeySelector타입을 선택한 후 편집 가능 옵션을 체크해준다.


그리고 이제 HomeLoc변수에서는 Get BlackBoard Value As Vector/TargetLoc 변수에는 Set Black Board Value As Vector 노드를 사용해 블랙보드에서 데이터를 읽고 쓰는 명령을 만들어 준다.


 테스크가 종료되었다는 것을 비헤이비어트리에게 알려야 하니까 Finish Execute명령을 사용한다.
테스크를 마무리할때는 이 테스크가 성공적으로 수행되었는지 실패했는지를 알려주어야 한다.
Success핀이 False가 되면 태스크를 관리하는 시퀀스 컴포짓이 태스크가 실패했다고 판단해 시퀀스를 종료해버린다
.

따라서 다음 행동의 태스크로 이어지게 하기위해서 값을 True로 설정해주어야한다.

 

 

 

비헤이비어 트리에서 태스크 노드를 선택해서 블랙보드의 키값을 바르게 지정해준다.

안그러면 HomeLoc키값만 업데이트되서 지정한 위치로 움직이지 않게되니까.

 

 

 

여기까지하면 이렇게 혼자 돌아다닌다.


 

 

 

 

'프로그래밍 > Unreal' 카테고리의 다른 글

Floating UI Widget/Enemy HP Bar  (0) 2017.09.23
[UE4]c++ Class 삭제하는 법  (0) 2017.09.16
Blueprint) Clear Timer by Handle  (0) 2017.08.28
UE4 디버그 메세지  (0) 2017.08.23
0725,26  (0) 2017.07.26