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

来源:互联网 发布:淘宝招聘网络唇模 编辑:程序博客网 时间:2024/04/29 22:57

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

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

上下斜坡自动寻路介绍

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

    这里写图片描述

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

    烘焙参数设置

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

    烘焙好的效果图

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

    上坡角度很大

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

下坡角度很大

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

斜坡连接处处理

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

设置中间目标物

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

附上代码

[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<NavMeshAgent>();        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);        }    }}
0 0
原创粉丝点击