增加Steering的派生类

----SteeringForFollowPath类    路径跟随行为类

路径跟随行为类解读:

行为准备:

①记录全部路径点,统计路径点数。

②获取下一个路径点,并获取当前是几号路径点。(用来标志是否为终点)

准备是否到达目标点的条件:

①与路径点的距离小于某个值,判断为已经到达路点  arriveDistance   sqrArriveDistance

通过判断是否到达进行切换下一个路径点

通过判断是否是否到达最终点来判断是否执行靠近行为抵达行为

产生疑问:

Vector3.magnitude  与 Vector3.sqrMagnitude 的运算速度问题

在官方文档说用SqrMagnitude比较速度会比较快.

可是我在Unity中测试这两个方法,花费时间还是相同的。

(没空测试,这里留白,一切还是按官方文档的)

测试代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Diagnostics;
using System;public class TestSqr : MonoBehaviour {public Vector3 v3 = new Vector3(1, 2, 3);// Use this for initializationvoid Start () {Stopwatch sw = new Stopwatch();sw.Start();//for(int i = 0; i < 1000000000; i++)//{//    float sqr = v3.sqrMagnitude;//}sw.Stop();TimeSpan time2 = sw.Elapsed;print(time2);Stopwatch sw2 = new Stopwatch();sw2.Start();//for (int i = 0; i < 1000000000; i++)//{//    float v = v3.magnitude;//}sw2.Stop();TimeSpan time3 = sw.Elapsed;print(time3);}
}

案例代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SteeringForFollowPath : Steering {//节点数组来表示路径public GameObject[] waypoints;//目标点private Transform target;//当前路点private int currentNode;//与路点的距离小于这个值时,认为已经到达,可以向下一个路点触发private float arriveDistance;private float sqrArriveDistance;//路点的数量private int numberOfNodes;//操控力private Vector3 force;//预期速度private Vector3 desiredVelocity;private Vehicle m_vehicle;private float maxSpeed;private bool isPlanar;//当与目标小于这个距离时,开始减速public float slowDownDistance;// Use this for initializationvoid Start () {numberOfNodes = waypoints.Length;m_vehicle = GetComponent<Vehicle>();maxSpeed = m_vehicle.maxSpeed;isPlanar = m_vehicle.isPlanar;//设置当前路点为第0个路点currentNode = 0;//设置当前路点为目标点target = waypoints[currentNode].transform;arriveDistance = 1.0f;sqrArriveDistance = arriveDistance * arriveDistance;}public override Vector3 Force(){force = new Vector3(0, 0, 0);Vector3 dist = target.position - transform.position;if (isPlanar)dist.y = 0;//如果当前路点已经是最后一个路点了if (currentNode == numberOfNodes - 1){//如果与当前路点的距离大于减速距离if (dist.magnitude > slowDownDistance){//求出预期速度desiredVelocity = dist.normalized * maxSpeed;//计算操控向量force = desiredVelocity - m_vehicle.velocity;}else{//与当前路点距离小于减速距离,开始减速,计算操控向量desiredVelocity = dist - m_vehicle.velocity;force = desiredVelocity - m_vehicle.velocity;}}else{//不是最后一个路点if (dist.sqrMagnitude < sqrArriveDistance){//如果与当前路点距离的平方小于到达距离的平方//可以开始靠近下一个路点,将下一个路点设置为目标点currentNode++;target = waypoints[currentNode].transform;}//计算预期速度和操控向量desiredVelocity = dist.normalized * maxSpeed;force = desiredVelocity - m_vehicle.velocity;}return force;}
}

参考书籍:《unity3d人工智能编程精粹》 王洪源等著

【Unity】【C#】《U3d人工智能编程精粹》学习心得--------操纵行为--路径跟随相关推荐

  1. Unity人工智能编程精粹学习笔记 实现AI角色的自主移动——操控行为

    目录 操控行为 操控行为编程的主要基类 个体AI角色的操控行为 群体的操控行为 个体与群体的操控行为组合 几种操控行为的编程解析 操控行为的快速实现 操控行为编程的其他问题 总结 源码工程下载链接 操 ...

  2. Unity人工智能编程精粹学习笔记 AI角色的复杂决策——行为树

    要让游戏里的AI角色能执行预设的逻辑,最直接的方法是依照行为逻辑直接编写代码,但是这种方法工作量大,也容易出错.我们也可以用有限状态机来实现行为逻辑,但是有限状态机难以模块化,编写代码麻烦且容易出错. ...

  3. Unity人工智能编程精粹学习笔记 寻找最短路径并避开障碍物——A*寻路

    目录 实现A*寻路的3种工作方式 基于单元的导航图 可视点导航图 导航网格 A*算法是如何工作的 A*算法的流程图 用一个实例来完全理解A*寻路算法 A*算法实例核心代码及项目工程 A*寻路的适用性 ...

  4. c语言程序培训,C语言编程培训学习心得

    说到C语言学习真的是千言万语,可以说C语言在世界语言排行榜中位居前列,像一些操作系统.驱动软件.多媒体软件.大型游戏. 杀毒软件等等软件操作系统,都是C\C++的特区,对于其他语言来讲真的是望尘莫及. ...

  5. 游戏编程精粹学习 - 使用定点颜色插值模拟实时光照

    终于有空看点新东西,这一篇在<游戏编程精粹1>的5.3节中,主要讲通过烘焙前后左右4个方向光照并插值,来代替顶点光照的做法 看了下原文例程的代码,似乎是放在cpu部分处理的顶点色,或可能只 ...

  6. 《Unity3D人工智能编程精粹》笔记

    Unity3D人工智能架构模型 游戏AI的架构模型 FPS/TPS游戏中的AI解析 实现AI角色的自主移动--操控行为 Unity3D操控行为编程的主要基类 将AI角色抽象成一个质点--Vehicle ...

  7. python与人工智能编程-python学习(一)——python与人工智能

    最近在朋友圈转起了一张图.抱着试一试的心态,我肝了些课程.都是与python相关的. 课程一:你不知道的python 讲师:王玉杰(混沌巡洋舰联合创始人 & web开发工程师 & 数据 ...

  8. 读人工智能发展报告学习心得(大纲)

    涉及名词:AI(人工智能).ML(机器学习).DM(数据挖掘).KDD(知识发现).BP(反向传播).CNN(卷积神经网络).RNN(循环神经网络).GNN(图神经网络).AML(自动机器学习).ML ...

  9. 自学进微软——我的编程算法学习心得

    各位少侠好,在下小牛,先简单做个自我介绍,我是非科班出身,通过自学的方式,获得了BATTMD多家和微软等多家互联网大厂的青睐. 最近自己在整理总结之前的学习经验,从基本的程序员学习路线到互联网面试中的 ...

  10. ETH ROS编程课程学习心得 vinbo2

    ROS Melodic教程及机器人学开放课程整理汇总:https://blog.csdn.net/ZhangRelay/article/details/100086799 ROS系统很强大,学习起来坑 ...

最新文章

  1. IDEA报错解决:Error:(33, 35) java: -source 7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)
  2. java名 java_Java Syncrhonisers
  3. java中兴参与实参相同_中兴通讯_传输SDH试题(含答案)
  4. 超级有用的15个mysqlbinlog命令
  5. 坑哭了!老牌教育机构也崩盘,疑失联跑路,学员却还得继续还贷
  6. JavaScript Array 对象(length)方法 (contact、push,pop,join,map、reverse、slice、sort)
  7. 反射 字段_巧用 Protobuf 反射来优化代码,拒做 PB Boy
  8. Android : First step – Download and build
  9. 48页小米用户画像实战PPT
  10. 如何编写投标项目实施方案
  11. 如何写出高性能SQL语句?-性能设计沉思录(6)
  12. 【gitbub遇到的问题】新建工程后,本地无法push代码?提示鉴权失败
  13. 软件开发测试基础知识
  14. Python读取文本内容
  15. 第十一届“蓝狐网络杯”湖南省大学生计算机程序设计竞赛
  16. 计算机网络原理优秀视频
  17. 我们已经开发好了Magento的Ctopay(收汇宝)非3D网关
  18. 三款超火的国外壁纸应用,让你每天都用新手机
  19. 百面机器学习03-经典算法
  20. 微信相册显示服务器偷懒,微信上这样「偷懒」,比使唤男朋友还省心!

热门文章

  1. python生成的词云没有图案_python词云(词云图生成器)
  2. 【word】删除页眉横线
  3. Linux环境安装Postgresql报错。configure: error: zlib library not found
  4. 快速压缩Word文档的小妙招
  5. 计算机硬盘的内存单位换算,内存的单位换算
  6. sumif单列求和_Sumif、Sumifs单列多条件求和
  7. Hibernate中Entity对象的重新加载refresh
  8. 小微企业智能名片管理小程序
  9. PHP利用SMTP发送邮件,测试ok
  10. 台灯c语言,Jya无线台灯C 告诉你如何重新定义光的含义