之前我们一起学习了如何使用Navmesh组件来实现最基本的角色自动寻路。今天我们再继续深入探索Navigation组件的高级功能。在本文中,你将了解到如何在两个隔离层自动生成寻路网格?如何手动指定寻路网格的路线?以及寻路网格层的应用。(本文所用到的模型皆来自Unity3d官网)。
(转载请注明原文地址http://blog.csdn.net/janeky/article/details/17492531)
(源码scene1.unity)
1.创建Plane实例P1,P2,两者之间出现一条鸿沟。直接控制角色位移是无法通过的。
2.打开Navigation窗口,分别选中P1,P2,分别设置Navigation Static 和OffMeshLink Generatic
3.保存场景,点击场景烘焙按钮Bake。结束后我们可以看到P1,P2除了自身生产寻路网格外,它们直接还生成了连接纽带。
4.添加角色模型Solder,为其添加NavMeshAgent(Component->Navigation->NavMeshAgent)
5.给Solder添加PlayerController脚本
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour
{
private NavMeshAgent agent;
public bool setAgentWalkMask;//是否需要动态修改寻路层,在scene4的实例中要用到
void Start()
{
//获取寻路组件
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
//鼠标左键点击
if (Input.GetMouseButtonDown(0))
{
//摄像机到点击位置的的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
//判断点击的是否地形
if (!hit.collider.tag.Equals("Plane"))
{
return;
}
//点击位置坐标
Vector3 point = hit.point;
//转向
transform.LookAt(new Vector3(point.x, transform.position.y, point.z));
//设置寻路的目标点
agent.SetDestination(point);
}
}
//播放动画
if (agent.remainingDistance == 0)
{
animation.Play("Idle");
}
else
{
animation.Play("Run");
}
}
}
5.点击任意的位置,可以看到角色都能自动寻路过去
效果图
源码scene2.unity
1.scene1.unity的基础上,将P1,P2的OffMeshLink Generatic去除
2.在P1上新建一个空的GameObject Start,P2上新建一个空的GameObject End
3.选中start,为它添加Off Mesh Link组件 Component->Navigation->OffMeshLink
4.设置Off Mesh Link组件的属性,Start Point 为 start,End Point为end
5.烘焙场景。我们可以看到有一条纽带从start指向end
点击地图,可以看到角色如果要跨越P1和P2,一定是沿着我们手动创建的路径
之前我们都是用固定的物体作为障碍物,然后烘焙场景。Unity还提供了动态的障碍物。任何一个GameObject都可以添加Navmesh Obstacle组件,变成一个障碍物。具体步骤是Component->Navigation->Navmesh Obstacle.它有两个属性:半径和高度,可以设置跟你的物品差不多的体积大小。
源码scene3.unity
玩过“3c”,“dota”这类游戏的同学都知道:地图上有上中下三条大道,不同的兵可能去的路不同。今天我们也做个类似的实例。
1.新建P1,P2,P3,P4等4个Plane,具体摆设形状见效果图
2.在Navigation窗口中,添加两个层Layers:Blue层和Red层
3.P1,P2的Navigation Layer设置为Default,P4的Navigation层设置为Red,P3设置为Blue
4.添加两个角色,设置他们的NavMeshAgent寻路层(NavMesh Walkable)。一个将Red层去掉,一个将Blue层去掉
5.点击P2的坐标,可以看到他们沿着不同的路径去目标点,一个走上层路线,一个走下层路线了。
效果图
源码scene4.unity
在游戏中,我们很多时候都是需要根据不同的条件,选择不同的寻路路径。
1.在scene3.unity基础上做一下修改。只保留一个角色
2.新增两个按钮,“走上层”和“走下层”,在游戏运行时,可以改变Agent的寻路层。
//动态设置寻路路径层
void OnGUI()
{
if (!setAgentWalkMask)
{
return;
}
if (GUI.Button(new Rect(0, 0, 100, 50), "走下层"))
{
agent.walkableMask = 65;
}
if (GUI.Button(new Rect(0, 100, 100, 50), "走上层"))
{
agent.walkableMask = 129;
}
}
3.重新点击寻路,可以看到,选择不同的寻路层,角色的寻路路径也不同
看到代码中的agent.walkableMask = 65和129,大家会比较迷惑,其实寻路层每一层都是2的幂,见下图
所以上层的mask = Default(1)+Blue(128) = 129,下层的mak = Default(1)+Red(64) = 65
本文将寻路组件的各个细节都做了一次梳理,详细能帮大家熟练掌握各个特性,在实际项目中根据不同的需求熟练选择应用相关的特性。接下来我还会有一个更加详细的实例来贯穿所以的Navmesh特性,敬请期待!
http://pan.baidu.com/s/1jGoLITo
1.http://www.xuanyusong.com/
2.http://liweizhaolili.blog.163.com/
3.http://game.ceeger.com/Components/class-NavMeshAgent.html
分享到:
相关推荐
Unity导航网格自动寻路nav mesh
该资源实现了 读取格式为 key string 的字典型xml.内含gif演示及 事例xml
Unity新版NavMesh组件使用文档,可运行时烘焙导航网格
7 }可以看出,在前两步,我们的做法和普通的www加载assetBundle是一样的,都是获取一个新的WWW资源,但下面的一步就
NavMesh构建组件使您能够创建从“场景”几何体自动生成的导航网格物体,从而使角色能够在游戏世界中智能移动。 Unity NavMesh 2D寻路 此仓库是2D中Unity NavMesh和寻路概念的证明。 它探讨了NavMeshComponents功能。...
unity3D 引擎的寻路组件,里面介绍了NavMesh 等寻路组件的用法
AccelerationEvent <=> 加速度事件 AnchoredJoint2D <=> 2D锚关节 AndroidInput <=> 安卓输入 AndroidJavaClass <=> 安卓Java类 AndroidJavaObject <=> 安卓Java对象 AndroidJavaProxy <=> 安卓Java代理 ...
unity绕过障碍物自动寻路,unity2017的,c sharp 的代码
/// <summary> /// 查询内容 /// </summary> private InputField queries; /// <summary> /// 所有内容 /// </summary> private List<string> allStr = new List<string>(); /// <summary> /// 当前查询...
Unity新版NavMesh的案例资源,包含代码、案例 最大的亮点在于支持动态烘焙,可用在运行时根据人物的位置来动态烘焙人物周围一定区域内的场景
Unity自动寻路插件
Unity3d 自动寻路
[手游] Unity3D《最后一战》全套完整源代码 + 资源
Unity 使用NavMesh实现简易的摇杆功能
NavMesh(导航网格)是3D游戏世界中用于动态物体实现自动寻路的技术。 NavMesh系统是人工智能的一种,它使用一个添加在游戏对象上或者作为游戏对象父物体的名为“导航网格代理”(NavMeshAgent)的组件来控制该游戏...
A*自动寻路的算法,基于unity,通过点击屏幕可以知道运行的详细步骤,通过颜色,对当前点,路障,目标点,以及路径进行了标注
这个时候Hierarchy面板,如下所示:Unity3D教程:Unity3D自带寻路教程2.Window>Navigation 打开Naviagtion面板,选
<br>使用方法:<br>=========<br><br>(1) 将 TestEncryDll.scx<br> TestEncryDll.sct<br> REG.DLL<br> 存放于同一目录下.<br> <br>(2) 启动VFP6后转到该目录,其指令和DOS指令相同,如 CD D:\pvfp98\ 。<br> 用 ? ...
1、Unity拼图游戏 图片互换: if (Vector2.Distance(btn_Rect.anchoredPosition,null_Img.anchoredPosition)==bg_Layout.cellSize.x+bg_Layout.spacing.x) { print("与空图片相近,点击图片的按钮的图片和空图片的...
很好用的Unity2D寻路插件NavMesh2D,去Linq修改和说明文档