Unity游戏开发——新发教你做游戏(五):导航系统Navigation

    科技2022-07-10  129

    文章目录

    一、前言二、通过Navigation实现角色移动区域的限制2.1、烘焙地面,生成NavMesh2.2、主角挂上NavMeshAgent 三、通过Navigation实现自动寻路

    一、前言

    文章列表 Unity游戏开发——新发教你做游戏(一):打开游戏开发新世界的大门 Unity游戏开发——新发教你做游戏(二):60个Unity免费资源获取网站 Unity游戏开发——新发教你做游戏(三):3种资源加载方式 Unity游戏开发——新发教你做游戏(四):角色移动控制 Unity游戏开发——新发教你做游戏(五):导航系统Navigation Unity游戏开发——新发教你做游戏(六):教你2个步骤实现摇杆功能 Unity游戏开发——新发教你做游戏(七):Animator控制角色动画播放 本工程Demo我已上传到GitHub,感兴趣的同学可以下载下来学习。 GitHub工程地址:https://github.com/linxinfa/Unity-RpgGameDemo 嗨,大家好,我是新发,上一篇文章我们讲了角色移动控制。最后提出了个问题,限制角色在地图中移动,而不会超出地图外面?这篇文章我就来说下实现方案:Unity导航系统Navigation

    二、通过Navigation实现角色移动区域的限制

    NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。

    2.1、烘焙地面,生成NavMesh

    将带有 MeshRenderer和 Collider组件的地形设置为 Navigation Static。 然后点击菜单Window - AI - Navigation 此时会打开Navigation窗口,点击Bake分页,再点击Bake按钮即可开始烘焙地面。 烘焙成功,即可看到地面上出现一个蓝色的网格,场景目录中也可以看到生成了一个NavMesh(导航网格)文件。 我可以添加一些Cube作为障碍物,然后重新烘焙。(注意Cube也要设置为 Navigation Static)

    2.2、主角挂上NavMeshAgent

    我们在主角上挂上NavMeshAgent主角,移动主角,会发现主角只能被限制在NavMesh网格中移动。 由于我们是通过摇杆来控制角色移动,所以没有用到自动寻路,只是用NavMeshAgent来限制角色的移动范围。 不过也还是顺带说一下自动寻路的具体操作。

    三、通过Navigation实现自动寻路

    角色身上挂了NavMeshAgent组件,我们就可以调用NavMeshAgent的SetDestination的方法实现自动寻路了。 例:

    navAgent.SetDestination(targetPos);

    如何实现鼠标点击某个点,让角色走过去呢。

    思路 鼠标点击,从摄像机处发出射线检测,与地面碰撞得到一个目标坐标,然后调用SetDestination接口。

    具体代码 如下,将脚本挂在主角身上

    //AutoPathFinding.cs 挂在角色的gameobject上 using UnityEngine; using UnityEngine.AI; public class AutoPathFinding : MonoBehaviour { private NavMeshAgent m_navAgent; private Transform m_selfTrans; private Vector3 m_targetPos; private bool m_isMoving = false; void Awake() { // 给角色挂上NavMeshAgent组件 m_navAgent = gameObject.GetComponent<NavMeshAgent>(); m_selfTrans = transform; } void Update() { if(input.GetMouseButton(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if(Physics.Raycast(ray, out hit)) { m_targetPos = hit.point; // 自动寻路移动到目标点 m_navAgent.SetDestination(m_targetPos); m_isMoving = true; } } if(Vector3.Distance(m_selfTrans.position, m_targetPos) <= 0.1f) { m_isMoving = false; } } }

    效果如下 好了,下一篇我将讲讲UGUI摇杆的具体实现。

    Processed: 0.038, SQL: 8