zoukankan      html  css  js  c++  java
  • 【转】手动写一个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节点可以选择使用

  • 相关阅读:
    统计nginx日志里访问次数最多的前十个IP
    while 格式化输出 运算符 字符编码
    Python 软件安装
    Python 基础
    Typora 基础的使用方法
    Django ORM (四) annotate,F,Q 查询
    Django 惰性机制
    Django ORM (三) 查询,删除,更新操作
    Django ORM (二) 增加操作
    Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
  • 原文地址:https://www.cnblogs.com/mimime/p/6368621.html
Copyright © 2011-2022 走看看