【Unity】【C#】《U3d人工智能编程精粹》学习心得--------操纵行为--路径跟随
增加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人工智能编程精粹》学习心得--------操纵行为--路径跟随相关推荐
- Unity人工智能编程精粹学习笔记 实现AI角色的自主移动——操控行为
目录 操控行为 操控行为编程的主要基类 个体AI角色的操控行为 群体的操控行为 个体与群体的操控行为组合 几种操控行为的编程解析 操控行为的快速实现 操控行为编程的其他问题 总结 源码工程下载链接 操 ...
- Unity人工智能编程精粹学习笔记 AI角色的复杂决策——行为树
要让游戏里的AI角色能执行预设的逻辑,最直接的方法是依照行为逻辑直接编写代码,但是这种方法工作量大,也容易出错.我们也可以用有限状态机来实现行为逻辑,但是有限状态机难以模块化,编写代码麻烦且容易出错. ...
- Unity人工智能编程精粹学习笔记 寻找最短路径并避开障碍物——A*寻路
目录 实现A*寻路的3种工作方式 基于单元的导航图 可视点导航图 导航网格 A*算法是如何工作的 A*算法的流程图 用一个实例来完全理解A*寻路算法 A*算法实例核心代码及项目工程 A*寻路的适用性 ...
- c语言程序培训,C语言编程培训学习心得
说到C语言学习真的是千言万语,可以说C语言在世界语言排行榜中位居前列,像一些操作系统.驱动软件.多媒体软件.大型游戏. 杀毒软件等等软件操作系统,都是C\C++的特区,对于其他语言来讲真的是望尘莫及. ...
- 游戏编程精粹学习 - 使用定点颜色插值模拟实时光照
终于有空看点新东西,这一篇在<游戏编程精粹1>的5.3节中,主要讲通过烘焙前后左右4个方向光照并插值,来代替顶点光照的做法 看了下原文例程的代码,似乎是放在cpu部分处理的顶点色,或可能只 ...
- 《Unity3D人工智能编程精粹》笔记
Unity3D人工智能架构模型 游戏AI的架构模型 FPS/TPS游戏中的AI解析 实现AI角色的自主移动--操控行为 Unity3D操控行为编程的主要基类 将AI角色抽象成一个质点--Vehicle ...
- python与人工智能编程-python学习(一)——python与人工智能
最近在朋友圈转起了一张图.抱着试一试的心态,我肝了些课程.都是与python相关的. 课程一:你不知道的python 讲师:王玉杰(混沌巡洋舰联合创始人 & web开发工程师 & 数据 ...
- 读人工智能发展报告学习心得(大纲)
涉及名词:AI(人工智能).ML(机器学习).DM(数据挖掘).KDD(知识发现).BP(反向传播).CNN(卷积神经网络).RNN(循环神经网络).GNN(图神经网络).AML(自动机器学习).ML ...
- 自学进微软——我的编程算法学习心得
各位少侠好,在下小牛,先简单做个自我介绍,我是非科班出身,通过自学的方式,获得了BATTMD多家和微软等多家互联网大厂的青睐. 最近自己在整理总结之前的学习经验,从基本的程序员学习路线到互联网面试中的 ...
- ETH ROS编程课程学习心得 vinbo2
ROS Melodic教程及机器人学开放课程整理汇总:https://blog.csdn.net/ZhangRelay/article/details/100086799 ROS系统很强大,学习起来坑 ...
最新文章
- IDEA报错解决:Error:(33, 35) java: -source 7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)
- java名 java_Java Syncrhonisers
- java中兴参与实参相同_中兴通讯_传输SDH试题(含答案)
- 超级有用的15个mysqlbinlog命令
- 坑哭了!老牌教育机构也崩盘,疑失联跑路,学员却还得继续还贷
- JavaScript Array 对象(length)方法 (contact、push,pop,join,map、reverse、slice、sort)
- 反射 字段_巧用 Protobuf 反射来优化代码,拒做 PB Boy
- Android : First step – Download and build
- 48页小米用户画像实战PPT
- 如何编写投标项目实施方案
- 如何写出高性能SQL语句?-性能设计沉思录(6)
- 【gitbub遇到的问题】新建工程后,本地无法push代码?提示鉴权失败
- 软件开发测试基础知识
- Python读取文本内容
- 第十一届“蓝狐网络杯”湖南省大学生计算机程序设计竞赛
- 计算机网络原理优秀视频
- 我们已经开发好了Magento的Ctopay(收汇宝)非3D网关
- 三款超火的国外壁纸应用,让你每天都用新手机
- 百面机器学习03-经典算法
- 微信相册显示服务器偷懒,微信上这样「偷懒」,比使唤男朋友还省心!
热门文章
- python生成的词云没有图案_python词云(词云图生成器)
- 【word】删除页眉横线
- Linux环境安装Postgresql报错。configure: error: zlib library not found
- 快速压缩Word文档的小妙招
- 计算机硬盘的内存单位换算,内存的单位换算
- sumif单列求和_Sumif、Sumifs单列多条件求和
- Hibernate中Entity对象的重新加载refresh
- 小微企业智能名片管理小程序
- PHP利用SMTP发送邮件,测试ok
- 台灯c语言,Jya无线台灯C 告诉你如何重新定义光的含义