zoukankan      html  css  js  c++  java
  • 对 Unity 导航网格 NavMesh 的调研

    1. 什么是导航网格 #

    NavMesh(导航网格)是 3D 游戏世界中用于实现动态物体自动寻路的一种技术, 将游戏中复杂的结构组织关系简化为带有一定信息的网格, 在这些网格的基础上通过一系列的计算来实现自动寻路. 导航时, 只需要给导航物体挂载导航组件, 导航物体便会自行根据目标点来寻找最直接的路线, 并沿着该线路到达目标点.

    自动寻路还可以实现绕过障碍、爬上与跳下障碍物、按类别寻找属于自己的道路、动态设置道路中的障碍等技术.

    2. Navigation 组件各参数含义 #

    Object 选项卡, 包括 :

    • Navigation Static 勾选后表示该对象参与导航网格的烘培, 只有选中了 Navigation Static 之后才能进行网格导航;
    • Generate OffMeshLinks 勾选后可跳跃(Jump)导航网格和下落(Drop);
    • Navigation Area 导航网格层(默认是 Walkable)

    Bake 选项卡, 烘培参数面板, 包括 :

    • Agent Radius 具有代表性的物体半径, 半径越小生成的网格面积越大, 烘焙半径值越小越好;
    • Agent Height 具有代表性的物体的高度, 角色所要通过的高度;
    • Max Slope 斜坡的坡度, 最大的坡度. 当大于这个坡度时, 会被丢弃;
    • Step Height 台阶高度, 低于这个高度, 导航网格地区为连接;
    • Drop Height 允许最大的下落距离, 如果这个属性的值是正数, 相邻的导航网格表面高度差低于此值, 将进行网格连接;
    • Jump Distance 跳跃距离, 如果这个属性的值是正数, 相邻导航网格表面的水平距离低于此值, 将进行网格连接。;
    • Min Region Area 最小区域面积, 如果低于此临界值的区域将被丢弃;
    • Width Inaccuracy 允许最大宽度的误差;
    • Height Inaccuracy 允许最大高度的误差;
    • Height Mesh 勾选后会保存高度信息,同时会消耗一些性能和存储空间;

    Areas 选项卡 : 里面存放的是各个层的信息, 跟 Object 选项卡里面的 Navigation Area 挂钩.

    3. Nav Mesh Agent 组件各参数含义 #

    • Radius 物体的半径;
    • Speed 物体的行进最大速度;
    • Acceleration 物体的行进加速度;
    • Angular Speed 行进过程中转向时的角速度;
    • Stopping Distance 离目标距离还有多远时停止;
    • Auto Traverse Off Mesh Link 是否采用默认方式度过链接路径;
    • Auto Repath 在行进某些原因中断后是否重新开始寻路;
    • Height 物体的高度;
    • Base Offset 碰撞模型和实体模型之间的垂直偏移量;
    • Obstacle Avoidance Type 障碍躲避的的表现登记, None 选项为不躲避障碍, 另外等级越高, 躲避效果越好, 同时消耗的性能越多;
    • Avoidance Priority 躲避优先级;
    • NavMesh Walkable 该物体可以行进的网格层掩码;

    4. 示例 #

    Step 1 : 搭建场景 Plane Cube1 Cube2 Sphere, 如图;

    Step 2 : 选中物体 Plane Cube1 Cube2, 在 Inspector 面板中选中为静态(Static)下拉选项的 Navigation Static, 如图;

    Step 3 : Windows ->> Navigation 单击该面板右下角的 Bake 按钮, 即可生成导航网格, 下图为已生成的导航网格;

    Step 4 : 为 Sphere 挂一个 Nav Mesh Agent(Component ->> Navigation ->> Nav Mesh Agent);

    Step 5 : 为 Sphere 写一个脚本就可以实现自动寻路, 这样一个简单的自动寻路就完成了;

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class SphereRun : MonoBehaviour {
    
    	public Transform TargetObject = null;
    
    	void Start () {
    		if (TargetObject != null) {
    			GetComponent<UnityEngine.AI.NavMeshAgent> ().destination = TargetObject.position;
    		}
    	}
    
    	void Update () {
    
    	}
    }
    
    

    Sphere 加个 NavMeshAgent 和自动寻路的脚本之后效果演示 :

    5. 学习资料参考来源 #

    http://blog.csdn.net/f786587718/article/details/48897023
    http://blog.csdn.net/gary_888/article/details/51438947
    http://blog.csdn.net/ynnmnm/article/details/44833007
    http://www.cnblogs.com/tonge/p/3931116.html
    http://www.cocoachina.com/game/20151201/14519.html

    End.

  • 相关阅读:
    jquery toggle(listenerOdd, listenerEven)
    struts quick start
    hdu 1518 Square (dfs)
    hdu 2544 最短路 (最短路径)
    hdu 1754 I Hate It (线段树)
    hdu 1856 More is better (并查集)
    hdu 1358 Period (KMP)
    hdu 2616 Kill the monster (DFS)
    hdu 2579 Dating with girls(2) (bfs)
    zoj 2110 Tempter of the Bone (dfs)
  • 原文地址:https://www.cnblogs.com/isayes/p/6556808.html
Copyright © 2011-2022 走看看