行为树(Behavior Tree)

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

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

  1. 组合控制节点(Composite):一种将多个子节点组合在一起的节点,用于实现复杂的行为和决策逻辑。主要包括顺序节点(Sequencer)和选择节点(Selector)。顺序节点按顺序依次执行子节点,直到所有子节点都返回成功或者任意一个子节点返回失败为止,当有子节点返回失败则停止不再执行后续子节点。选择节点按照顺序执行子节点,当某个子节点返回成功时,停止执行并返回成功。
    在这里插入图片描述
    在这里插入图片描述

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

  3. 叶节点(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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值