2017-02-24 00:16:02 qq1109470422 阅读数 4835

在window-》Navigation打开Bake
这里写图片描述
1、Agent Radius(物体的半径)物体半径越小,生成网格面积越大。
这里写图片描述
2、Agent Height:物体的高度
这里写图片描述
3、Max Slope 斜坡斜度(最大60°),如果大于设定值就不会生成网格。
4、Step Height 台阶高度 ps这个高度不可以大于人的高度。
5、Drop Height 允许的最大下落距离。
6、Jump Distance 允许的最大跳跃距离。
这里写图片描述
ps:使用5 6 两个属性需要勾选Object》Generate OffMeshLinks
7 、Advanced 高度参数调节
》Manual Voxel Size 选中手动输入像素值
》Voxel Size 自动获取像素值为Agent Radius的1/3。
》Min Region Area 网格面积小于这个值,不会生成。
》Height Mesh 选中会自动保存高度信息,会增加性能和存储空间的消耗。

2016-03-17 00:06:11 clleop 阅读数 1078

地板、箱子、斜坡等行走路面设置,设置完点Bake。



挂上NavMeshAgent 和 脚本


SmartPlayer  物体行至鼠标所点位置

using UnityEngine;
using System.Collections;

public class SmartPlayer : MonoBehaviour
{
    NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        RaycastHit hit;
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
                agent.SetDestination(hit.point);
        }
    }
}



Follower 物体行至target所在位置

using UnityEngine;
using System.Collections;

public class Follower : MonoBehaviour
{
    public Transform target;
    private NavMeshAgent agent;

    // Use this for initialization
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        if (target != null)
            agent.destination = target.position;
    }
}



2019-09-19 15:20:20 Wmayy_123 阅读数 36

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

步骤:
1,打开NavMesh窗口;
2,设置障碍,Bake一下;
3,设置寻路者,和目地坐标(可以用鼠标点击代替,也可以直接固定目标);
4,以上3步完成今天的教程!

下面通过一个简单的Sample来介绍NavMesh的应用:

1.在Scene中新建三个Cube,如下图摆放。
在这里插入图片描述2.选中上图三个Cube,并在Inspector面板中选中为静态(static)下拉选项的Navigation Static,如下图。

在这里插入图片描述3.依次选择菜单栏中的Windows - Navigation ,打开后面板如下。在这里插入图片描述单击该面板右下角的Bake按钮,即可生成导航网格,下图为已生成的导航网格。在这里插入图片描述4.下面就可以让一个运动体根据一个导航网格运动到目标位置。

首先新建一个Cube为目标位置,起名TargetCube。然后创建一个capsule(胶囊)运动体,为该胶囊挂在一个Nav Mesh Agent(Component - Navigation - Nav Mesh Agent);最后写一个脚本就可以实现自动寻路了。脚本如下:

using UnityEngine;
using System.Collections;

public class Run : MonoBehaviour {

public Transform TargetObject = null;

void Start () {
	if (TargetObject != null)
	{
		GetComponent<NavMeshAgent>().destination = TargetObject.position;
	}
} 
void Update () {

}
}

脚本新建完成后挂载到胶囊体上,然后将TargetCube赋予给胶囊体的Run脚本,运行场景,如下图,胶囊体会按照箭头的方向运动到Cube位置。在这里插入图片描述
这样一个简单的自动寻路就完成了,如果要更精细的寻路,或要实现上坡,钻"桥洞"等,可根据下面介绍的相关参数进行调节。
下一篇讲解NavMesh里的参数含义!

2012-03-14 13:23:16 onejavaer 阅读数 1770

       以前在制作寻路的时候,总是借助A Star插件。但Unity3D现在已经可以使用自己自带的寻路Component了,而且使用来气非常的简单明了!

       和U3D以前大多数的优化组件类似,Nav也需要在设置好寻路网格和寻路对象之后Bake一下。关于U3D内置的寻路组件主要分为两大个类,NavMesh和NavMeshAgent;前者用于设置寻路的网络,后者设置寻路的Object。在NavMesh对外公开的方法有:

Raycast  跟踪上NavMesh的两个点之间的射线。
CalculatePath  计算两点之间的路径和存储路径。
DistanceToEdge  找到最近从一个点的NavMesh NavMesh边缘。
SamplePosition  样品到指定点最接近的NavMesh。
SetLayerCost  设置成本超过一层上的所有代理类型的几何遍历。
GetLayerCost  取得成本超过一层上的所有代理类型的几何遍历。
GetNavMeshLayerFromName  返回一个已命名的层层指数。

 此外它还继承了一些变量

name  对象的名称。
hideFlags  如果对象是隐藏的,由用户在现场或修改保存?
继承的函数
GetInstanceID  返回该对象的实例ID。
ToString  返回游戏对象的名称。
继承类的功能
operator bool  对象是否存在?
Instantiate 克隆原始的对象,并返回克隆 。
Destroy  删除一个游戏物体,组件或资产。
DestroyImmediate 立即销毁对象 obj 。强烈建议,而不是使用毁灭。
FindObjectsOfType 返回的所有活动加载的类型对象的列表类型 。
FindObjectOfType 返回的第一个活动类型加载的对象类型。
运算符==  比较如果两个对象指向同一个
运算符!  比较,如果两个对象是指不同的对象
DontDestroyOnLoad 使得对象的目标不会被破坏时自动装载一个新的场景。

在NavMesh对外公开的方法有:

变量
destination  导航朝目的地。
stoppingDistance  在这个距离内停止从目标位置。
velocity  navmesh代理组件的当前速度。
nextPosition  路径上的下一个位置。
remainingDistance  当前路径上的剩余距离。
baseOffset  拥有游戏物体的相对垂直位移。
isOnOffMeshLink  代理目前定位上OffMeshLink。
autoTraverseOffMeshLink  自动运动到和关闭OffMeshLinks。
autoRepath  试图获取一个新的路径,如果现有的路径变为无效
hasPath  代理目前有一个路径。
pathPending  正在计算路径,但还没有准备好
isPathStale  当前路径陈旧。
pathStatus  查询当前路径的状态。
walkableMask 指定巫NavMesh层是差强人意(位域)。更改walkableMask将陈旧的路径(见isPathStale)
speed  最大移动速度。
angularSpeed  最高转速(deg / s的)。
acceleration  最大加速度
updatePosition  如果代理更新变换位置。
updateRotation  如果代理更新变换方向。
radius  代理半径。
height  代理的高度。
obstacleAvoidanceType  避免质量水平

功能
SetDestination 设置或更新的目标。这会触发一个新的路径计算。
ActivateCurrentOffMeshLink  启用或禁用当前​​链接。
GetCurrentOffMeshLinkData  提取当前的OffMeshLink状态。
GetCurrentOffMeshLinkGameObject  参考当前OffMeshLink的游戏对象。
CompleteOffMeshLink  终止电流OffMeshLink。
Move  当前位置应用相对运动。
Stop  停止代理的运动沿着目前的道路。
Resume  恢复运动沿着目前的道路。
ResetPath 清除当前路径。请注意,代理将开始寻找一条新的道路,直到SetDestination被称为。
SetPath  指定代理的路径。
DistanceToEdge  找到最近的NavMesh边缘。
Raycast 对一个目标位置的NavMesh的跟踪运动。不移动代理。
SamplePathPosition  采样沿着目前的道路位置。
SetLayerCost  设置为以上的层类型的几何遍历成本。
GetLayerCost  获取超过该层类型的几何遍历成本。

继承的成员
继承的变量
enabled  启用Behaviours更新,禁用Behaviours都没有。
transform 变换连接到这个游戏物体(null,如果是没有连接)。
rigidbody 刚性主体连接到这个游戏物体(null,如果是没有连接)。
camera 该相机连接到这个游戏物体(NULL,如果有没有附加) 。
light 这个游戏物体光连接(如果是没有连接的空) 。
animation 动画的连接到这个游戏物体(NULL,如果有没有附加) 。
constantForce ConstantForce连接到这个游戏物体(null,如果是没有连接)。
renderer 渲染器 连接到这个游戏物体(空;如果没有附加)。
audio AudioSource附加游戏物体(null,如果是没有连接)。
guiText GUIText连接到这个游戏物体(null,如果是没有连接)。
networkView NetworkView连接这个游戏物体 (只读)。(空;如果没有连接)
guiTexture GUITexture连接这个游戏物体 (只读)。(空;如果没有连接)
collider 对撞机的连接到这个游戏物体(空;如果没有附加)。
hingeJoint HingeJoint连接到这个游戏物体(null,如果是没有连接)。
particleEmitter ParticleEmitter连接到这个游戏物体(null,如果是没有连接)。
particleSystem ParticleSystem连接到这个游戏物体(null,如果是没有连接)。
GameObject  此组件连接到游戏的目标。始终是一个组件连接到一个游戏对象。
tag  这个游戏对象的标记。
name  对象的名称。
hideFlags  如果对象是隐藏的,由用户在现场或修改保存?

继承的函数
GetComponent 如果比赛的对象之一附着,空,如果它不返回类型的组件类型。
GetComponentInChildren 返回的类型的组件类型的游戏物体或任何其使用深度优先搜索的儿童 。
GetComponentsInChildren 返回类型的所有组件类型在游戏物体或任何其子女。
GetComponents 返回类型的所有组件类型的游戏物体。
CompareTag 这是游戏对象标签的标签吗 ?
SendMessageUpwards 调用命名方法methodName中每MonoBehaviour在这场比赛中对象的行为的每一个祖先
SendMessage函数 调用命名的方法methodName中每MonoBehaviour在这个游戏对象。
BroadcastMessage 调用命名的方法methodName中每MonoBehaviour在这场比赛中的对象或任何其子女。
GetInstanceID  返回该对象的实例ID。
ToString  返回游戏对象的名称。
继承类的功能
运算符BOOL  对象是否存在?
Instantiate 克隆原始的对象,并返回克隆 。
Destroy  删除一个游戏物体,组件或资产。
DestroyImmediate 立即销毁对象 obj 。强烈建议,而不是使用毁灭。
FindObjectsOfType 返回的所有活动加载的类型对象的列表类型 。
FindObjectOfType 返回的第一个活动类型加载的对象类型。
运算符==  比较如果两个对象指向同一个
API参考地址:点击打开链接

视频教程:1、Navmesh Generation and Agent Follow       

                 2、Unity3D NavMesh Tutorial

2016-09-03 16:12:13 ballshe 阅读数 5354

寻路的方法如下步骤

1、将场景中的地面以及障碍物勾选Static,调出Navigator视窗,点击Bake,形成寻路网格。

2、给需要自动寻路的物体添加寻路组件——Nav Mesh Agent

3、添加脚本给自动寻路的物体:

public Transform target;
NavMeshAgent myNav;
void Start(){
    myNav = GetComponent<NavMeshAgent>();
}
void Update(){
    myNav.SetDestination(target.position);
}

这样就实现了一个简单的寻路系统。
为了使寻路更加完善,效果更加逼真,还可以适当的更改以下属性:

  1. Radius 寻路的碰撞半径
  2. Height寻路的碰撞高度
  3. BaseOffset 寻路碰撞的位置
  4. Speed 寻路物体的速度
  5. Acceleration 转弯时的加速度
  6. AngularSpeed 转弯时物体的角速度
  7. StoppingDistance 停止的距离
  8. AvoidancePriority 躲避系数:躲避系数越高,物体在靠近目标的时候越会绕到目标的身旁。

寻路Bake属性

  1. Radius 是指寻路区域与障碍物之间半径
  2. Height 是指寻路区域与地面之间的高度
  3. MaxSlope 是指寻路区域烘焙的最大坡度

区域遮罩

这里写图片描述

  1. 添加自定义区域
  2. 选择场景中的路面指定到特定的区域
  3. 重新Bake区域
  4. 找到寻路的物体,设置行走的遮罩层(Cost属性:数值越大,从此寻路的消耗越大,寻路物体在区域消耗数值一样的情况下,会选择最优(最近)路面寻路,但如果寻路区域的消耗数值不同,会根据消耗的数值,越小越最优进行寻路。)

使用脚本勾选多个寻路区域

这里写图片描述
5. 如图所示,每一个寻路区域都是2的幂,因此
6. Walkable 为 1;Red为8所以9为Walkable和Red区域。Everything为所以区域-1.Nothing为0。

GetComponent<NevMeshAgent>().areaMask = 9;
没有更多推荐了,返回首页