【转】手动写一个Behavior Designer任务节点
http://blog.csdn.net/qq_33747722/article/details/53539532
自己手写一个类似于CanSeeObject、Seek等任务节点并不是一件难事
下面我介绍CanSeeObject和Seek任务节点的代码生成,基本成功实现了原来节点的功能
LJLCanSeeObject代码如下:
- using UnityEngine;
- using System.Collections;
- using BehaviorDesigner.Runtime;
- using BehaviorDesigner.Runtime.Tasks;
- #region 检测选中的游戏对象是否在视野内
- /// <summary>
- ///CanSeeObject是在Conditional下的节点,因此自己手动写的一个类似于CanSeeObject的节点继承自Conditional,在这里命名为LJLCanSeeObject
- /// </summary>
- public class LJLCanSeeObject : Conditional
- {
- /// <summary>
- /// 视野内检测的目标对象
- /// </summary>
- public Transform[] targets;
- /// <summary>
- /// 视野角度
- /// </summary>
- public float fieldOfViewAngle = 90;
- /// <summary>
- /// 视野距离(共享变量)
- /// </summary>
- public SharedFloat sharedViewDistance;
- /// <summary>
- /// 在视野内检测到的游戏对象位置(共享变量,在这里将检测到的游戏对象位置数据附给它)
- /// </summary>
- 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;
- }
- }
- #endregion
LJLSeek代码如下:
- using UnityEngine;
- using System.Collections;
- using BehaviorDesigner.Runtime;
- using BehaviorDesigner.Runtime.Tasks;
- #region 控制游戏物体到达目标位置
- public class MySeek : Action
- {
- /// <summary>
- /// 行走速度(共享变量)
- /// </summary>
- public SharedFloat sharedSpeed;
- /// <summary>
- /// 目标位置(共享变量)
- /// </summary>
- public SharedTransform target;
- /// <summary>
- /// 到达目的地的距离(共享变量)
- /// </summary>
- public SharedFloat sharedArriveDistance = 0.1f;
- private float sqrArriveDistance;
- public override void OnStart()
- {
- sqrArriveDistance = sharedArriveDistance.Value*sharedArriveDistance.Value;
- }
- //当进入到这个任务的时候,会一直调用这个方法,直到任务结束
- //返回一个 Success 或者 Failure 的状态,那么任务结束
- //返回一个Running的状态,则这个方法会继续调用
- public override TaskStatus OnUpdate()
- {
- if (target == null||target.Value==null)
- {
- 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成功
- return TaskStatus.Success;
- }
- return TaskStatus.Running;
- }
- }
- #endregion
接下来Conditionals条件节点有个LJLCanSeeObject节点可以选择使用
Actions行为节点有个LJLSeek节点可以选择使用
【转】手动写一个Behavior Designer任务节点的更多相关文章
- 如何手动写一个Python脚本自动爬取Bilibili小视频
如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
- 手动写一个类支持foreach循环
之前初学时看过可以实现Iterable接口实现Iterator迭代器的支持,并且也支持foreach循环.现在学习了数据结构,手动写一个单链表支持foreach循环吧. 手写foreach循环步骤: ...
- 手动写一个Servlet
一.做一个类,派生自HttpServlet 1.导两个包 javax.servlet.*; javax.servlet.http.* 2.重写两个方法doGet,doPost 打开tomcat中的se ...
- java单链表的实现自己动手写一个单链表
单链表:单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是 ...
- 爬虫入门 手写一个Java爬虫
本文内容 涞源于 罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...
- 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)
昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...
- 12.源码分析—如何为SOFARPC写一个序列化?
SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...
- 让我手把手教你写一个强大、方便使用的 IOC 容器
一.介绍 1.介绍 最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾.于是,决定自己手动写一个 IOC 的框架.我们知道在 NetCore 的版本里面已经内置了 IOC 容 ...
随机推荐
- SPOJ - MATSUM Matrix Summation---二维树状数组
题目链接: https://vjudge.net/problem/SPOJ-MATSUM 题目大意: 二维数组,两种操作 SET 将某点设置成x SUM 求某个区域之和 解题思路: 这里用二维树状数组 ...
- CDQ分治入门
前言 \(CDQ\)分治是一个神奇的算法. 它有着广泛的用途,甚至在某些题目中还能取代\(KD-Tree\).树套树等恶心的数据结构成为正解,而且常数还小得多. 不过它也有一定的缺点,如必须离线操作, ...
- 【转】操作系统Unix、Windows、Mac OS、Linux的故事
电脑,计算机已经成为我们生活中必不可少的一部分.无论是大型的超级计算机,还是手机般小巧的终端设备,都跑着一个操作系统.正是这些操作系统,让那些硬件和芯片得意组合起来,让那些软件得以运行,让我们的世界在 ...
- Github的基本功能
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Fadeoc Khaos链接:http://www.zhihu.com/question/20070065/answer/30 ...
- nginx反向代理与正向代理的区别
http://blog.csdn.net/m13666368773/article/details/8060481
- PAT 乙级 1015
题目 题目地址:PAT 乙级 1015 题解 常规题,难点在于理清楚排序规则,通过比较简洁的方式进行编码: 在这里我选择使用vector进行存储,并使用sort方法排序,因为本题不是简单按照大小排序, ...
- dataTable 自定义排序
$("#id").DataTable({ aaSorting: [0, 'desc'], // 默认排序 aoColumnDefs: [ { "bSortable&qu ...
- git bush的一些基础命令
git bush的一些基础命令(不区分大小写) 通过命令创建本地仓库 首先自己需要手动建一个文件夹用于本地仓库 进行如下输入,使用cd跳转到刚刚创建的文件夹中 之后再输入 git init 即可创建 ...
- 从Mixin到hooks,谈谈对React16.7.0-alpha中即将引入的hooks的理解
为了实现分离业务逻辑代码,实现组件内部相关业务逻辑的复用,在React的迭代中针对类组件中的代码复用依次发布了Mixin.HOC.Render props等几个方案.此外,针对函数组件,在Reac ...
- MySQL 如何生成日期表
MySQL 如何生成日期表 在开发过程中,经常会遇到统计问题,通常交易信息都不是连续的,此时,统计出来的数据都是不连续的,所以提前生成一个时期表,当没有交易数据的时候填充0,就可以了,下面是生成日期表 ...