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 {//Playerpublic 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
{//Playerpublic 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