关于Unity中网格导航与寻路
寻路思路
1.烘焙出地形数据,导航数据,区分哪些是路径,哪些是障碍物
2.给要寻路的角色添加寻路的组件,加好了以后就会有速度和目的地之类的参数设置
3.只要设置好目的地,角色就会根据烘焙好的地图自己走过去
4.要实现鼠标点哪里,就去哪里,也很简单,使用之前学习过的3D拾取的技术,找到当前鼠标点击的是哪个位置,设置一下目标点,那么主角就会走到鼠标点击的位置
5.如果是敌人怪物的话,有一个搜索的目标,目标到哪里,就会跟到哪里,属于敌人AI的决策
6.如果目的地找不到,主角就会走到他自己能走的某个相应地方
Window---->Navigation
Navigation栏的Object是要设置的对象列表,可以是All全部,Mesh Renderer有网格的或者是Terrains地形。
Bake是全局的参数的设置。
Area是层,这些层可以自定义,层的cost是寻路的代价,代价越高计算次数越高。
Nav Mesh Agent组件
1:代理器,角色或NPC(非玩家控制角色)关联好这个组件就能够使用这个组件在在地图上行走;
2: nav mesh agent 参数:
(1)Radius 代理器半径;
(2)Speed代理器移动速度;
(3)Acceleration 代理器加速度;
(4)Angular Speed代理器角速度;
(5)Stop distance 代理器到达时与目标的距离;
(6)Auto Tranver OffMesh Link 是否穿过自定义路线;
(7)Auto Baking 是否自动停止无法达到目的地的路线;
(8)Auto Repath: 原有路线发生变化的时候,是否重新寻路;
(9)Height: 代理器的高度;
(10)Base Offset: 代理器相对导航网格的偏移;
(11)Obstacle AvoidanceType: 代理器回避级别;
(12)Avoidance Priority 代理器回避优先级;
(13)Area Mask: 代理器可使用的导航网格层,unity对导航网格层以2^0, 2^1次对第0层第1层进行编码, Walkable是各层数据的和,比如3,可以在第0层和第1层移动;
寻路实例
1.创建Unity项目和文件目录
2.创建一个平面Plane和一个胶囊体Capsule,和一个立方体Cube
3.调出Navigation 导航窗口,Window-->Navigation, 将plane勾选为 Navigation Static,在Navigation Area选择Walkable,该窗口下按下Bake按钮,进行网格导航烘培;

4.被标记为Navigation Static的对象,都会出现青色的导航网格层,同时在Assets目录下会生成Pathing文件NavMesh.asset;

5.将Cube勾选为Navigation Static,在Navigation Area选择Not Walkable,该窗口下按下Bake按钮,进行网格导航烘培;

6.给胶囊体Capsule添加寻路组件Nav Mesh Agent,也叫导航代理
7.创建一个脚本nav_agent_test挂载Capsule下,来控制鼠标点到哪里,胶囊体Capsule就走到哪里
打开nav_agent_test脚本
using UnityEngine;
using UnityEngine.AI;
using System.Collections; public class nav_agent_test : MonoBehaviour
{ public NavMeshAgent agent;//要引入using UnityEngine.AI;库才可以使用
// Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown())//鼠标按下
{
//注意:要使用3D拾取技术,被点击所有物体必须有Collider碰撞检测器组件
// 发射一条射线
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(r, out hit))//射线是否点击到物体
{ // 射线点击到了某个物体;
Debug.Log(hit.collider.gameObject.name);//打印出当前射线点击到的物体的名字
this.agent.SetDestination(hit.point);//把当前点击到的物体的坐标设置为寻路代理组件的目的地坐标
}
// end
}
}
}
8.关联好Capsule节点到它自己的nav_agent_test脚本的public属性
9.运行,点击Game视图中的plane的任意一个位置,Capsule都会走过去,而且过程中会绕开Cube
自定义路线
有的时候想从一个地方爬过去,有楼梯直接跳下来啊之类的,默认的Navigation Area已经满足不了我们了
1: 为了满足复杂的地形而提供的特殊组件,开发人员可以自行设计所需路线,该路线会并入到导航网络中;一并参与寻路计算;
2: Off Mesh Link组件参数:
Start: 定义路线的起始位置信息;
End 自定义路线的目标位置信息;
Cost Override: 自定义路线的成本覆盖;
Bi directional 自定义路线是否允许双线穿越;
Activated: 是否激活改路线;
3: 自定义Area Type,自定义的层会和下面三个并列存在于Object的Navigation Area的选项中
Walkable: 这个区域可以行走;
Not Walkable: 这个区域不可以行走;
Jump: 可跳过,将会自动生成auto-generated Off-Mesh Links
自定义路线实例
1.创建一个新场景nav_map,保存到scene文件夹下
2.导入资源包map.unitypackage(第61),把模型map拖进场景中,把整个map节点右上角设置为Navigation Static
3.先选择map节点,再点击Navigation面板的bake栏的右下角的bake,烘焙好可以行走的路线

4.给每个map的子节点添加Mesh Collider,为等一下的3D拾取做准备
5.导入资源包hero.unitypackage(第61),把主角hero模型拖进场景中,把它放在某个位置,添加组件Nav Mesh Agent和关联刚才写好的脚本nav_agent_test

6.运行,发现中间有隔断的时候是过不去的,这时候就需要自定义路线
7.创建一个空节点offmesh,它的坐标从主角hero那边拷贝过去,比较好调接下来的位置,给它添加Off Mesh Link组件
8.在offmesh节点下再创建两个空子节点,为start和end,关联start和end节点到offmesh节点的Off Mesh Link组件的start和end属性里面
9.把start节点放在路的一边,end节点放在路的另一边,调整两个节点的位置,直到出现圈圈为止才算搭桥完成

10.运行,发现点击中间有隔断的路的另一侧的时候,可以飞过去
关于Unity中网格导航与寻路的更多相关文章
- Unity中实现网格轮廓效果,选中边框效果
问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...
- 在Unity中使用UGUI修改Mesh绘制几何图形
在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...
- Unity中使用WebView
Unity中使用WebView @(设计) 需求,最近游戏中需要引入H5直播页面和更新比较频繁的赛事页面,需求包括:加密传参数.和Unity交互,在Unity框架下其实有几种方案: 内置函数Appli ...
- 【原创翻译】初识Unity中的Compute Shader
一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...
- 【unity shaders】:Unity中的Shader及其基本框架
shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...
- Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点 ...
- 【Unity技巧】Unity中的优化技术
http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...
- 在Unity中高效工作(上)
原地址:http://www.unity蛮牛.com/thread-19974-1-1.html 编的话:感谢做编程的IT朋友,帮我翻译文章,我又稍稍做了些修改.给点儿掌声哩.欢迎大家多多评论呦. 我 ...
- Unity中的万能对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的万能对象池 本节通过一个简单的射击子弹的示例来介 ...
随机推荐
- u3d中的向量 vector3 vector2
Vector3(x,y,z)x代表左右,y代表上下,z代表前后 Vector3.magnitude 长度 计算两点之间的距离 .如果只给了一点的话.算出的长度其实就是和Vector3.zero点之间 ...
- diocp3-服务器的连接上限是到底是多少?diocp3的一个装13测试(8W连接数)
服务器的连接上限是到底是多少?diocp3开源项目的一个装13测试(8W连接数) 测试DEMO路径 diocp3\samples\ECHO 之前群里说一台服务器最多是High(Word)的连接数655 ...
- input type= file 如何更改自定义的样式
input { @include wh(24px,22px);//sass 宽高 @include pa(0,0); //绝对定位 top:0:left:0: opacity: 0; //透明度: o ...
- 扩展music-list.vue让列表前三名显示🏆奖杯
1.在music-list.vue中写DOM <li @click="seletItem(song,index)" class="song-item" v ...
- User-Defined-Literal自定义字面量
c++支持多种内置类型的字面量,比如: 123u // unsigned int 1.0 // double 1.6f // float 'a' // char 4ULL // unsigned lo ...
- 【转】一件有趣的事:我用 Python 爬了爬自己的微信朋友
偶然了解到 Python 里的 itchat 包,它已经完成了 wechat 的个人账号 API 接口,使爬取个人微信信息更加方便. 于是乎玩心一起,打算爬一下自己的微信. 步骤核心: 网页启动not ...
- Redhat6.5安装DB2 Express-C版本
Linux Redhat6.5安装DB2 Express-C版本: 创建相关用户和组 创建用户组: groupdel db2iadm1 groupadd -g 999 db2iadm1 groupad ...
- 移动app传统测试流程优化
[本文出自天外归云的博客园] 概述 在传统的软件测试流程中,每一期需求从开发到上线都要经历从需求分析与评审.测试用例评审.开发.测试.发布的流程.其中测试包含了后台测试.前端web测试.客户端测试.后 ...
- HTML 学习笔记一
一.学习HTML有什么用? 可以写网页,也就是网站上的一个页面. 二.HTML 代码是写给谁看的? HTML代码是给浏览器看的,当然,强大的人类也能看得懂,如果你觉得不累的话. 三.HTML的结构 & ...
- 5. 支持向量机(SVM)软间隔
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...