zoukankan      html  css  js  c++  java
  • Unity进阶:行为树 01

    版权申明:

    • 本文原创首发于以下网站:
    1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
    2. 优梦创客的官方博客:https://91make.top
    3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
    4. 『优梦创客』的微信公众号:umaketop
    • 您可以自由转载,但必须加入完整的版权声明

    行为树插件

    优势:小兵不仅可以按照该固定动画路径行进,也可以按照指定的路点行进,也可以行进过程中其他行为(攻击,防御)

    中断类型
    Lower Priority:打断右边优先级执行
    Self:只能中断自身的运行,进行判定,只有一开始can see object判定成功看到敌人执行seek,如果一开始就是直行seek就不进行判定,及时后面看到敌人也不能追踪因为不判定
    Both:都会执行

    MOVEMENT{
    cover掩护
    Evade躲避
    Flee逃跑
    Flock聚集
    Leader follow跟随移动
    Move towards向一个方向移动
    Patrol 巡逻
    Pursue 追逐
    Queue 一个一个通过
    Search 搜索
    Seek 搜寻
    Wander 闲逛
    }
    ACTIONS{
    Log 输出文本
    Idle 停一段时间
    Wait 等待时间任务
    }
    Composites {
    Sequence 从左往右执行,子任务执行成功才返回成功,有一个任务失败就返回失败
    Selector 依次执行成功后面不执行
    }
    Coditionals /Basic/Mathf/Float Comparision:判断大小第一个和第二个数,返回true,false
    Movement /partol :围绕点运动
    Movement /Seek:控制到达目标点
    Can See Object:看到东西

    using BehaviorDesigner.Runtime.Tasks;
    using BehaviorDesigner.Runtime;
    
    //这个任务脚本的作用就是控制游戏物体达到目标为止
    public class MySeek :Action{//这个任务的调用是behacior designe行为树控制
        public SharedTransform target;//这是我们要达到的目标位置
        //public float speed;
        public SharedFloat sharedSpeed;
        //public float arriveDistance = 0.1f;
        public SharedFloat sharedArriveDistance=0.1f;
        private float sqrArriveDistance;
    
        public override void OnStart()
        {
            sqrArriveDistance = sharedArriveDistance.Value * sharedArriveDistance.Value;
        }
        //当进入到这个人物的时候,会一直调用这个方法,一直到任务结束,你返回一个成功或者失败的状态,那么任务结束如果返回一个running状态,那这个方法会继续调用
        public override TaskStatus OnUpdate()
        {
            //这个方法的调用频率,默认是跟unity里面的帧保持一致的
            if (target == null||target.Value==null)//判断target是否有值
            {
                return TaskStatus.Failure;//失败状态
            }
            transform.LookAt(target.Value.position);//直接朝向目标位置
            transform.position = Vector3.MoveTowards(transform.position, target.Value.position, sharedSpeed.Value * Time.deltaTime);
            if((target.Value.position - transform.position).sqrMagnitude < sqrArriveDistance)
            {
                return TaskStatus.Success;//如果距离目标位置的距离较小,人未到达了目标位置,直接return成功
            }
            return TaskStatus.Running;//继续执行
        }
    }
    

    定义速度,距离,要到达的位置。判断是否可以运行,计算目标与自身距离,向目标移动,达到目标点结束。

      public Transform[] targets;//判断是否在视野内的目标
        public float fieldOfViewAngle = 90;
        public SharedFloat sharedViewDistance;
        public  SharedTransform target;//共享的变量
    
        public override TaskStatus OnUpdate()
        {
            if (targets == null) return TaskStatus.Failure;
            foreach(var target in targets)//遍历每一个目标是否满足调用
            {
                float distance = (target.position - transform.position).magnitude;//求距离目标减去当前自身坐标球的距离
                float angle = Vector3.Angle(transform.forward, target.position - transform.position);//求向量夹角,前方向减目标与主角之间的向量
                if (distance < sharedViewDistance.Value && angle < fieldOfViewAngle * 0.5f) {//夹角小于视野的一半,距离比视野距离小
                    this.target.Value = target;//共享变量赋值
                    return TaskStatus.Success;//成功
    
                }
            }
            return TaskStatus.Failure;//失败
        }
    

    判断距离,是否在视野内(夹角小于视野的一半)

  • 相关阅读:
    S1 商品信息管理系统
    用例图
    mvc使用mongodb时objectId序列化与反序列化
    windows下检測文件改变
    【Android 开发实例】时间管理APP开发之数据库设计
    设计模式 之 原型
    ANT安装及配置
    Java环境变量设置
    Win7安装软件,界面上中文显示乱码的解决方案
    Some perl tips
  • 原文地址:https://www.cnblogs.com/raymondking123/p/11410729.html
Copyright © 2011-2022 走看看