고도-행동-트리
기본 Godot 노드를 기반으로 하고 내장된 장면 트리 편집기를 사용하는 게임 AI용 동작 트리의 GDScript 구현입니다.
C# 버전 -> https://github.com/MadFlyFish/godot-behavior-tree-csharp
설치
- 'addons' 폴더를 프로젝트의 기본 디렉터리에 복사하세요.
- 프로젝트 설정에서 플러그인을 활성화한 다음 Godot를 다시 시작하세요. 그렇지 않으면 새 클래스를 인식하지 못할 것입니다(엔진의 버그입니다).
- 선택적으로 bt_example 폴더를 프로젝트의 기본 디렉터리로 드래그할 수도 있습니다.
- 작동하는 예제를 보려면 agent.tscn 장면을 실행하세요. ex_behavior_tree.tscn 장면은 트리가 어떻게 구성되는지 보여주는 예입니다.
지침:
- 노드 생성 아이콘을 클릭합니다. 사용 가능한 새 노드가 표시되어야 합니다(그렇지 않으면 Godot를 다시 시작하세요). BehaviourTree를 루트 노드로 사용해야 하며, 이 노드에는 하위 노드가 하나만 있어야 합니다. 이 하위 항목은 모두 BTNode 클래스에서 상속되는 BTNode 범주 아래의 노드 중 하나일 수 있습니다.
- 행동 트리를 생성한 후에는 AI(에이전트)의 소유자가 누구인지, 어떤 Blackboard를 사용하고 있는지 지정해야 합니다. 칠판은 어디에나 놓을 수 있으며(나무 외부에 있는 경우) 다른 나무 간에 공유할 수도 있습니다. 시스템은 칠판 데이터를 업데이트하는 방법과 시기를 결정할 수 있을 만큼 충분히 유연합니다. 예를 들어 칠판 업데이트를 처리하는 스크립트를 사용하여 일반 노드를 만들 수 있습니다. 신호 콜백이나 심지어 process()에서도 마찬가지입니다. 아니면 다른 곳, 심지어 트리 내부에서도 할 수 있습니다. 유지 관리하고 추적할 수 있는 방식으로 디자인하도록 하세요.
- 비헤이비어 트리는 일종의 성공 또는 실패 상태를 반환하는 각 자식을 실행하는 흐름을 가집니다. 성공적인 노드를 따르는 분기만 실행됩니다. BTNode는 성공 또는 실패를 반환해야 하며, 항복() 호출을 통해서만 실행을 일시 중단할 수 있으며, 그 후에는 실행이 완료될 때까지 실행 상태를 유지합니다. BTNode가 실행 상태에 있으면 트리는 모든 하위 항목이 실행을 완료할 때까지 점진적으로 실행을 일시 중지합니다(BTParallel만 제외). 이는 최적화 목적입니다.
- 트리의 흐름은 BTComposite에서 상속되는 BTSequence, BTSelector, BTRandomSelector, BTRandomSequence, BTParallel과 같은 소위 복합 노드에 의해 정의됩니다. 모든 자식이 성공하면 시퀀스는 성공하고 자식 중 하나가 실패하면 실패합니다. 선택자는 논리적으로 반대입니다. 하나의 자식이 성공하면 성공하고 모든 자식이 실패하면 실패합니다. 병렬은 모든 하위 항목을 실행하고 하위 항목이 실행을 완료할 때까지 기다리지 않고 항상 성공합니다. 기본 복합 노드는 모든 하위 노드를 실행하고 항상 성공하지만 실행이 완료될 때까지 기다립니다.
- AI 동작의 작업은 BTLeaf 노드에서 수행됩니다. BTLeaf를 추가한 다음 '스크립트 확장'을 수행하세요. 이제 _tick() 메서드를 재정의하여 이 스크립트에서 자신만의 동작을 정의할 수 있습니다. 당신의 행동은 여기에 갈 것입니다. 모범 사례를 알아보려면 기본 스크립트의 설명을 읽어보세요. 또한 BTLeaf에는 자식이 있어서는 안 된다는 점을 기억하세요.
- BTDecorator는 하위 노드의 실행을 사용자 정의하는 데 사용됩니다. 자녀는 한 명만 가질 수 있습니다.
- BTConditional은 가장 일반적인 유형의 데코레이터입니다. BTConditional을 추가하고 스크립트를 확장한 다음 _ pre_tick() 메서드를 재정의하여 자식이 실행될 조건을 정의합니다. 거기에 유용한 예가 있으므로 주석을 읽으십시오.
- BTGuard는 분기를 일시적으로 잠그는 데 사용할 수 있는 데코레이터입니다. 선택적으로 지정된 잠금 시간을 무시하는 잠금 해제 프로그램을 할당할 수 있습니다. 사물함을 지정하는 옵션도 있습니다. BTGuards는 불필요한 분기 및 반복을 방지하므로 행동을 매우 풍부하고 반응적이며 최적화할 수 있습니다.
- 다른 데코레이터를 사용하면 반복 실행, 틱 결과 반전 등을 수행할 수 있습니다. 데코레이터를 통해 실행을 사용자 정의하면 많은 작업을 수행할 수 있습니다.
- 좋은 방법은 제공된 노드를 사용하고 동작 트리의 디자인 패턴을 따르는 것입니다. 그러나 이것은 시각적 편집기가 없는 순수한 코드 기반 구현이므로 디자인을 많이 제어할 수 있으므로 오류가 발생할 수 있습니다. 이것은 몇 가지 "모범 사례"를 따르는 유용한 스크립트일 뿐이지만 몇 가지 기본 규칙이 아니라면 이에 국한되지 않습니다. 행동 트리를 디자인하는 방법을 결정하는 것은 당신에게 달려 있지만, 이를 잘못 사용하면 행동 트리 패턴의 힘을 활용할 수 없다는 점을 명심하십시오. (예를 들어, 모든 것에 기본 BTNode를 사용하고 매번 확장할 수도 있지만 엉망이 될 수도 있습니다.)
- 거대한 행동 트리를 가질 수 있지만 가장 좋은 방법은 Godot의 구성 요소 철학을 따르고 장면의 각 구성 요소에 대해 여러 개의 작은 행동 트리를 만드는 것입니다. 예를 들어 이동 컨트롤러용 트리, 무기 컨트롤러용 트리, 패스파인더 구성 요소용 트리 등이 있습니다. 동작 트리에는 칠판이 하나만 있을 수 있지만 동일한 칠판을 여러 트리에서 사용할 수 있으므로 이는 다음과 같습니다. 여러 개의 칠판을 만들지 않고도 여러 그루의 나무를 갖고 싶을 때 특히 유용합니다. 개인적으로 칠판을 분리된 구성 요소로 사용하는 이유는 동일한 데이터를 공유하지만 독립적으로 행동하는 적군 분대를 만들고 싶었기 때문에 이것이 사용 사례입니다. 더욱이, 나는 보통 내 액터에 여러 구성요소를 가지고 있고, 다른 트리에 대해 동일한 데이터베이스를 사용하고 싶습니다.