Unity中使物体自动寻路的方法
在做一个FPS游戏时,需要敌方自动找到玩家方位并向玩家移动,在查找资料(并走了不少坑)后,我试了三个方法,经测试,这三个方法都能实现自动寻路功能。
方法一:使用Mathf.Lerp()方法
代码很简单:
//在enemy.cs(即敌方的脚本)中更新如下代码:
Transmform m_transform; //获得敌人组件
//在Update()函数中插入如下代码
m_transform.position =
new Vector3(Mathf.Lerp(m_transform.position.x,m_layer.m_transform.position.x,m_speed * Time.delta)),
0,
Mathf.Lerp(m_transform.position.z,m_layer.m_transform.position.z,m_speed * Time.delta)));
//Mathf.Lerp(float a,float b,float t)函数表示:从点a以速度t移动至点b
这个方法似乎不需要自动寻路组件NavMeshAgent,不过NavMeshAgent用得更多一些,以下的两个方法都是基于NavMeshAgent的。
设置网格自动寻路的步骤:
1.将要进行Bake(烘焙)的场景设置为static(一定要保证Navigation Static是被勾选的):
2.通过Window -> Navgaition打开Navigation界面进行烘焙:
点击右下方的Bake(我第一次打开这个的时候一直没注意到这个Bake选项,还以为是这个选项没了!!!),等待它烘焙完成。还有另外一种烘焙方式,参见另一篇文章:http://blog.csdn.net/larry233/article/details/52022735
3.烘焙前:
烘焙后:
方法二:
简单到不知道怎么形容这个方法…
代码如下:
//先在Start()函数中获得玩家的组件:
m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
//将自动寻路的目标设置为玩家所在位置
GetComponent<NavMeshAgent>().destination = m_player.m_transform.position;
方法三:使用NavMeshAgent.Move()方法
这个方法是我最初使用的,但是出了很多意想不到的问题,我在正确烘焙场景后解决了这个问题,并使该方法正确执行了。代码如下:
NavMeshAgent m_agent; //寻路组件
... //省略中间代码
//在Start()函数中获得NavMeshAgent组件
void Start(){
...
m_agent = GetComponent<NavMeshAgent>();
}
//将敌方的速度转化为以s为单位
float speed = m_speed * Time.delta * 0.1f;
m_agent.Move(m_transform.TransformDirection(new Vector3(0,0,speed)));
注1:不管哪种方法,都要将这些代码文件和enemy绑定在一起。
注2:虽然这三种方法都可行,但由于我初学unity,对它们的性能优劣以及差别并不了解,因此这些还有待研究。
Unity中使物体自动寻路的方法的更多相关文章
- unity中实现物体在一定角度范围内来回旋转
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotate : ...
- Unity中Instantiate物体失效问题
才开始学Unity,开始总是这样用Instantiate函数: GameObject temp = (GameObject)Instantiate(bulletSource, transform.po ...
- Unity中的各种寻找GameObject方法
1.GameObject.Find():寻找Hierarchy面板中的activie 不为false的游戏对象: 路径如官方事例写法: public class ExampleClass : Mono ...
- Unity中的各种寻找GameObject方法归纳
1.GameObject.Find():寻找Hierarchy面板中的activie 不为false的游戏对象: 路径如官方事例写法: public class ExampleClass : Mono ...
- Unity中获取物体的子物体
如果想获取一级子节点 foreach (Transform child in this.transform) { Debug.Log(child.name); } 如果想获取所有子节点 foreach ...
- Unity中UI界面颤抖解决方法
将Render Mode中属性改为Screen Space - Camera 摄像机挂在Canvas属性下会出现UI界面颤抖的效果. UI界面颤抖解决方式:将Render Mode中属性改为Scree ...
- 关于unity中C#使用WaitForSeconds的方法
//我有一段这样的代码,我要实现3秒后执行内容,JS是这样写的 function Update () { load (); } function load (){ //等待3秒执行语句 yield W ...
- unity中让物体移动到鼠标点击地面任一点的位置(单击移动和双击暂停移动)并生成图标
using UnityEngine; using System.Collections.Generic; using UnityEngine.EventSystems; using UnityEngi ...
- Unity中激活子物体
void GetChildrenAndSetActive() { Transform[] imageTargetObjects = GetComponentsInChildren<Transfo ...
随机推荐
- Oracle- plsql developer如何查询SQL语句执行历史记录
相信很多在plsql developer调试oracle的朋友,经常会遇到在plsql developer执行的某一条SQL语句没有保存,那么我们在plsql developer下如何找到我们执行过的 ...
- USB移动硬盘WinPE启动盘的制作方法
USB移动硬盘WinPE启动盘的制作方法 软件:老九WinPE 老毛桃终于撒手无论版 发行时间:2007年9月11日 制作发行:老毛桃 作用:当系统坏了,无法进入时,用来做系统维护,备份文件.轻巧稳定 ...
- [Javascript + lodash] sortBy and sortedIndex
sortBy: var collection = ['John', 'Petteri', 'Antti', 'Joonas', 'Zhentian']; var sorted = _.sortBy(c ...
- iOS完美的网络状态判断工具
大多数App都严重依赖于网络,一款用户体验良好的的app是必须要考虑网络状态变化的.iOSSinger下一般使用Reachability这个类来检测网络的变化. Reachability 这个是苹果开 ...
- careercup-中等难度 17.6
17.6 给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的.注意:n越小越好,也就是说,找出符合条件的最短序列. 解法: 开始解题之前,让我们先确认一下 ...
- 学习笔记之ulimit
Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数.可以用ulimit -a 来显示当前的各种用户进程限制. Linux/Unix ul ...
- 信号之alarm和pause函数
使用alarm函数可以设置一个计时器,在将来某个指定的时间,该计时器会超时.当计时器超时时,产生SIGALRM信号.如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程. #incl ...
- mvc_ajax_for form
在上一篇介绍MVC中的Ajax实现方法的时候,曾经提到了除了使用Ajax HTML Helper方式来实现之外,Jquery也是实现Ajax的另外一种方案. 通过get方法实现AJax请求 View ...
- 【转】ubuntu修改IP地址和网关的方法
一.使用命令设置Ubuntu IP地址 1.修改配置文件blacklist.conf禁用IPV6 sudo vi /etc/modprobe.d/blacklist.conf 表示用vi编辑器(也可以 ...
- TCP/IP协议原理与应用笔记04:子网掩码
1. 子网掩码 是IP 参照物:分网段用的! 比如 192.168.0.1 和192.168.0.2(1).子网掩码为 255.255.255.0那么192.168.0.X 在同一个网段,能互相访问. ...