如何使用Unity做游戏中的寻路汽车导航寻路

1,利用navigation内置的运动控制2,自己控制运动3,运行时构建导航网格重要组件NavMesh Agent(导航网格代理 挂载在怪物上)off-Mesh Link (网格链接)NavMesh Obstacle(障碍,不经常移动勾选Carve)using System.C
using System.Collections.G
using UnityE
using UnityEngine.AI;
public class controlPlayer : MonoBehaviour {
private NavMeshA
public float rotateSmoothing = 7;
//转向速度
public float speed = 5;
// Use this for initialization
void Start () {
nav = this.GetComponent&NavMeshAgent&();
nav.updatePosition =
//禁用导航控制的运动和转向
nav.updateRotation =
// Update is called once per frame
void Update () {
if (Input.GetMouseButton(0))
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
bool isOn= Physics.Raycast(ray,out hit);
nav.SetDestination(hit.point);
//nav.destination = hit.
//通过导航控制器控制
nav.nextPosition = transform.
if (nav.remainingDistance & 0.5f)
nav.nextPosition = this.transform.
//把当前位置的设置给导航器的位置(灵魂)
this.transform.position=nav.nextP
//在把导航器的位置设置为当前的位置
this.transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(nav.desiredVelocity), rotateSmoothing * Time.deltaTime);
//nav.desiredVelocity 是最短路径的目标方向
this.transform.Translate(Vector3.forward * speed * Time.deltaTime);
利用进行实时Bake(NavMeshSurface挂载在地形上)using System.C
using System.Collections.G
using UnityE
using UnityEngine.AI;
public class PlaceBuilder : MonoBehaviour {
public GameObject builderP
private NavMeshS
// Use this for initialization
void Start () {
surface = GetComponent&NavMeshSurface&();
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(1))
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray, out hit))
GameObject go = GameObject.Instantiate(builderPrefab, hit.point, Quaternion.identity);
go.transform.parent = this.
surface.BuildNavMesh();
//更新寻路
unity导航系统使用(随记)
Unity3D开发敌人自动攻击和自动寻路
Unity之Navigation导航系统
Unity3D 小地图 (1) 等比例映射
Unity -- 导航寻路系统
没有更多推荐了,A*寻路算法在Unity中的简单应用 - 简书
A*寻路算法在Unity中的简单应用
在使用Unity开发游戏项目时,经常会遇到一些角色的导航需求,然而Unity提供给我们的NavMesh+NavMeshAgent并不能很好帮我们实现,且寻路网格的烘焙,以及在导航过程中寻路网格的检测,都是非常消耗性能的,因此在很多企业项目中,会自己写一下高效的寻路算法来完成需求,其中有一种就是A*寻路算法。A*寻路算法是一种启发式算法,从所有可以行走的路径中找出估量代价最小的,递归每步这样的操作,最终到达目标点。
A寻路算法的估量代价*
在A*算法中核心的寻路依据就是估量代价,在A*中通常用 F 表示。
其中G表示当前点到起始点的估量代价,H表示当前点到终点的代价。
图中格子左下角为G值,右下角为H值,左上角为F值
因此从当前格子周边的八个格子中找到下一步所走的格子,依据F值,当F值相同时随机选择。
当然在寻路过程中,会有障碍,不能通过,通过可以行走的格子走到终点。下图中绿色为起点,红色为终点,蓝色是障碍,浅蓝边框是参与计算的格子,A*就是通过这样的一系列计算完成的最优寻路。
A*行走路线
下面我写了一个小例子,方便大家学习。
首先需要创建一个格子类Grid
using UnityE
using System.C
using System.Collections.G
/// &summary&
/// 格子类型
/// &/summary&
public enum GridType
//正常类型
//障碍物类型
//起点类型
//终点类型
/// &summary&
/// 格子类(实现IComparable方便排序)
/// &/summary&
public class Grid : IComparable
//格子坐标x-y
//格子A*三属性f-g-h
//格子类型
public GridT
//格子的归属(父格子)
//构造赋值
public Grid (int x, int y)
/// &summary&
/// 实现排序接口方法
/// &/summary&
/// &returns&The to.&/returns&
/// &param name="obj"&Object.&/param&
public int CompareTo (object obj)
Grid grid = (Grid)
if (this.f & grid.f) {
return -1;
if (this.f & grid.f) {
然后主逻辑AStar类
using UnityE
using System.C
using System.Collections.G
public class MyAStar : MonoBehaviour
/// &summary&
/// 单例脚本
/// &/summary&
public static MyAS
//参考物体预设体
public GameO
//格子数组
public Grid[,]
//格子数组对应的参考物(方块)对象
public GameObject[,]
//开启列表
public ArrayList openL
//关闭列表
public ArrayList closeL
//目标点坐标
public int targetX;
public int targetY;
//起始点坐标
public int startX;
public int startY;
//格子行列数
private Stack&string& parentL
//基础物体
//流颜色参数
private float alpha = 0;
private float incrementPer = 0;
void Awake ()
instance =
plane = GameObject.Find ("Plane").
start = GameObject.Find ("Start").
end = GameObject.Find ("End").
obstacle = GameObject.Find ("Obstacle").
parentList = new Stack&string& ();
openList = new ArrayList ();
closeList = new ArrayList ();
/// &summary&
/// 初始化操作
/// &/summary&
void Init ()
//计算行列数
int x = (int)(plane.localScale.x * 20);
int y = (int)(plane.localScale.z * 20);
grids = new Grid[x, y];
objs = new GameObject[x, y];
//起始坐标
Vector3 startPos =
new Vector3 (plane.localScale.x * -5, 0, plane.localScale.z * -5);
//生成参考物体(Cube)
for (int i = 0; i & i++) {
for (int j = 0; j & j++) {
grids [i, j] = new Grid (i, j);
GameObject item = (GameObject)Instantiate (reference,
new Vector3 (i * 0.5f, 0, j * 0.5f) + startPos,
Quaternion.identity);
item.transform.GetChild (0).GetComponent&Reference& ().x =
item.transform.GetChild (0).GetComponent&Reference& ().y =
objs [i, j] =
/// &summary&
/// A*计算
/// &/summary&
IEnumerator Count ()
//等待前面操作完成
yield return new WaitForSeconds (0.1f);
//添加起始点
openList.Add (grids [startX, startY]);
//声明当前格子变量,并赋初值
Grid currentGrid = openList [0] as G
//循环遍历路径最小F的点
while (openList.Count & 0 && currentGrid.type != GridType.End) {
//获取此时最小F点
currentGrid = openList [0] as G
//如果当前点就是目标
if (currentGrid.type == GridType.End) {
Debug.Log ("Find");
//生成结果
GenerateResult (currentGrid);
//上下左右,左上左下,右上右下,遍历
for (int i = -1; i &= 1; i++) {
for (int j = -1; j &= 1; j++) {
if (i != 0 || j != 0) {
//计算坐标
int x = currentGrid.x +
int y = currentGrid.y +
//如果未超出所有格子范围,不是障碍物,不是重复点
if (x &= 0 && y &= 0 && x & row && y & colomn
&& grids [x, y].type != GridType.Obstacle
&& !closeList.Contains (grids [x, y])) {
int g = currentGrid.g + (int)(Mathf.Sqrt ((Mathf.Abs (i) + Mathf.Abs (j))) * 10);
//与原G值对照
if (grids [x, y].g == 0 || grids [x, y].g & g) {
grids [x, y].g =
//更新父格子
grids [x, y].parent = currentG
grids [x, y].h = Manhattan (x, y);
grids [x, y].f = grids [x, y].g + grids [x, y].h;
//如果未添加到开启列表
if (!openList.Contains (grids [x, y])) {
openList.Add (grids [x, y]);
//重新排序
openList.Sort ();
//完成遍历添加该点到关闭列表
closeList.Add (currentGrid);
//从开启列表中移除
openList.Remove (currentGrid);
//如果开启列表空,未能找到路径
if (openList.Count == 0) {
Debug.Log ("Can not Find");
/// &summary&
/// 生成结果
/// &/summary&
/// &param name="currentGrid"&Current grid.&/param&
void GenerateResult (Grid currentGrid)
//如果当前格子有父格子
if (currentGrid.parent != null) {
//添加到父对象栈(即结果栈)
parentList.Push (currentGrid.x + "|" + currentGrid.y);
//递归获取
GenerateResult (currentGrid.parent);
/// &summary&
/// 显示结果
/// &/summary&
/// &returns&The result.&/returns&
IEnumerator ShowResult ()
//等待前面计算完成
yield return new WaitForSeconds (0.3f);
//计算每帧颜色值增量
incrementPer = 1 / (float)parentList.C
//展示结果
while (parentList.Count != 0) {
string str = parentList.Pop ();
yield return new WaitForSeconds (0.3f);
//拆分获取坐标
string[] xy = str.Split (new char[]{ '|' });
int x = int.Parse (xy [0]);
int y = int.Parse (xy [1]);
//当前颜色值
alpha += incrementP
//以颜色方式绘制路径
objs [x, y].transform.GetChild (0).GetComponent&MeshRenderer& ().material.color
= new Color (1 - alpha, alpha, 0, 1);
/// &summary&
/// 曼哈顿方式计算H值
/// &/summary&
/// &param name="x"&The x coordinate.&/param&
/// &param name="y"&The y coordinate.&/param&
int Manhattan (int x, int y)
return (int)(Mathf.Abs (targetX - x) + Mathf.Abs (targetY - y)) * 10;
void Start ()
StartCoroutine (Count ());
StartCoroutine (ShowResult ());
最后是参考预设体方块的简单实现
using UnityE
using System.C
using UnityEngine.UI;
public class Reference : MonoBehaviour
//颜色材质区分
public Material startM
public Material endM
public Material obstacleM
//显示信息Text
//当前格子坐标
void Awake ()
text = GameObject.Find ("Text").GetComponent&Text& ();
//判断当前格子的类型
void OnTriggerEnter (Collider other)
if (other.name == "Start") {
GetComponent&MeshRenderer& ().material = startM
MyAStar.instance.grids [x, y].type = GridType.S
MyAStar.instance.openList.Add (MyAStar.instance.grids [x, y]);
MyAStar.instance.startX =
MyAStar.instance.startY =
} else if (other.name == "End") {
GetComponent&MeshRenderer& ().material = endM
MyAStar.instance.grids [x, y].type = GridType.E
MyAStar.instance.targetX =
MyAStar.instance.targetY =
} else if (other.name == "Obstacle") {
GetComponent&MeshRenderer& ().material = obstacleM
MyAStar.instance.grids [x, y].type = GridType.O
/// &summary&
/// 鼠标点击显示当前格子基础信息
/// &/summary&
void OnMouseDown ()
text.text = "XY(" + x + "," + y + ")" + "\n" +
"FGH(" + MyAStar.instance.grids [x, y].f + "," +
MyAStar.instance.grids [x, y].g + "," +
MyAStar.instance.grids [x, y].h + ")";
text.color = GetComponent&MeshRenderer& ().material.
多障碍效果图
多障碍效果图
遍历流程监测
其实A*遍历的格子还是蛮多的,因为曼哈顿计算的H值是不考虑障碍物的,所以会有很多格子的F值会很小,但不一定此时很小的F值格子就是要走的路径,最终的最优路径是通过,终点格子反推回来的,就如代码中GenerateResult递归方法所示,为了方便大家理解,我做了一个小动画,方便大家对A*的理解。(粉色是此时F值最小的格子,蓝色是最小F值格子周边正在遍历的格子,黄色格子是从未设置父物体,第一次被遍历的格子)
遍历流程监测
A*只是游戏算法中的凤毛麟角,其中的逻辑也相对简单,所以想要提升编码质量,想要写出高效的游戏逻辑,还需要更多的算法学习。还是那个道理,编程 = 数据结构 + 算法,不带班的这段时间我会尽量分享一些东西给大家,同仁们加油。本文项目下载链接: 密码: rbs1
紧接上一篇《Unity NavMesh寻路 & A* (A star)分析及实例应用(一)》,本文重点讲解A* 算法在Unity中的寻路实现(当然寻路算法不止 A* 这一种, 还有递归, 非递归, 广度优先, 深度优先, 使用堆栈等等, 有兴趣的可以研究研究~~),文尾会将...
回想起曾学习A-star寻径算法时,难以透彻理解其原理和机制,但随着对图和搜索算法的理解愈发深入,近期重拾A-star时发现并没有那么困难。因此对A-star算法和A-star变种算法进行系统地学习,同时对其在游戏开发中的应用做了更深层次上的了解。 首先需要感谢Amit's...
1.简述 A星算法就是试图在地图中找到一条最短路径,但不保证一定存在。 任务小猫去找青蛙玩(好TM弱智啊~) 条件黑色方块无法通行,每走一个格子小猫消耗的体力都为1。 2.如果说你是小猫,你会怎么走? 嗯,毫无疑问 你肯定这么走。。。很简单的对吧,但是你这么走的时候,真的没...
A*算法 虽然在unity给我们的提供了Navigation作为我们寻路的解决方案,但是在实际中我们同样也不得不使用到一套自己的方案来实现,这时A*就是我们最常用的一种方式。 A* 搜索算法是一种解决图遍历问题的计算机算法,这是一种在图形平面上,有多个节点的路径,求出最低通...
[TOC] Class I. Words Expressing Abstract Relations Section I. Existence 1. Being, in The Abstract existence 1 absolute
a.绝对的,完全的; 无(条件...
001关于做足功课 想要做好一件事情的时候,首先要花时间去了解它的本质,自己先多学习多思考,做好充足的准备,不懂的再请教别人。如果你想换工作或者公司换项目,就要先摸清这行的整个运营流程,找到行业核心竞争力,知己知彼你的胜率都要大一些。即使你开始不是这方面的天才,但是经过去摸...
曾经青梅竹马 如今各自天涯 这些年来 我们不断的为了自己的未来而奔波努力 偶尔记起那些天真的岁月 不由得勾起嘴角 我们啊 真的离那些岁月越来越远了 记得年少时 我们总爱玩过家家 装作大人的样子 你穿上爸爸的西装 踏上锃亮的皮鞋 我涂上妈妈的口红 踩着高跟鞋 似乎那时候的长大...
我会想你。我在想,我们已经渐行渐远,可是,还是很想你,回忆太多,我觉得幸福,过去的两年是幸福的,可是,你退却了,我也该止步了。
毕业后已经快7年了,进入了职业倦怠期,有时候干活总是打不起精神,内心觉得干多干少一个样,反正都能应付好工作。可每当看到身边的同事和朋友,都为自己有这种想法汗颜。 小萍的母亲在她读大学的时候就因中风导致行动不便。自那时起,她就独自肩负起照顾母亲的重担,恨不得1分钱掰成2份花,...技术分享:如何用Unity做游戏中寻路导航-腾讯游戏学院温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我是阿赵,请多多指教!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
&&&&& unity自从3.5版本之后,增加了NavMesh寻路的功能。在此之前,unity用户只能通过第三方插件(如Astar寻路插件)等做寻路功能。阿赵我也使用过A*寻路插件,A*的原理并不复杂,有兴趣的朋友可以自己百度一下。不过由于不是自带的功能,所以在设定网格和烘焙的过程难免会出现很多不便。NavMesh作为unity自带的功能,用法和之前的LightMapping烘焙或者遮挡剔除Occlusion Culling有很多相似之处。
&&&&& 这个功能有很多有趣的地方,而且用起来也很方便,我打算分开几篇日志来逐一介绍。这次的目的只是简单的认识一下NavMesh的基本用法,所以暂时不详细的翻译组件每一个参数和功能的意思。
&&&&& 先来看看怎么在unity打开NavMesh功能的窗口吧:
在window下拉列表中可以看到Navgation,点击:
在原来Inspector面板的旁边会出现Navigation的面板:
这个Objcet的面板是对应当前选择的物体的,旁边的Bake面板是对应全局选项的。结构和烘焙或者遮挡剔除是一样的。在选择了物体的情况下会出现上面的内容:
&上面的All、MeshRenderers、Terranis是对Hirarchy面板里面显示的物品选择的一个筛选过滤:
all就是全部显示
MeshRenderers是只显示可渲染的网格物体
而Terrains当然就是只显示地形物体了。
下面的是重要的选项,第一个Navigation Static选项是选择该物体是否用做寻路功能的一部分。只有勾选了这个选项,下面的其他选项才会可操作。
&OffMeshLink Generation选项是选择该物体是否根据高度、可跳跃宽带等全局的选项自动生成OffMeshLink,这个会在以后的讲解中详细说明,这次就暂时不讨论。
Navigation Layer是对参与寻路功能的地图物体的一个分类,用层来分类,默认有三个层可以选择,当然也可以自己添加层。
旧版本:在Edit下拉列表,选择Project——NavMeshLayers
注意:在4.几的新版本后,这个寻路层管理打开的位置发生了变化,变成了在Navigation&面板里面了:&
出现了NavMesh层的管理界面:&
上面三个Buit-in Layer是系统默认的三个可选择层,我们可以在下面的User Layer里面输入自己需要的层的名称,比如我现在输入一个叫做“brigde”的层
这时候,刚才输入的“bridge”层,就会出现在可选择的列表里面
通过刚才的几步,NavMesh常用的几个面板我们都已经操作过了,接下来可以做一个小例子:
&在场景里面,我放了一个摄像机(Camera),一个充当地面的面片(plane),一个角色模型(man)和一个目标点物体(target)
为了便于观察目标点的位置,我在目标点物体身上添加了Light组件让它会发光。角色模型(man)身上必须添加NavMesh组件,不然就不能寻路了。为了方便,我使用了官方的大兵模型,里面已经带有了动画和动画控制的脚本。不过这些动画的表现暂时是不重要的,你可以选择放一个胶囊或者Cube代替人物的模型。
还记得刚开始介绍的Navigation面板吗?选择地面(plane),在Navigation面板里面里面勾选Navigation Static选项,其他的默认不改动。
然后点击右下角的Bake面板。这时候会有一个计算的过程,曾经用过烘焙或者遮挡剔除的朋友应该对这个过程很熟悉了。
不过和之前两个功能一样,如果你没有保存场景level,unity会提示你先保存,然后再bake。
由于现在场景里面的物体很少,所以Bake的过程很快就结束了。
留意看scene视窗,现在地面的颜色已经发生改变了,这是因为unity已经帮你生成了寻路用的NavMesh网格,由于现在没有遮挡的阻碍物,所以整个地面都是属于可以行走的范围。
写一个最简单的控制脚本吧,以上是C#,由于很简单,估计用Js的朋友也能对应的写出来。
简单的解释一下,这个脚本是直接拖放到角色(man)身上的,并把场景中的目标物体(target)拖放指定到该脚本的target变量上面进行了赋值。在脚本一开始的时候,我&先获取了man身上的NavMeshAgent脚本组件,然后在Update的过程中,man不断的进行对target的位移的一个寻路并移动到目标位置的操作。
在进行完以上的操作后,你应该已经可以点击unity的播放按钮,然后移动目标物体(target),这时候角色模型已经可以追着目标点跑了。
这里我还做了一个简单的鼠标点击plane设定目标点的功能,由于这个功能不在这次的讨论范围内,所以有兴趣的朋友可以自己去百度一下具体的方法。
进行到这一步,人物已经跑起来了,但由于没有遮挡的障碍物,所以人物只是会直线的行走,看不出寻路的感觉。接下来我们就做点更复杂的:
在场景里面添加一个Cube做为障碍物,具体的形状和位置请根据自己喜欢来调节,阿赵我是把它做成了一个长方形,并摆在了角色面前。
和刚才对地面的操作差不多,选择遮挡物Cube,在Navigation面板里面勾选Navigation Static选项,这次的Navigation Layer要选择Not Walkable。顾名思义,这是不能行走的意思,代表了这个Cube是不能通过的。
选择完成后,我们再次点击Bake,又是一个小等待的过程。
Bake完成后,我们回到scene视窗。
&观察scene视窗,会发现刚才整个地面都是NavMesh的情况已经改变了,在障碍物的周围,NavMesh留出了一个缺口,这代表了角色已经不能从障碍物身上通过了。
再次点击unity的播放按钮
现在可以看到,人物已经可以绕着障碍物走了,我们的目的已经顺利达到了。
&&&&& 这次的例子就到此结束了。
&&&&& 在第二节里,我会详细的讲解高低落差、爬梯子以及跳跃等较为复杂一点的功能。然后会在第三节里面讲解分条件的寻路(不同人走不同的路),以及动态控制道路(如吊桥)等的功能。
&&&&& 第一次写教程,可能有些不太人性化的地方,请各位谅解。
&&&&& 再次提醒,请体谅作者辛苦,如需转载,请通知我,我是阿赵,谢谢!&&&&&&&
阅读(65500)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'unity自带寻路Navmesh入门教程(一)',
blogAbstract:'
&&&&& 说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习。水平有限请勿见怪。不过请尊重码字截图录屏的劳动,如需转载请先告诉我。谢谢!
&&&&& unity自从3.5版本之后,增加了NavMesh寻路的功能。在此之前,unity用户只能通过第三方插件(如Astar寻路插件)等做寻路功能。阿赵我也使用过A*寻路插件,A*的原理并不复杂,有兴趣的朋友可以自己百度一下。不过由于不是自带的功能,所以在设定网格和烘焙的过程难免会出现很多不便。NavMesh作为unity自带的功能,用法和之前的LightMapping烘焙或者遮挡剔除Occlusion Culling有很多相似之处。
&&&&& 这个功能有很多有趣的地方,而且用起来也很方便,我打算分开几篇日志来逐一介绍。这次的目的只是简单的认识一下NavMesh的基本用法,所以暂时不详细的翻译组件每一个参数和功能的意思。
&&&&& 先来看看怎么在unity打开NavMesh功能的窗口吧:',
blogTag:'unity,navmesh,寻路,教程,阿赵',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:2,
permalink:'blog/static/',
commentCount:127,
mainCommentCount:45,
recommendCount:21,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我是阿赵,请多多指教!',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}寻路的方法如下步骤
3、添加脚本给自动寻路的物体:
NavMeshAgent myN
void Start(){
myNav = GetComponent&NavMeshAgent&();
void Update(){
myNav.SetDestination(target.position);
这样就实现了一个简单的寻路系统。
为了使寻路更加完善,效果更加逼真,还可以适当的更改以下属性:
Radius 寻路的碰撞半径
Height寻路的碰撞高度
BaseOffset 寻路碰撞的位置
Speed 寻路物体的速度
Acceleration 转弯时的加速度
AngularSpeed 转弯时物体的角速度
StoppingDistance 停止的距离
AvoidancePriority 躲避系数:躲避系数越高,物体在靠近目标的时候越会绕到目标的身旁。
寻路Bake属性
Radius 是指寻路区域与障碍物之间半径
Height 是指寻路区域与地面之间的高度
MaxSlope 是指寻路区域烘焙的最大坡度
添加自定义区域
选择场景中的路面指定到特定的区域
重新Bake区域
找到寻路的物体,设置行走的遮罩层(Cost属性:数值越大,从此寻路的消耗越大,寻路物体在区域消耗数值一样的情况下,会选择最优(最近)路面寻路,但如果寻路区域的消耗数值不同,会根据消耗的数值,越小越最优进行寻路。)
使用脚本勾选多个寻路区域
5. 如图所示,每一个寻路区域都是2的幂,因此
6. Walkable 为 1;Red为8所以9为Walkable和Red区域。Everything为所以区域-1.Nothing为0。
GetComponent&NevMeshAgent&().areaMask = 9;
Unity3d即时战斗之敌人AI和角色攻击
【Unity学习笔记】——使用unity自带寻路系统进行寻路
Unity3D 利用character controller控制人物在场景中移动和利用Navmesh Agent设置人物自动寻路
U3D寻路导航网格
Unity3D 自动寻路系统Navigation实现人物上楼梯、走斜坡、攀爬、跳跃
使用Unity3D中的寻路方法
没有更多推荐了,}

我要回帖

更多关于 寻路人游戏 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信