行为树(Behavior Tree)是一种在游戏开发中广泛使用的AI设计模式,主要用于描述AI的行为和决策过程,实现更加智能和自然的游戏AI。它由多个节点组成,每个节点代表一个行为或决策,按照特定的方式连接在一起,形成一个树状结构。
在行为树中,根节点是AI的起点,通过遍历子节点来决策AI的行为。节点有以下三种状态:成功(Success)、失败(Failure)和运行(Running)。前两个通知其父节点其操作是成功还是失败。第三种意味着尚未确定成功或失败,并且该节点仍在运行。下次树被选择时,该节点将再次被选择,此时它将再次有机会成功,失败或继续运行。一般行为树还会携带一个Blackboard,用于存储节点的共享数据。
行为树的节点有以下几种主要原型:
-
组合控制节点(Composite):一种将多个子节点组合在一起的节点,用于实现复杂的行为和决策逻辑。主要包括顺序节点(Sequencer)和选择节点(Selector)。顺序节点按顺序依次执行子节点,直到所有子节点都返回成功或者任意一个子节点返回失败为止,当有子节点返回失败则停止不再执行后续子节点。选择节点按照顺序执行子节点,当某个子节点返回成功时,停止执行并返回成功。


-
修饰节点(Decorator):一种特殊的节点,它不执行具体的行为或决策,而是修饰其它节点的行为或决策。主要包括逆变节点(Inverter)和重复节点(Repeater)。逆变节点可以将子节点的结果倒转,比如子节点返回了失败,则这个修饰节点会向上返回成功,以此类推。重复节点重复执行其子节点指定的次数或者一直重复执行,直到其子节点返回成功或者失败。


-
叶节点(Leaf):树的最末端,执行具体行为的节点。
行为树通过模拟树状结构来描述AI的行为和决策过程,使得AI的行为更加灵活、自然和智能。
代码实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;
namespace BehaviourTree
{
public class BehaviourTree : MonoBehaviour
{
private Node root = null;
private Blackboard blackboard;
public Node Root
{
get
{
return root;
}
set
{
root= value;
}
}
void Start()
{
Init();
}
void Update()
{
if(root!=null&& gameObject!=null)
{
root.Evaluate(gameObject.transform,blackboard);
}
}
protected virtual void Init()
{
blackboard = new Blackboard();
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;
namespace BehaviourTree
{
//行为树共享数据
public class Blackboard
{
private Dictionary<string,object> Data;
public Blackboard()
{
Data = new Dictionary<string, object>();
}
//获取数据
public T Get<T>(string key)
{
if(Data.ContainsKey(key))
{
return (T)Data[key];
}
return default;
}
//添加数据
public void Add<T>(string key,T value)
{
if(Data.ContainsKey(key))
{
Data[key] = value;
}
else
{
Data.Add(key,value);
}
}
//删除数据
public void Remove(string key)

行为树是一种在游戏开发中用于描述AI行为和决策的模式,通过组合控制和修饰节点实现灵活、自然的AI。文章详细介绍了组合节点(如顺序和选择)、修饰节点(如逆变和重复)以及叶节点的使用,以及如何通过实际示例实现如巡逻和变红等行为。
6880

被折叠的 条评论
为什么被折叠?



