本系列文章部分内容参考自 https://zhuanlan.zhihu.com/p/19890016?columnSlug=indiegamepixel
感谢原作者的知识分享

行为树包括 :
基础节点:BaseNode
前置条件节点:PreconditionNode
顺序节点:SequenceNode
并行节点:ParallelNode ( 当一个节点不通过就不执行 )
并行节点2:ParallelFlexibleNode ( 当所有节点不通过才不执行 )
选择节点: PrioritySelectorNode
逻辑节点:ActionNode
数据提供者: DataBase
行为树: BTree
实现:
基础节点:BaseNode
namespace BehaviorTree
{
public abstract class BaseNode
{
#region 字段
public string name;
protected List children; // 子节点
public PreconditionNode precondition; // 放行条件
public DataBase database; // 数据提供者
public float intervalTime = 0; // 冷却时间
private float intervalTimer = 0;
public bool activated; // 是否激活过了
#endregion
#region 属性
public List Children { get { return children; } }
//节点可行判断
public bool Evaluate { get { return activated && CheckTimer() && (precondition == null || precondition.Check()) && DoEvaluate(); } }
#endregion
public BaseNode() : this(null) { }
public BaseNode(PreconditionNode precondition) { this.precondition = precondition; }
#region 接口
///
/// 激活
///
///
public virtual void Activate(DataBase database)
{
if (activated)
return;
this.database = database;
if (precondition != null)
precondition.Activate(database);
if (children != null)
foreach (var n in children)
n.Activate(database);
activated = true;
}
///
/// 个性化可行
///
///
protected virtual bool DoEvaluate() { return true; }
///
/// 执行
///
///
public virtual NodeResult Tick() { return NodeResult.Ended; }
public virtual void Clear() { }
public virtual void AddChild(BaseNode node)
{
if (children == null)
children = new List();
if (node != null)
children.Add(node);
}
public virtual void RemoveChild(BaseNode node)
{
if (children != null && node != null && children.Contains(node))
children.Remove(node);
}
///
/// 是否冷却完成
///
///
private bool CheckTimer()
{
//当前时间-刚才的时间=过去的时间
if (Time.time - intervalTimer > intervalTime)
{
intervalTimer = Time.time;
return true;
}
return false;
}
#endregion
}
///
/// 节点结果
///
public enum NodeResult{
Ended = 1,
Running = 2
}
}
前置条件节点:PreconditionNode
namespace BehaviorTree
{
public abstract class PreconditionNode : BaseNode
{
public PreconditionNode() : base(null) { }
///
/// 是否通过条件
///
///
public abstract bool Check();
public override NodeResult Tick()
{
if (Check())
return NodeResult.Ended;
else
return NodeResult.Running;
}
}
}
数据提供者: DataBase
namespace BehaviorTree
{
///
/// 数据提供者
///
public class DataBase : MonoBehaviour
{
private List