经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Unity进阶:行为树
来源:cnblogs  作者:优梦创客  时间:2019/8/26 9:51:08  对本文有异议

版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号:umaketop
  • 您可以自由转载,但必须加入完整的版权声明

行为树插件

优势:小兵不仅可以按照该固定动画路径行进,也可以按照指定的路点行进,也可以行进过程中其他行为(攻击,防御)

中断类型
Lower Priority:打断右边优先级执行
Self:只能中断自身的运行,进行判定,只有一开始can see object判定成功看到敌人执行seek,如果一开始就是直行seek就不进行判定,及时后面看到敌人也不能追踪因为不判定
Both:都会执行

MOVEMENT{
cover掩护
Evade躲避
Flee逃跑
Flock聚集
Leader follow跟随移动
Move towards向一个方向移动
Patrol 巡逻
Pursue 追逐
Queue 一个一个通过
Search 搜索
Seek 搜寻
Wander 闲逛
}
ACTIONS{
Log 输出文本
Idle 停一段时间
Wait 等待时间任务
}
Composites {
Sequence 从左往右执行,子任务执行成功才返回成功,有一个任务失败就返回失败
Selector 依次执行成功后面不执行
}
Coditionals /Basic/Mathf/Float Comparision:判断大小第一个和第二个数,返回true,false
Movement /partol :围绕点运动
Movement /Seek:控制到达目标点
Can See Object:看到东西

  1. using BehaviorDesigner.Runtime.Tasks;
  2. using BehaviorDesigner.Runtime;
  3. //这个任务脚本的作用就是控制游戏物体达到目标为止
  4. public class MySeek :Action{//这个任务的调用是behacior designe行为树控制
  5. public SharedTransform target;//这是我们要达到的目标位置
  6. //public float speed;
  7. public SharedFloat sharedSpeed;
  8. //public float arriveDistance = 0.1f;
  9. public SharedFloat sharedArriveDistance=0.1f;
  10. private float sqrArriveDistance;
  11. public override void OnStart()
  12. {
  13. sqrArriveDistance = sharedArriveDistance.Value * sharedArriveDistance.Value;
  14. }
  15. //当进入到这个人物的时候,会一直调用这个方法,一直到任务结束,你返回一个成功或者失败的状态,那么任务结束如果返回一个running状态,那这个方法会继续调用
  16. public override TaskStatus OnUpdate()
  17. {
  18. //这个方法的调用频率,默认是跟unity里面的帧保持一致的
  19. if (target == null||target.Value==null)//判断target是否有值
  20. {
  21. return TaskStatus.Failure;//失败状态
  22. }
  23. transform.LookAt(target.Value.position);//直接朝向目标位置
  24. transform.position = Vector3.MoveTowards(transform.position, target.Value.position, sharedSpeed.Value * Time.deltaTime);
  25. if((target.Value.position - transform.position).sqrMagnitude < sqrArriveDistance)
  26. {
  27. return TaskStatus.Success;//如果距离目标位置的距离较小,人未到达了目标位置,直接return成功
  28. }
  29. return TaskStatus.Running;//继续执行
  30. }
  31. }

定义速度,距离,要到达的位置。判断是否可以运行,计算目标与自身距离,向目标移动,达到目标点结束。

  1. public Transform[] targets;//判断是否在视野内的目标
  2. public float fieldOfViewAngle = 90;
  3. public SharedFloat sharedViewDistance;
  4. public SharedTransform target;//共享的变量
  5. public override TaskStatus OnUpdate()
  6. {
  7. if (targets == null) return TaskStatus.Failure;
  8. foreach(var target in targets)//遍历每一个目标是否满足调用
  9. {
  10. float distance = (target.position - transform.position).magnitude;//求距离目标减去当前自身坐标球的距离
  11. float angle = Vector3.Angle(transform.forward, target.position - transform.position);//求向量夹角,前方向减目标与主角之间的向量
  12. if (distance < sharedViewDistance.Value && angle < fieldOfViewAngle * 0.5f) {//夹角小于视野的一半,距离比视野距离小
  13. this.target.Value = target;//共享变量赋值
  14. return TaskStatus.Success;//成功
  15. }
  16. }
  17. return TaskStatus.Failure;//失败
  18. }

判断距离,是否在视野内(夹角小于视野的一半)

原文链接:http://www.cnblogs.com/raymondking123/p/11410729.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号