1、Off Mesh Link 过渡动画设置

  • 首先创建一个动画  
  • 关闭 Nav Mesh Agent 中的 Auto Traverse Off Mesh Link
  • 编写脚本
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AI;
    
    public class OffMeshTest : MonoBehaviour
    {
        //Player
        public NavMeshAgent agent;
        //跳跃动画
        public Animation ani;
        //是否正在传送
        bool isTransfering;
        //传送目标
        OffMeshLinkData omld;
    
        void Update()
        {
            // 检测是否处于OffMeshLink上
            if(agent.isOnOffMeshLink)
            {
                if(!isTransfering)   //未开始传送
                {
                    ani.Play("offmeshAni");
                    omld = agent.currentOffMeshLinkData;
                    isTransfering = true;   
                }
                else                //开始传送
                { 
                     // 获取动画的归一化进度(0到1之间)
                    float timeLerp = ani["offmeshAni"].normalizedTime;
    
                    // 计算线性插值位置(从起点到终点)
                    var posLerp = Vector3.Lerp(omld.startPos, omld.endPos, timeLerp);
    
                    // 添加Y轴的正弦曲线运动,模拟跳跃抛物线
                    posLerp.y+= Mathf.Sin(timeLerp * Mathf.PI) * 2;
    
                    if(!ani.isPlaying)    //动画停止播放
                    {
                        agent.transform.position = omld.endPos;
                        isTransfering = false;
                        // 完成OffMeshLink过渡
                        agent.CompleteOffMeshLink();
                    }
                }
            }
        }
    }
    

    2、Navigation Area导航区域成本设置

成本设置——代码实现:

1)修改 door 的成本

2)Area Mask  

代码实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class NavAreaTest : MonoBehaviour
{
    //Player
    public NavMeshAgent agent;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.T))
        {
            NavMesh.SetAreaCost(NavMesh.GetAreaFromName("Door"), 10000.0f);
        }
        if(Input.GetKeyDown(KeyCode.M))
        {
            int walkable = 1 << NavMesh.GetAreaFromName("Walkable");
            int jump= 1 << NavMesh.GetAreaFromName("Jump");
            int door = 1 << NavMesh.GetAreaFromName("Door");

            agent.areaMask = walkable + jump+ door;
        }
        
    }
}

3、多导航场景叠加跳转

实现代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.SceneManagement;

public class Test : MonoBehaviour
{
    public OffMeshLink oml;
    
    GameObject linkGo;
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            //  Scene加载模式 为 叠加 LoadSceneMode.Additive (两个Scenes同时出现)
            SceneManager.LoadScene("SceneAdd2", LoadSceneMode.Additive);
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            linkGo = GameObject.FindGameObjectWithTag("Link");
            oml.endTransform = linkGo.transform;
        }
        }
}

 4、Nav Mesh Agent (导航代理组件)

         

 1)Steering

  • Stopping Distance:到达目标位置立即停止运动(不为0)
  • Auto Braking:自动刹车

         多个寻路点  不勾选

2)Obstacle Avoidance

  • Radius(半径)

  • Height(高度)

  • Quality(质量):质量越高,监测频率越高
  • Priority(优先级):数字越小,优先级越高

3)Path Finding

  • Auto Repath(重新规划路径):

不勾选   遇到障碍 障碍消失  Player 未到达指定位置

勾选       遇到障碍 障碍消失  Player 到达指定位置

5、其他问题

人物运动打滑

偏离中心点

Unity导航系统 | Unity 中文课堂

12--15

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐