Behaviour Tree

This commit is contained in:
2025-10-10 18:09:23 +02:00
parent fe7dea3c7c
commit d1583c9f58
13 changed files with 208 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
namespace RebootKit.Engine.AI {
public class BehaviourNode {
public enum Status {
Success,
Failure,
Running
}
public readonly string Name;
public readonly List<BehaviourNode> Children = new List<BehaviourNode>();
protected int m_CurrentChild;
public BehaviourNode(string name) {
Name = name;
}
public void AddChild(BehaviourNode child) {
Children.Add(child);
}
public virtual Status Process(float dt) {
return Children[m_CurrentChild].Process(dt);
}
public virtual void Reset() {
m_CurrentChild = 0;
for (int i = 0; i < Children.Count; i++) {
Children[i].Reset();
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c1f6ae41eb91433f91a170b11173e7c3
timeCreated: 1760018098

View File

@@ -0,0 +1,19 @@
namespace RebootKit.Engine.AI {
public class BehaviourTree : BehaviourNode {
public BehaviourTree(string name) : base(name) {
}
public override Status Process(float dt) {
while (m_CurrentChild < Children.Count) {
Status status = Children[m_CurrentChild].Process(dt);
if (status != Status.Success) {
return status;
}
m_CurrentChild += 1;
}
return Status.Success;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4ceac2e33fd54beebadb6e844f2a7328
timeCreated: 1760017438

View File

@@ -0,0 +1,38 @@
using System;
namespace RebootKit.Engine.AI {
public interface IStrategy {
BehaviourNode.Status Process(float dt);
void Reset() {
}
}
public class Condition : IStrategy {
readonly Func<bool> m_Predicate;
public Condition(Func<bool> predicate) {
m_Predicate = predicate;
}
public BehaviourNode.Status Process(float dt) {
if (m_Predicate()) {
return BehaviourNode.Status.Success;
}
return BehaviourNode.Status.Failure;
}
}
public class ActionStrategy : IStrategy {
readonly Action m_Action;
public ActionStrategy(Action action) {
m_Action = action;
}
public BehaviourNode.Status Process(float dt) {
m_Action();
return BehaviourNode.Status.Success;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 85b48e6160ad4f039e9a5fc6524472fc
timeCreated: 1760108175

View File

@@ -0,0 +1,17 @@
namespace RebootKit.Engine.AI {
public class Leaf : BehaviourNode {
readonly IStrategy m_Strategy;
public Leaf(string name, IStrategy strategy) : base(name) {
m_Strategy = strategy;
}
public override Status Process(float dt) {
return m_Strategy.Process(dt);
}
public override void Reset() {
m_Strategy.Reset();
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ce3c5054b2fd45f6a5b26b74e735a622
timeCreated: 1760108171

View File

@@ -0,0 +1,37 @@
using System;
namespace RebootKit.Engine.AI {
public class Selector : BehaviourNode {
readonly Func<bool> m_Condition;
public Selector(string name, Func<bool> condition = null) : base(name) {
m_Condition = condition;
}
public override Status Process(float dt) {
if (m_Condition != null && !m_Condition()) {
return Status.Failure;
}
if (m_CurrentChild < Children.Count) {
Status status = Children[m_CurrentChild].Process(dt);
switch (status) {
case Status.Success:
Reset();
return Status.Success;
case Status.Failure:
m_CurrentChild += 1;
return Status.Running;
case Status.Running:
return Status.Running;
}
}
Reset();
return Status.Failure;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ab99366791464e3789770f26559fa59a
timeCreated: 1760101875

View File

@@ -0,0 +1,37 @@
using System;
namespace RebootKit.Engine.AI {
public class Sequence : BehaviourNode {
readonly Func<bool> m_Condition;
public Sequence(string name, Func<bool> condition = null) : base(name) {
m_Condition = condition;
}
public override Status Process(float dt) {
if (m_Condition != null && !m_Condition()) {
return Status.Failure;
}
if (m_CurrentChild < Children.Count) {
Status status = Children[m_CurrentChild].Process(dt);
switch (status) {
case Status.Success:
m_CurrentChild += 1;
return m_CurrentChild == Children.Count ? Status.Success : Status.Running;
case Status.Failure:
Reset();
return Status.Failure;
case Status.Running:
return Status.Running;
}
}
Reset();
return Status.Success;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c49882ec0f3b4f28a2ed3491967fa966
timeCreated: 1760101518