• 【转】手动写一个Behavior Designer任务节点


    http://blog.csdn.net/qq_33747722/article/details/53539532

    自己手写一个类似于CanSeeObject、Seek等任务节点并不是一件难事

    下面我介绍CanSeeObject和Seek任务节点的代码生成,基本成功实现了原来节点的功能

    LJLCanSeeObject代码如下:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. using UnityEngine;  
    2. using System.Collections;  
    3. using BehaviorDesigner.Runtime;  
    4. using BehaviorDesigner.Runtime.Tasks;  
    5.  
    6. #region 检测选中的游戏对象是否在视野内  
    7.   
    8. /// <summary>  
    9. ///CanSeeObject是在Conditional下的节点,因此自己手动写的一个类似于CanSeeObject的节点继承自Conditional,在这里命名为LJLCanSeeObject  
    10. /// </summary>  
    11. public class LJLCanSeeObject : Conditional  
    12. {  
    13.     /// <summary>  
    14.     /// 视野内检测的目标对象  
    15.     /// </summary>  
    16.     public Transform[] targets;  
    17.     /// <summary>  
    18.     /// 视野角度  
    19.     /// </summary>  
    20.     public float fieldOfViewAngle = 90;  
    21.     /// <summary>  
    22.     /// 视野距离(共享变量)  
    23.     /// </summary>  
    24.     public SharedFloat sharedViewDistance;  
    25.     /// <summary>  
    26.     /// 在视野内检测到的游戏对象位置(共享变量,在这里将检测到的游戏对象位置数据附给它)  
    27.     /// </summary>  
    28.     public SharedTransform target;  
    29.   
    30.     public override TaskStatus OnUpdate()  
    31.     {  
    32.         if (targets == null) return TaskStatus.Failure;  
    33.         foreach (var target in targets)  
    34.         {  
    35.             float distance = (target.position - transform.position).magnitude;  
    36.             float angle = Vector3.Angle(transform.forward, target.position - transform.position);  
    37.             if (distance < sharedViewDistance.Value && angle < fieldOfViewAngle * 0.5f)  
    38.             {  
    39.                 //将检测到的游戏对象位置数据附给共享变量  
    40.                 this.target.Value = target;  
    41.                 return TaskStatus.Success;  
    42.             }  
    43.         }  
    44.         return TaskStatus.Failure;  
    45.     }  
    46. }  
    47.  
    48. #endregion  

    LJLSeek代码如下:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. using UnityEngine;  
    2. using System.Collections;  
    3. using BehaviorDesigner.Runtime;  
    4. using BehaviorDesigner.Runtime.Tasks;  
    5.  
    6. #region 控制游戏物体到达目标位置  
    7.   
    8. public class MySeek : Action   
    9. {  
    10.     /// <summary>  
    11.     /// 行走速度(共享变量)  
    12.     /// </summary>  
    13.     public SharedFloat sharedSpeed;  
    14.     /// <summary>  
    15.     /// 目标位置(共享变量)  
    16.     /// </summary>  
    17.     public SharedTransform target;  
    18.     /// <summary>  
    19.     /// 到达目的地的距离(共享变量)  
    20.     /// </summary>  
    21.     public SharedFloat sharedArriveDistance = 0.1f;  
    22.     private float sqrArriveDistance;  
    23.   
    24.     public override void OnStart()   
    25.     {  
    26.         sqrArriveDistance = sharedArriveDistance.Value*sharedArriveDistance.Value;  
    27.     }  
    28.   
    29.   
    30.     //当进入到这个任务的时候,会一直调用这个方法,直到任务结束   
    31.     //返回一个 Success 或者 Failure 的状态,那么任务结束   
    32.     //返回一个Running的状态,则这个方法会继续调用  
    33.     public override TaskStatus OnUpdate()   
    34.     {  
    35.         if (target == null||target.Value==null)   
    36.         {  
    37.             return TaskStatus.Failure;  
    38.         }  
    39.   
    40.         transform.LookAt(target.Value.position);//直接朝向目标位置  
    41.         transform.position= Vector3.MoveTowards(transform.position, target.Value.position, sharedSpeed.Value*Time.deltaTime);  
    42.   
    43.         if ((target.Value.position - transform.position).sqrMagnitude < sqrArriveDistance)   
    44.         {  
    45.             //当距离目标位置的距离比较小时,认为到达了目标位置,直接return成功  
    46.             return TaskStatus.Success;  
    47.         }  
    48.   
    49.         return TaskStatus.Running;  
    50.     }  
    51. }  
    52. #endregion  

    接下来Conditionals条件节点有个LJLCanSeeObject节点可以选择使用

    Actions行为节点有个LJLSeek节点可以选择使用

  • 相关阅读:
    msbuild.exe保持打开状态,锁定文件
    angular中使用echarts并实现数据更新
    浅谈flexible.js移动端自适应方案
    centos7 安装
    尚硅谷Java基础篇(717集)
    auto 和 decltype
    一个简单的 socket 网络编程
    项目搭建过程中初始化mysql常遇到的问题总结
    超微服务器内存不在位
    UEFI模式下修改RAID组cache方法
  • 原文地址:https://www.cnblogs.com/mimime/p/6368621.html
Copyright © 2020-2023  润新知