Unity 基础寻路-NavMesh

举报
陈言必行 发表于 2021/08/13 22:51:06 2021/08/13
【摘要】 寻路是游戏中经常使用到的一项技术,3D游戏世界中用于实现物体能够自动寻找一条路径到达目的位置的一项技术。,它将游戏场景中复杂的结构组织关系简化为带有一定信息的网格 ,在这些网格的基础上通过一系列相应的计算来实现自动寻路。 自动寻路就是AI中的一个十分重要的分支,其算法异常复杂。Unity中提供的这套非常成熟的组件来为我们解决这一难题。   NavMesh寻路系...

寻路是游戏中经常使用到的一项技术,3D游戏世界中用于实现物体能够自动寻找一条路径到达目的位置的一项技术。,它将游戏场景中复杂的结构组织关系简化为带有一定信息的网格 ,在这些网格的基础上通过一系列相应的计算来实现自动寻路。

自动寻路就是AI中的一个十分重要的分支,其算法异常复杂。Unity中提供的这套非常成熟的组件来为我们解决这一难题。

 

NavMesh寻路系统的操作步骤:

对场景中的物体进行标记,然后进行路径烘焙,产生网格数据

为要进行寻路的物体添加寻路组件(NavMeshAgent)

通过NavMeshAgent组件的属性或方法进行移动

 

Bake烘焙参数面板

 

Radius:半径。半径数值越小,生成网格面积越大,越容易靠近被烘焙过的静态物 体。

Height:高度。整体网格可以烘焙到的高度。1和2可以理解为寻路者的半径和高度

Max Slope:最大斜坡角度。角度越大,代理越能爬坡 ,超过这个坡度寻路者则无法通过。

Step Height:台阶步高。步高越大,导航代理迈过台阶的能力越强(可达到或代替跳跃效果)。

Drop Height:代理跳落高度。(只能往下跳,不可往上跳)。表示寻路者可以跳落的高度限。

Jump Distance:代理跳跃距离。(往远处跳跃的距离)。 表示寻路者的跳跃距离极限

Advanced高级模式(最好别动.)

Manual Voxel Size 导航烘焙的像素效果

Min Regon Area:网格面枳小于该值的地方,将不生成导肮网格。

Height Mesh:勾选后,将会保存高度信息。

 

一个小实例:

搭建如图所示的游戏场景:

绿色的地面,黑色的胶囊体作为主角,红色的球作为目标地点,蓝紫色的立方体作为障碍物,,,然后通过菜单栏->Window->Navigation打开Navigation操作窗体,,,然后选中场景中的障碍物和地面,在Naigation中的Object面板下选择Navigation Static,如下图

然后在Bake 面板上点击Back(烘焙)就会出现图一的网格了,,,这样场景就搭建完成了,当然game视图是看不到网格的,,,

最后为主角(黑色胶囊体)添加一个NavMeshAgent的组件,附加如下代码即可完成简单寻路,,

 

注:引用命名空间 using UnityEngine.AI;


  
  1. public class MeshlinksDemo : MonoBehaviour {
  2. public GameObject target; //获取目标点,注意在面板中赋值
  3. NavMeshAgent mr; //声明变量
  4. // Use this for initialization
  5. void Start () {
  6. //获取到自身的NavMeshAgent组件
  7. mr = GetComponent<NavMeshAgent>();
  8. }
  9. // Update is called once per frame
  10. void Update () {
  11. //使用属性将目标点的坐标进行传递
  12. mr.destination = target.transform.position;
  13. //使用方法获取目标点坐标,,和前一行代码作用相同
  14. //mr.SetDestination(target.transform.position);
  15. }
  16. }

 

小拓展:实现鼠标点击主角寻路

将以上例代码改写为如下所示:


  
  1. using UnityEngine;
  2. using UnityEngine.AI;
  3. public class MeshlinksDemo : MonoBehaviour {
  4. NavMeshAgent mr; //声明变量
  5. // Use this for initialization
  6. void Start () {
  7. //获取到自身的NavMeshAgent组件
  8. mr = GetComponent<NavMeshAgent>();
  9. }
  10. // Update is called once per frame
  11. void Update () {
  12. if (Input.GetMouseButtonDown(0))
  13. {
  14. //获取鼠标点击的点,
  15. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  16. RaycastHit rayhit; //声明RacastHit类型
  17. if (Physics.Raycast(ray, out rayhit))
  18. {
  19. if (rayhit.transform.name == "Plane") //判断是不是点击地面
  20. {
  21. //鼠标点击的点赋值给目标点
  22. mr.SetDestination(rayhit.point);
  23. }
  24. }
  25. }
  26. }
  27. }

 

文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。

原文链接:czhenya.blog.csdn.net/article/details/77603388

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。