【转】手动写一个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节点可以选择使用

posted on 2017-02-05 21:36  mimime  阅读(236)  评论(0编辑  收藏  举报