Unity Engine

Behavior Tree - Custom Action

Aostols 2022. 7. 7. 16:21
반응형

기존에 이어서 새로운 태스크를 제작해 봅니다.

하고자 하는 목표는 다음과 같습니다.

1. 객체를 감지한다.

2. 감지된 객체가 있다면 객체까지 이동한다.

 

기존에 Cube Controller 에 있던 Target객체를 할당 해제 합니다.

 

또한 Cylinder의 레이어를 변경 해 줍니다.

Add Layer로 레이어 추가 해 주고,

Target 이라는 레이어를 추가 해 줍니다.

이제 선택된 레이어를 변경해서 올바르게 할당 되었는지 확인합니다.

 

새로운 Task 를 만들어 줍니다.

Node Canvas를 설치하였다면 위와 같은 메뉴가 추가 되었습니다.

여기서 New Task를 선택 해 줍니다.

 

Task Name, Namespace에 적당한 이름을 넣고 CREATE 버튼을 눌러 줍니다.

 

올바르게 생성 되었다면 OnInit, OnExecute, OnUpdate, OnStop, OnPause 가 만들어 진 상태입니다.

 

여기서 첫번째로 OnInit에서 필요한 초기화를 할것이고

두번째로 OnExecute에서 실제적인 처리를 할 예정입니다.

 

 

private CubeController cubeController;
protected override string OnInit(){
    cubeController = agent.GetComponent<CubeController>();
    return null;
}

protected override void OnExecute(){
    int max = 1;
    Collider[] results = new Collider[max];
    int resultNum = Physics.OverlapSphereNonAlloc(agent.transform.position, 10.0f, results, LayerMask.GetMask("Target"));

    for(int i=0; i< resultNum; ++i)
    {
        cubeController.Target = results[i].gameObject;
    }
    EndAction(true);
}

 

ActionTask를 상속받은 클래스이기 떄문에 agent라는 객체가 있고 이를 통하여 GameObject나 transform에 접근 할 수 있습니다.

 

OnInit 에서 CubeController에 대한 참조를 받아 옵니다.

OnInit은 다른 모든 함수들 보다 우선적으로 호출되기 때문에 여기서 초기화 해 줍니다.

 

이제 OnExecute에서 Physics.OverlapSphereNonAlloc으로 객체 감지를 해 줍니다.

레이어는 아까 지정했던 Target으로 합니다.

이제 감지가 되었다면 cubeController.Target을 감지된 객체의 GameObject로 할당 해 주게 됩니다.

 

스크립트가 완료 되었으니 BehaviorTree에 적용 해 줍니다.

 

Cube 객체를 보면 Behaviour Tree Owner라는 객체가 있는데 여기서 Edit Behaviour Tree버튼을 눌러 줍니다.

 

기존에 설정되어 있던것을 모두 지우고 다시 시작 합니다.

 

우클릭 하여 Action

Assign Action Task

 

올바르게 Task를 제작 하였다면 새로 제작된 태스크는 가장 위에 뜨고 있을 것 입니다.

CheckObject를 선택 해 줍니다.

이제 Start에서 CheckObject를 연결 해 줍니다.

우측 ACTION 패널에도 CheckObject가 잘 연결 된 것을 확인 할 수 있습니다.

 

이제 실행시켜서 결과를 보면 다음과 같습니다.

실행 전
실행 후

이제 감지가 잘 되는것을 확인 하였습니다.

 

추가로 감지된 객체로 이동하는 노드를 만들어 봅니다.

Condition 추가

gameobject를 검색하면 Check Variable(GameObject)가 있습니다.

선택 해 줍니다.

 

조건식은 Target != null 이 될것이기 때문에 Value A 의 드롭다운 버튼을 Cube->Target으로 설정 해 줍니다.

not null 이기 때문에 Invert Condition 체크해 주고 Value B는 None이 됩니다.

 

Condition은 추가 되었고 이동쪽을 추가하는데 Action 추가하고 Move Towards 검색합니다.

 

기존에 했던것 처럼 Target에서 우측 체크해서 Cube->Target연결 해 줍니다.

Wait Action Finish를 체크하여 액션이 끝날 떄 까지 기다려 줍니다.

 

완성된 트리의 모습입니다.

 

이제 실행 해 봅니다.

정상적으로 움직이는 것을 볼 수 있습니다.

 

여기서 Cylinder를 아주 멀리하면 감지가 되지 않아서 움직이지 않는 모습을 볼 수 있습니다.

Target 이 Null이기 때문에 2번쨰 컨디션에서 넘어가지 않는 것을 확인 할 수 있습니다.

 

 

반응형

'Unity Engine' 카테고리의 다른 글

[Unity]Physics 와 Layer  (0) 2022.11.01
Behavior Tree - AI 이동 디테일  (0) 2022.07.10
Behavior Tree - Node Canvas (2)  (0) 2022.07.02
Behavior Tree - Node Canvas (1)  (0) 2022.06.29
Unity - RaycastCommand, IJobParallelFor  (0) 2022.06.21