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

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

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

LJLCanSeeObject代码如下:

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

LJLSeek代码如下:

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

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

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

【转】手动写一个Behavior Designer任务节点的更多相关文章

  1. 如何手动写一个Python脚本自动爬取Bilibili小视频

    如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...

  2. 原来热加载如此简单,手动写一个 Java 热加载吧

    1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...

  3. 手动写一个类支持foreach循环

    之前初学时看过可以实现Iterable接口实现Iterator迭代器的支持,并且也支持foreach循环.现在学习了数据结构,手动写一个单链表支持foreach循环吧. 手写foreach循环步骤: ...

  4. 手动写一个Servlet

    一.做一个类,派生自HttpServlet 1.导两个包 javax.servlet.*; javax.servlet.http.* 2.重写两个方法doGet,doPost 打开tomcat中的se ...

  5. java单链表的实现自己动手写一个单链表

    单链表:单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是 ...

  6. 爬虫入门 手写一个Java爬虫

    本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...

  7. 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

    昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...

  8. 12.源码分析—如何为SOFARPC写一个序列化?

    SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...

  9. 让我手把手教你写一个强大、方便使用的 IOC 容器

    一.介绍 1.介绍 最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾.于是,决定自己手动写一个 IOC 的框架.我们知道在 NetCore 的版本里面已经内置了 IOC 容 ...

随机推荐

  1. Api容器在应用架构演化中的用途

    单层架构 在最开始编程的时候相信大家都写过下面这种架构,界面代码,业务代码,数据库连接全部在工程面完成.当然这种架构在处理很小的程序的时候依然有生命力 两层架构 后来我们发现数据访问的代码大量重复,应 ...

  2. iOS支付宝 9.x 版本首页效果

    http://www.jianshu.com/p/7516eb852cca 支付宝 9.x 版本首页效果 对于新版支付宝首页的产品功能这里就不说什么了,一大堆人吐槽,我们只想要一个好好的支付工具,阿里 ...

  3. 【BZOJ4571】[SCOI2016] 美味(主席树)

    点此看题面 大致题意: 给你一个序列\(a\),然后每次询问\(max_{i=l}^r(a_i+x)\ xor\ b\). 大致思路 首先,我们要知道一个简单的性质:位运算时位与位之间是互不影响的. ...

  4. 【BZOJ1057】[ZJOI2007] 棋盘制作(单调栈的运用)

    点此看题面 大致题意: 给你一个\(N*M\)的\(01\)矩阵,要求你分别求出最大的\(01\)相间的正方形和矩形(矩形也可以是正方形),并输出其面积. 题解 这题第一眼看去没什么思路,仔细想想,能 ...

  5. Mybatis-延迟加载和缓存

    延迟加载 概念: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表 ...

  6. 完结篇OO总结

    目录 前言 一.第四单元两次架构设计 二.架构设计及OO方法理解的演进 三.测试理解与实践的演进 四.课程收获 五.改进建议 前言 持续了17周的OO终于走向了尾声,想想寒假的时候连类都不知道是什么, ...

  7. centos下安装mariadb

    前言 一直都是前端,比较少玩服务器,最近买了阿里云,开始尝试centos,不得不说linux还是很有魅力的. 正文 google了一圈,决定安装mariadb,其实mariadb和mysql差不多,使 ...

  8. python 写 组合两两组合

    紧挨着 组合  a b c d  ----> ab ,bc ,cd portList = ['a', 'b', 'c', 'd'] for i, p in enumerate(portList) ...

  9. 项目实战14.1—ELK 企业内部日志分析系统

    本文收录在Linux运维企业架构实战系列 一.els.elk 的介绍 1.els,elk els:ElasticSearch,Logstash,Kibana,Beats elk:ElasticSear ...

  10. pandas库Series类型与基本操作

    pandas读取excel的类型是dataFrame,然后提取每一列是一个Series类型 Series类型包括index和values两部分 a = pd.Series({'a':1,'b':5}) ...