Unity3D自动寻路系统Navigation(三)之人物上下斜坡设置

由于最近在一个VR项目中用到寻路系统,当然这也是开发游戏、VR等项目中必须熟悉的。但是您有没有用寻路系统来设置过上下斜坡,今天就和大家一起来探讨一下遇到的问题和提供一些解决方案。废话不多说,直接上干货。

首先来介绍一下,要实现的上下斜坡自动寻路的功能:一群人物从站台1通过图中的红色箭头达到站台2上Cube位置处。

Unity3D自动寻路系统Navigation(三)之人物上下斜坡设置_第1张图片

  1. 烘焙上下斜坡的问题
    在用Unity的自动寻路系统的时候,如果人物不能实现按照规定到达目的地,有绝大的原因是烘焙寻路出现了问题,所以这是我们首先需要重视的地方。
    下面就是一开始我烘焙的寻路,大家可能发现问题了,就是在两个红圈的位置是没有烘焙上的,并且区域很大,当人物寻路到这里的时候很容易卡在这里。

    Unity3D自动寻路系统Navigation(三)之人物上下斜坡设置_第2张图片

    那就让我们来设置烘焙的参数吧。
    首先来介绍一个各个参数的含义:
    Agent Radius:烘焙的半径,其数值越小则烘焙效果越好;
    Agent Height:烘焙的高度,人物通过的高度;
    Max Slope:烘焙的最大坡度,大于这个坡度的面将不会烘焙;
    Step Height:烘焙的台阶高度,如果高度差小于设置值,将视为连接。

    Unity3D自动寻路系统Navigation(三)之人物上下斜坡设置_第3张图片

    所以我们将烘焙半径调小点就可以解决这个问题了。
    我将烘焙半径设置为0.1,烘焙效果如下图,上坡和下边的地面连接处没有烘焙上的区域就很小啦。

    Unity3D自动寻路系统Navigation(三)之人物上下斜坡设置_第4张图片

  2. 斜坡角度和连接问题
    如果上坡的角度很大,人物也会卡在上坡中,我现在设置的上坡角度是40度。如果把角度设置为30度或者以下,人物就可以很顺利的爬上斜坡啦。

    Unity3D自动寻路系统Navigation(三)之人物上下斜坡设置_第5张图片

如果下坡的角度很大,人物就会直接跳下斜坡,我现在设置的下破的角度是50度。可以从图中看到人物是直接跳下来的。如果把角度设置为40度或者以下,人物就可以很顺利的下斜坡啦。

Unity3D自动寻路系统Navigation(三)之人物上下斜坡设置_第6张图片

还有就是斜坡与地面和站台连接处的问题,它们的连接之间一定不能有空隙,否则人物也容易卡在空隙处。如下图中,斜坡与站台没有完全连接上,有个很小的缝隙,即使寻路也烘焙得没有问题,人物有时候也会卡在这个地方。

Unity3D自动寻路系统Navigation(三)之人物上下斜坡设置_第7张图片

3、人物容易卡在寻路的边缘处
因为寻路就是解决的人物通过查找最短的路径(在忽略消耗体力值前提下),并最终达到目的地的问题,所以在上下坡也经常会遇到人物会沿着斜坡一边运动,这个就可能使人物卡在烘焙好的寻路边缘处。
我的解决办法是设置中间目标物,让其绕开寻路边缘运动,这就需要设置几个中间目标,当人物到达一个目标的时候,然后向着下一个目标运动。
从图中可以看出设置了三个目标物,这样人物就可以顺利到达目标3啦。

Unity3D自动寻路系统Navigation(三)之人物上下斜坡设置_第8张图片

欢迎大家一起来讨论!!!

附上代码

[RequireComponent(typeof(NavMeshAgent))]
public class NavigationTest : MonoBehaviour {

    public Transform targetOne;
    public Transform targetTwo;
    public Transform targetThree;

    private NavMeshAgent navAgent;

    private float distanceOne;
    private float distanceTwo;
    // Use this for initialization
    void Start () {

        navAgent = transform.GetComponent();

        navAgent.SetDestination(targetOne.position);
    }

    // Update is called once per frame
    void Update () {

        CheckReachTarget();
    }

    void CheckReachTarget()
    {

        distanceOne = Vector3.Distance(transform.position,targetOne.position);
        distanceTwo = Vector3.Distance(transform.position,targetTwo.position);

        if (distanceOne < 1f)
        {
            navAgent.SetDestination(targetTwo.position);
        }

        if (distanceTwo<1f)
        {
            navAgent.SetDestination(targetThree.position);
        }


    }
}

你可能感兴趣的:(Unity3D寻路系统介绍)