メインコンテンツまでスキップ

BehaviourTree

以下は、Behaviour TreeBlackboardを実装するための各ファイルの説明と、AIController.csの内容を少し増やした解説です。

ファイル構成

BehaviourTree/
BTNode.cs
Selector.cs
Sequence.cs
TaskNode.cs
Blackboard/
Blackboard.cs
AIController.cs

各ファイルの説明

1. BTNode.cs

説明:
BTNodeは、Behaviour Treeの基本ユニットである「ノード」を表現する抽象クラスです。全てのBehaviour Treeノードは、このクラスを継承して、Executeメソッドを実装する必要があります。Executeメソッドは、ノードが成功したか失敗したかを示すbool値を返します。

内容:

namespace BehaviourTree
{
public abstract class BTNode
{
public abstract bool Execute();
}
}

2. Selector.cs

説明:
Selectorノードは、複数の子ノードを持ち、子ノードを順に実行します。子ノードのうち一つでも成功したら、Selectorノード全体が成功と見なされます。全ての子ノードが失敗した場合、Selectorノードも失敗と見なされます。

内容:

namespace BehaviourTree
{
public class Selector : BTNode
{
private BTNode[] nodes;
public Selector(params BTNode[] nodes)
{
this.nodes = nodes;
}

public override bool Execute()
{
foreach (var node in nodes)
{
if (node.Execute())
return true;
}
return false;
}
}
}

3. Sequence.cs

説明:
Sequenceノードは、複数の子ノードを持ち、子ノードを順に実行します。全ての子ノードが成功した場合、Sequenceノード全体が成功と見なされます。もし一つでも子ノードが失敗したら、Sequenceノードも失敗と見なされます。

内容:

namespace BehaviourTree
{
public class Sequence : BTNode
{
private BTNode[] nodes;
public Sequence(params BTNode[] nodes)
{
this.nodes = nodes;
}

public override bool Execute()
{
foreach (var node in nodes)
{
if (!node.Execute())
return false;
}
return true;
}
}
}

4. TaskNode.cs

説明:
TaskNodeは、具体的な処理を実行するためのノードです。このノードは、Func<bool>型のデリゲートを受け取り、それをExecuteメソッドで呼び出すことで、タスクを実行します。タスクの結果は、成功ならtrue、失敗ならfalseとして返されます。

内容:

namespace BehaviourTree
{
public class TaskNode : BTNode
{
private Func<bool> task;
public TaskNode(Func<bool> task)
{
this.task = task;
}

public override bool Execute()
{
return task.Invoke();
}
}
}

5. Blackboard.cs

説明:
Blackboardは、AIの「知識ベース」として機能するクラスで、AIエージェントが共有するデータを格納します。Dictionaryを用いてデータをキーと値のペアで保存し、必要なときに他のクラスやノードがデータにアクセスできます。これにより、各ノードが共通のデータに基づいて動作を決定できます。

内容:

namespace BlackboardSystem
{
public class Blackboard
{
private Dictionary<string, object> data = new Dictionary<string, object>();

public void SetData<T>(string key, T value)
{
data[key] = value;
}

public T GetData<T>(string key)
{
return (T)data[key];
}
}
}

6. AIController.cs

説明:
AIControllerは、ゲーム内のAIキャラクターにBehaviour TreeとBlackboardを使用して動作を制御するためのスクリプトです。Blackboardインスタンスを持ち、Behaviour Treeのノードを構築して、特定の条件やタスクを設定します。このクラスでは、キャラクターがどのように行動するかを定義し、ゲーム内でのAIの動作を実行します。

内容:

using UnityEngine;
using BehaviourTree; // Behaviour Treeのクラスを使用
using BlackboardSystem; // Blackboardクラスを使用

public class AIController : MonoBehaviour
{
private Blackboard blackboard;
private BTNode behaviourTree;

void Start()
{
// Blackboardの初期化
blackboard = new Blackboard();
blackboard.SetData("Health", 50);
blackboard.SetData("IsEnemyNear", false);

// Behaviour Treeの構築
behaviourTree = new Selector(
new Sequence(
new TaskNode(() => blackboard.GetData<int>("Health") <= 70),
new TaskNode(() => Heal())
),
new TaskNode(() => EngageEnemy())
);

// Behaviour Treeの実行
behaviourTree.Execute();
}

bool Heal()
{
// 回復行動の処理
Debug.Log("Healing...");
blackboard.SetData("Health", blackboard.GetData<int>("Health") + 20);
return true;
}

bool EngageEnemy()
{
// 敵との戦闘処理
if (blackboard.GetData<bool>("IsEnemyNear"))
{
Debug.Log("Engaging Enemy...");
return true;
}
return false;
}

void Update()
{
// 定期的にBehaviour Treeを評価
behaviourTree.Execute();
}
}

追加の解説:

  • Startメソッド内で、Blackboardに初期データを設定しています。例えば、Healthの値を50に設定し、IsEnemyNearfalseに設定しています。
  • HealメソッドとEngageEnemyメソッドは、それぞれキャラクターが回復するか、敵と戦闘を行うかを決定します。これらのメソッドはTaskNodeでラップされ、Behaviour Tree内で使用されています。
  • Updateメソッド内で、毎フレームBehaviour Treeが再評価され、状況に応じて適切な行動を取ります。




以下に、テキストベースのダイアグラムを作成しました。この図は、各クラスの関係性と階層構造を示しています。

+----------------+     uses     +-------------------+
| AIController |<-------------| Blackboard |
+----------------+ +-------------------+
|
| uses
|
v
+----------------+
| BTNode |
+----------------+
^
|
+----+----+----+
| | |
+--------+ +----------+ +----------+
|Selector| | Sequence | | TaskNode |
+--------+ +----------+ +----------+



Legend:
+-------+ +-----------+
| Class | or | Interface |
+-------+ +-----------+


<------------- : Uses/Depends on


^
| : Inherits from

この図では:

  1. AIControllerBlackboardBTNodeを使用しています。
  2. SelectorSequenceTaskNodeは全てBTNodeを継承しています。
  3. SelectorSequenceは複数のBTNodeを含むことができます(子ノード)。

この図は、プログラムの主要なコンポーネント間の関係を視覚化しています。AIControllerがどのようにBehaviour TreeとBlackboardを使用して、AIの動作を制御しているかが分かります。