怎么让网站被百度收录,沈阳男科医院哪家有名,网站开发有哪些要求,团队建设游戏网站行为树#xff08;Behavior Trees#xff09;是一种在游戏开发中广泛使用的AI设计模式#xff0c;主要用于描述AI的行为和决策过程#xff0c;实现更加智能和自然的游戏AI。它由多个节点组成#xff0c;每个节点代表一个行为或决策#xff0c;按照特定的方式连接在一起Behavior Trees是一种在游戏开发中广泛使用的AI设计模式主要用于描述AI的行为和决策过程实现更加智能和自然的游戏AI。它由多个节点组成每个节点代表一个行为或决策按照特定的方式连接在一起形成一个树状结构。 在行为树中根节点是AI的起点通过遍历子节点来决策AI的行为。节点有以下三种状态成功Success、失败Failure和运行Running。前两个通知其父节点其操作是成功还是失败。第三种意味着尚未确定成功或失败并且该节点仍在运行。下次树被选择时该节点将再次被选择此时它将再次有机会成功失败或继续运行。 行为树的节点有以下几种主要原型 组合控制节点Composite一种将多个子节点组合在一起的节点用于实现复杂的行为和决策逻辑。主要包括次序节点Sequencer和选择节点Selector。次序节点并行执行多个子节点直到所有子节点都返回成功或者任意一个子节点返回失败为止。选择节点按照顺序执行子节点当某个子节点返回成功时停止执行并返回成功。 修饰节点Decorator一种特殊的节点它不执行具体的行为或决策而是修饰其它节点的行为或决策。主要包括逆变节点Inverter和重复节点Repeater。逆变节点可以将子节点的结果倒转比如子节点返回了失败则这个修饰节点会向上返回成功以此类推。重复节点重复执行其子节点指定的次数或者一直重复执行直到其子节点返回成功或者失败。 叶节点Leaf树的最末端就是这些AI实际上去做事情的命令。
行为树通过模拟树状结构来描述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 Dictionarystring,object Data;public Blackboard(){Data new Dictionarystring, object();}//获取数据public T GetT(string key){if(Data.ContainsKey(key)){return (T)Data[key];}return default;}//添加数据public void AddT(string key,T value){if(Data.ContainsKey(key)){Data[key] value;}else{Data.Add(key,value);}}//删除数据public void Remove(string key){if(Data.ContainsKey(key)){Data.Remove(key);}else{Debug.Log(数据不存在 key);}}}
}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;namespace BehaviourTree
{//状态类型public enum Status{Running, //运行中Failure, // 失败Success, //成功}//节点基类public abstract class Node{protected Node parent;protected Status status;Status Status{get{return status;}set{status value;}}public Node(){}//声明节点状态返回方法public abstract Status Evaluate(Transform transform,Blackboard blackboard);}
}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;namespace BehaviourTree
{//复合节点类public abstract class Composite : Node{//子节点列表protected ListNode children new ListNode();protected int index;//子节点下标计数protected Composite(ListNode children){index 0;foreach(var child in children) {this.children.Add(child);}}}
}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;namespace BehaviourTree
{//修饰器节点public abstract class Decorator : Node{//子节点列表protected ListNode children;protected Decorator(ListNode children){children new ListNode(){};foreach(var child in children) {this.children.Add(child);}}}}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;namespace BehaviourTree
{//选择节点所有子节点都为失败则失败public class Selector : Composite{public Selector(ListNode children) : base(children){}//所有子节点都为失败则失败public override Status Evaluate(Transform transform, Blackboard blackboard){if(indexchildren.Count){index 0;return Status.Success;}var status children[index].Evaluate(transform,blackboard);switch(status){case Status.Success:index 0;return Status.Success;case Status.Failure:index1;if(indexchildren.Count){index 0;return Status.Failure;}return Status.Running;case Status.Running:return Status.Running;default:return Status.Failure;}}}
}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;namespace BehaviourTree
{//顺序节点所有子节点成功才成功public class Sequencer : Composite{public Sequencer(ListNode children) : base(children){}//所有子节点成功才成功public override Status Evaluate(Transform transform, Blackboard blackboard){if(indexchildren.Count){index 0;return Status.Success;}var status children[index].Evaluate(transform,blackboard);switch(status){case Status.Success:index1;if(indexchildren.Count){index 0;return Status.Success;}return Status.Running;case Status.Failure:return Status.Failure;case Status.Running:return Status.Running;default:return Status.Failure;}}}
}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;namespace BehaviourTree
{//任务节点,这里会处理对象具体行为逻辑叶节点public abstract class Task : Node{}
}简单使用 实现敌人在两点之间巡逻人物靠近会变红温并停止移动人物远离时继续巡逻
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;
using System.ComponentModel.Design.Serialization;
using System.Linq;namespace BehaviourTree
{public class EnemyBT : BehaviourTree{Vector3 aPos new Vector3(4.07999992f,-2.21000004f,-2);Vector3 bPos new Vector3(4.07999992f,1.65999997f,-2)protected override void Init(){//调用基类初始化base.Init();//创建变红节点TurnRed turnRed new TurnRed();//创建巡逻节点Patrol patrol new Patrol(aPos,bPos);//创建查找节点FindObject findObject new FindObject();//创建侦查节点子节点序列Node[] spyChildren {findObject,turnRed};//创建顺序节点用于执行侦查行为EnemySequencer enemySequencer new EnemySequencer(spyChildren.ToList());//创建根节点子节点序列Node[] selectorChildren {enemySequencer,patrol};//创建选择节点用于处理侦查和巡逻行为EnemySelector enemySelector new EnemySelector(selectorChildren.ToList());//将选择节点设置为根节点Root enemySelector;}}
}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;namespace BehaviourTree
{public class EnemySelector : Selector{public EnemySelector(ListNode children) : base(children){}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;namespace BehaviourTree
{public class EnemySequencer : Sequencer{public EnemySequencer(ListNode children) : base(children){}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;
using DG.Tweening;namespace BehaviourTree
{public class FindObject : Task{float radius 5f;int layer 512;public override Status Evaluate(Transform transform, Blackboard blackboard){Collider2D obj Physics2D.OverlapCircle(transform.position,radius,layer);if(obj!null){return Status.Success; }transform.gameObject.GetComponentSpriteRenderer().DOColor(Color.white,1);return Status.Failure;}}
} using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;
using DG.Tweening;namespace BehaviourTree
{//在aPoint和bPoint之间来回移动public class Patrol : Task{Vector3 aPoint;Vector3 bPoint;float speed 4f;Vector3 target;public Patrol(Vector3 aPos,Vector3 bPos){aPoint aPos;bPoint bPos;target aPoint;}public override Status Evaluate(Transform transform, Blackboard blackboard){if(Vector2.Distance(transform.position,target)0.1f){if(target aPoint){target bPoint;}else{target aPoint;}}else{transform.position Vector2.MoveTowards(transform.position,target,Time.deltaTime*speed);}return Status.Success;}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BehaviourTree;
using DG.Tweening;namespace BehaviourTree
{//变红public class TurnRed : Task{Vector3 bPoint;public override Status Evaluate(Transform transform, Blackboard blackboard){transform.gameObject.GetComponentSpriteRenderer().DOColor(Color.red,1);return Status.Success;}}
}