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.

  • 相关阅读:
    安装thrift时,注意openssl参数
    Linux下boost编译安装
    super-smack
    算术运算指令
    C/C++中有关字长与平台无关的整数类型
    URLTester2.3.2
    第20课 链接过程简介
    第19课 编译过程简介
    第18课 三目运算符和逗号表达式
    第17课 ++和--操作符分析
  • 原文地址:https://www.cnblogs.com/isayes/p/6556808.html
Copyright © 2011-2022 走看看