http://blog.csdn.net/janeky/article/details/17492531

之前我们一起学习了如何使用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脚本

[csharp] view
plain
 copy

  1. using UnityEngine;
  2. using System.Collections;
  3. public class PlayerController : MonoBehaviour
  4. {
  5. private NavMeshAgent agent;
  6. public bool setAgentWalkMask;//是否需要动态修改寻路层,在scene4的实例中要用到
  7. void Start()
  8. {
  9. //获取寻路组件
  10. agent = GetComponent<NavMeshAgent>();
  11. }
  12. void Update()
  13. {
  14. //鼠标左键点击
  15. if (Input.GetMouseButtonDown(0))
  16. {
  17. //摄像机到点击位置的的射线
  18. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  19. RaycastHit hit;
  20. if (Physics.Raycast(ray, out hit))
  21. {
  22. //判断点击的是否地形
  23. if (!hit.collider.tag.Equals("Plane"))
  24. {
  25. return;
  26. }
  27. //点击位置坐标
  28. Vector3 point = hit.point;
  29. //转向
  30. transform.LookAt(new Vector3(point.x, transform.position.y, point.z));
  31. //设置寻路的目标点
  32. agent.SetDestination(point);
  33. }
  34. }
  35. //播放动画
  36. if (agent.remainingDistance == 0)
  37. {
  38. animation.Play("Idle");
  39. }
  40. else
  41. {
  42. animation.Play("Run");
  43. }
  44. }
  45. }

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,一定是沿着我们手动创建的路径


  • 导航网格障碍物 Navmesh Obstacle

之前我们都是用固定的物体作为障碍物,然后烘焙场景。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的寻路层。

[csharp] view
plain
 copy

  1. //动态设置寻路路径层
  2. void OnGUI()
  3. {
  4. if (!setAgentWalkMask)
  5. {
  6. return;
  7. }
  8. if (GUI.Button(new Rect(0, 0, 100, 50), "走下层"))
  9. {
  10. agent.walkableMask = 65;
  11. }
  12. if (GUI.Button(new Rect(0, 100, 100, 50), "走上层"))
  13. {
  14. agent.walkableMask = 129;
  15. }
  16. }

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手游之路自动寻路Navmesh之高级主题的更多相关文章

  1. Unity手游之路自动寻路Navmesh之入门

    http://blog.csdn.net/janeky/article/details/17457533 现在的大部分mmo游戏都有了自动寻路功能.点击场景上的一个位置,角色就会自动寻路过去.中间可能 ...

  2. Unity手游之路<七>角色控制器

    Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...

  3. Unity手游之路<八>自动寻路Navmesh之入门

    http://blog.csdn.net/janeky/article/details/17457533 在的大部分mmo游戏都有了自动寻路功能.点击场景上的一个位置,角色就会自动寻路过去.中间可能会 ...

  4. Unity手游之路<十>自动寻路Navmesh之跳跃,攀爬,斜坡

    http://blog.csdn.net/janeky/article/details/17598113 在之前的几篇Blog总,我们已经系统学习了自动寻路插件Navmesh的相关概念和细节.然而,如 ...

  5. Unity手游之路<二>Java版服务端使用protostuff简化protobuf开发

    http://blog.csdn.net/janeky/article/details/17151465 开发一款网络游戏,首先要考虑的是客户端服务端之间用何种编码格式进行通信.之前我们介绍了Unit ...

  6. Unity手游之路<十三>手游代码更新策略探讨

    http://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙,加上家里事情也多,所以blog更新一直搁置了.最近在项目开发上线过程中 ...

  7. Unity手游之路<六>游戏摇杆之Easy Touch 3教程

    之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...

  8. Unity手游之路手游代码更新策略探讨

    版权声明: https://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙.加上家里事情也多,所以blog更新一直搁置了. 近期在项 ...

  9. Unity手游之路游戏摇杆之Easy Touch 3教程

    之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...

随机推荐

  1. ubuntu nohup命令用法

    让程序在后台运行 该命令的一般形式nohup command & 程序在后台运行并打印日志 nohup ./china_fund.py > china_fund.file 2>&a ...

  2. mac下编译FFmpeg-Android

    参考: [史上最傻瓜的]mac下编译FFmpeg-Android http://blog.csdn.net/ashqal/article/details/9381037

  3. 计算机中丢失OPENGL.dll

    开发OpenGL项目时,在VS开发环境下可能会出现如图所示的错误. 在c:\windows\system32和SysWow64文件夹下存在opengl32.dll,此时,所写程序能够正常编译,但是,程 ...

  4. Spark- Spark Yarn模式下跑yarn-client无法初始化SparkConext,Over usage of virtual memory

    在spark yarn模式下跑yarn-client时出现无法初始化SparkContext错误. // :: INFO mapreduce.Job: Task Id : attempt_142829 ...

  5. 尚学堂xml学习笔记

    1.打开eclipse,文件-新建java project,输入文件的名字,比如输入20181112. 2.对着src右键,选择new-file,输入文件名字,比如:book.xml. 3.开始写.x ...

  6. 时间序列数据库概览——基于文件(RRD)、K/V数据库(influxDB)、关系型数据库

    一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper.这类工具附属于监控告警工具,底层没有 ...

  7. ActorModel 概念翻译

    学习 skynet 时初次接触到 ActorModel 模型,始终觉得有必要从宏观上了解 ActorModel 的概念,所以以维基上这篇文章为参考,把文章中的部分内容翻译成中文,好让自己体会一下 Ac ...

  8. linux增加vlan网卡配置

    1.编辑文件/etc/sysconfig/network在里面添加一行:VLAN=yes2.再生成网卡设备的配置文件ifcfg-eth1.10和ifcfg-eth1.240cd /etc/syscon ...

  9. Java与国际化

    i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是"国际化"的简称. Java使用java.util.ResourceBu ...

  10. unbuntu下安装qq

    由于Wine QQ一直没更新版本导致目前版本报版本过低无法使用,暂时先上UK官网的国际版Wine QQ,虽然功能没那么新,但稳定能用: 下载: 下载地址:http://www.ubuntukylin. ...