BehaviourTree
以下は、Behaviour TreeとBlackboardを実装するための各ファイルの説明と、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に設定し、IsEnemyNearをfalseに設定しています。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
この図では:
AIControllerがBlackboardとBTNodeを使用しています。Selector、Sequence、TaskNodeは全てBTNodeを継承しています。SelectorとSequenceは複数のBTNodeを含むことができます(子ノード)。
この図は、プログラムの主要なコンポーネント間の関係を視覚化しています。AIControllerがどのようにBehaviour TreeとBlackboardを使用して、AIの動作を制御しているかが分かります。