在3D游戏中,有时,场景中的静态几何体的导航网格不是全部相连在一起的,从而使代理不能从世界场景的这一部分移动到另外的部分,此时需要运用到Off-MeshLink来解决此类问题。
案例
Off-MeshLink组件用于手动指定路径线路。可以实现跨越鸿沟或者往高处跳跃而上的效果。
1.创建场景。如图 所示。inv对象中有2个Cube,分别代表地板和大方块高墙。再创建2个Cube,分别命名为:start point和end point,分别为指定跳跃起点和指定跳跃终点位置点。使用胶囊体创建主角。
2.把inv环境中的Cube物体设置为静态,并勾选OffMeshLink Generation选项。如图 所示。
3.为start point添加Off Mesh Link组件。并把start point和end point拖放指定到Start和End属性中。如图 所示。
4.为主角胶囊体添加Nav Mesh Agent组件。如图 所示。
5.Bake烘焙场景。注意调节Height、Drop Height、Jump Distance属性。
6.烘焙好后,场景如图 所显示。
7.为主角胶囊体添加脚本,如下所示。
using UnityEngine;
using System.Collections;
public class PlayerController1 : MonoBehaviour {
private NavMeshAgent agent;
GameObject target;
void Start()
{
//获取组件
agent = GetComponent<NavMeshAgent>();
target = GameObject.Find("end point");
}
void Update()
{
agent.SetDestination(target.transform.position);
}
自定义移动过程
假如各位需要对越过OffMeshLink时候进行自己的控制,是需要另外写脚本的。我这里简单的介绍一下方法,有兴趣的朋友可以自己试试。
首先各位最好有用状态来控制角色的概念。比如人物可以分为站立、走路、跑步、上下楼梯、横向跳跃和往下掉落几种状态,针对NavMesh来说,人物简单的可以分为站立、正常的NavMesh寻路,和通过OffMeshLink移动几种状态。
先把 NavMesh Agent组件上的Auto Traverse Off Mesh Link选项取消。
然后,当人物在通过OffMeshLink移动的状态(可以用NavMeshAgent.isOnOffMeshLink来判断),获取到当前通过的OffMeshLink:
OffMeshLinkData link = NavMeshAgent.currentOffMeshLinkData;
这样你就能获取到link的开始点和结束点的坐标(link.startPos和link.endPos),这时候你的人物就可以用最简单的Vector3.Lerp来进行移动,当人物的位移到达了结束点的坐标,人物的OffMeshLink移动状态就可以结束,又重新变回正常寻路或者站立的状态了。在这个Vector3.Lerp的过程中,你可以随意的控制人物的爬行或者跳跃的动作。