赞
踩
导航系统、分离路面导航中路障都是静态的,程序运行过程中烘焙的导航网格一直不变,本文将进一步讲解动态路障场景下导航的实现。
对于动态路障游戏对象,除了要设置 Navigation Static,还需要添加 NavMeshObstacle 组件,用于标记该对象在游戏运行过程中可以动态移动,以便 Unity3D 对此对象附近的导航网格进行动态烘焙。
1)游戏界面
胶囊体是导航对象,球体是导航目标,红色长方体是动态路障,可以动态移动。
2)设置 Navigation Static
依次选择【Window→Navigation】打开导航窗口,再选择 Object 选项卡,选中地面、台阶、楼梯、路障,勾选 Navigation Static,如下:
3)烘焙导航网格
切换到 Bake 选项卡,设置 Max Slope、Step Height 属性分别为:45、1.1,如下:
点击 Bake 烘焙导航网格,导航网格显示如下:
4)添加 NavMeshAgent 组件
给胶囊体添加 NavMeshAgent 组件。
5)添加 NavMeshObstacle 组件
红色路障可以移动,给其添加 NavMeshObstacle 组件,并勾选 Carve 选项。
6)添加脚本组件
NavigationController.cs
- using UnityEngine;
- using UnityEngine.AI;
-
- public class NavigationController : MonoBehaviour {
- private NavMeshAgent navMeshAgent;
- private Transform target;
-
- private void Awake() {
- navMeshAgent = GetComponent<NavMeshAgent>();
- target = GameObject.Find("Target").transform;
- }
-
- private void Update() {
- navMeshAgent.SetDestination(target.position);
- }
- }
说明:NavigationController 脚本组件挂在胶囊体上。
ObstacleController.cs
- using UnityEngine;
-
- public class ObstacleController : MonoBehaviour {
- private float speedRate = 4f;
-
- private void Update () {
- float hor = Input.GetAxis("Horizontal");
- float ver = Input.GetAxis("Vertical");
- Vector3 speed = new Vector3(hor, 0, ver) * speedRate;
- transform.position += speed * Time.deltaTime;
- }
- }
说明:ObstacleController 脚本组件挂在红色路障上。
7)运行效果
刚开始胶囊体寻找最优导航路径,准备走斜坡到达球体位置;中途移动红色路障卡住楼梯入口,胶囊体重新规划导航路线,准备走楼梯;等胶囊体往前走一点后,再放开斜坡入口,胶囊体发现原路线短些,准备回来走斜坡;再卡住斜坡入口,胶囊体又重新规划路线走楼梯;等胶囊体走远后,再打开斜坡入口,此时胶囊体已经觉得斜坡路线不香了,坚定地走楼梯路线。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。