목록언리얼/AI (7)
안선생의 개발 블로그
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/lDuFC/btsGfKhaLBY/pcnvwVFrW8YK2fFBsSAXW0/img.png)
설계 개념에서 decorator는 원래 어떤 기능을 하던 모듈은 고치지 않고 그대로 둔 채로 그 모듈을 감싸서 어떤 기능을 추가하는 것을 말합니다. 언리얼 엔진에서의 decorator도 같은 개념인데, Decorator는 Behavior Tree에서 각 task에 붙어서 task가 할 일을 더 추가해 주는 일을 합니다. 그리고 decorator가 task에 붙지만 composite에도 붙습니다. 언리얼 엔진에서 decorator는 주로 이 노드(task나 compositr)가 실행될지 말지를 체크하는 역할을 합니다. 그래서 한 노드에 서비스, 태스크, 데코레이터가 모두 들어가 있다면 데코레이터, 서비스, 태스크 순으로 실행됩니다. 데코레이터에서 거절하면 그 노드는 아예 실행이 안 됨 만약 composit..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/exNkUZ/btsFWlcrswL/kbqhF8JrJpQj1ATTjgI3Bk/img.png)
Behavior Tree - Service? Service는 Behavior Tree에서 각 task나 composite에 붙여 사용하는데, task가 실행되기 전에 먼저 실행되어 blackboard에서 값을 읽어 각 task에 값을 공급하는 등의 역할 또한 Service란 이름처럼 task나 composite가 실행되는 동안에 주기적으로 동작을 반복수행합니다. 서비스는 주로 Behavior Tree의 특정 상태에서 AI 캐릭터의 상태를 모니터링하거나 업데이트하는 데 사용됩니다. 예를 들어, 캐릭터가 특정 위치로 이동하도록 지시하는 행동 트리가 있다고 가정해 보겠습니다. 이동 중에 캐릭터의 위치를 계속 확인하고 목표 위치에 도달했는지 확인하려면 서비스를 사용하여 이러한 동작을 주기적으로 실행할 수 있습니..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/pf9oO/btsFXce68V5/DY6nRWFDwP0atJ5mjEQ1O0/img.png)
Simple Parallel? 노드가 두개가 보임 동시에 두가지 일을 한다. 왼쪽은 Task, 오른쪽은 기본 노드 즉 Task를 하면서 다른일을 동시에 가능하다. 테스트 먼저 Task하나 만들어줌 blackboard key selector로 백터값은 설정해준다. Task를 하나 더 만들어줌 간단하게 그냥 Hello출력 Task 트리 구조 시퀀스 성공하면 다음으로 넘어감 첫번쨰 Task 블랙보드 Vector값을 설정하는 Task Simple Parllel은 동시에 두가지 한다 했으니 Move To하면 Hello를 출력하고 0.5초 뒤에 Hello를 Move To가 끝날때까지 반복된다. 즉 SImple Parallel는 한가지 Task를 수행(성공)할때까지 다른 행동을 할 수 있는 컴포즈이다!.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/nCXUZ/btsFUGgnI9Q/QBjBZTmnp8kQkk8EJUOAS1/img.png)
블랙보드란? 상태 및 정보 저장: 블랙보드는 게임 세계에서 AI의 상태 및 정보를 저장하는 데이터 구조입니다. 예를 들어, AI 캐릭터의 위치, 플레이어와의 거리, 현재 상태 등을 저장할 수 있습니다. BehaviorTree가 알아야하는 정보들이라고 생각하면된다. 블랙보드가 왜 필요한가? AI가 Sensing을 통해 오브젝트를 찾아서 오브젝트 위치로 움직인다 치자. 근데 갑자기 Sensing이 오브젝트를 다른애를 찾았다 치면 Sensing은 BehaviorTree에 알려주고 BehaviorTree는 오브젝트를 변경해줘야한다. 하지만 BehaviorTree는 계속 루프돌고 있으므로 바쁘다. Sensing도 계속 찾고 있으므로 바쁘다. 그리고 BehaviorTree는 값이 필요할때마 갖고있는 클래스를 계속 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b6eAwn/btsFPqZpFDN/nlNL5em80kxaUTt4aGNU0K/img.png)
태스크(Task) 노드에 대한 레퍼런스 페이지입니다. 태스크는 AI를 이동하거나 블랙보드 값을 조정하는 등 각종 '작업'을 수행하는 노드입니다. 태스크에는 데코레이터(Decorators) 또는 서비스(Services)를 어태치할 수 있습니다. 새태스크를 한번 만들어봅시다. Event Receive Execute AI를 호출해줍니다 이름에서도 알 수 있는데 이함수는 실행되면 호출되는 함수입니다. 노드를 아래와같이 해봅니다. 위에 보면 숫자가있는데 실행 순서 순서는 왼쪽에서 오른쪽, 그다음 위에서 아래이다. 아래있어도 왼쪽에 있으면 아래있는게 먼저 실행 즉 왼쪽부터 실행되므로 잘 보자 이제 테스크를 가보면 아까 만든 테스크가 있음 이 테스크는 프린트 Hello를 출력함 예상되는 실행은 Hello실행하고 5초..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/vIfLH/btsFPJSruRM/0zwRDG1weMLeazj0A8tHtK/img.png)
구조는 AIController는 Enemy를 제어하고, Behavior Tree는 적 캐릭터의 행동 패턴을 정의하며, Blackboard는 Behavior Tree에서 사용되는 데이터를 저장하고 공유합니다. Enemy 캐릭터 클래스를 만들고 PossessBy함수와 , BehaviorTree , AIController를 멤버 변수를 선언해줍니다. 캐릭터마다 갖는 BehaviorTree가 다를 수 있기 때문에 캐릭터에서 BehaviorTree선언해줬습니다. cpp PossessedBy는 폰이 컨트롤러에 빙의되면 컨트롤러를 반환합니다. Cast해서 컨트롤러 가져온다음에 RunBehaviorTree를 통해 실행시켜줍니다. RunBehaviorTree는 비헤어트리를 실행하기 위해 반드시 해줘야 합니다. RunBe..