unity-导航系统
1. 原生导航系统
1. 基本使用
窗口->AI->导航 打开导航界面。
导航系统在使用前要先烘焙,拥有静态navigation static的对象会在上面根据要求生成可到达以及无法到达的区域,取消勾选该对象,以能够随意地在该对象上移动。
2. 烘焙导航网格
参数 | 描述 |
---|---|
代理半径 | 区域与边缘的最小半径 |
代理高度 | 区域内地面与上方障碍物的最小高度 |
最大坡度 | 斜坡最大高度 |
步高 | 垂直台阶可上升的最大高度 |
3. 控制单位
为控制单位物体添加NavMeshAgent组件,并引入UnityEngine.AI。
面板功能 | 描述 |
---|---|
speed | 移速 |
Angular Speed | 旋转速度 |
Acceleration | 加速度 |
Stopping Distance | 停止距离 |
Auto Braking | 自动刹车 |
代码功能 | 描述 |
---|---|
SetDestination(Vector3) | 设置移动导航目标点 |
updatePosition | 是否自动更新位置 |
updateRotation | 是否自动更新旋转轴 |
remainingDistance | 与目标的距离 |
nextPosition | 导航网络的目标点 |
desiredVelocity | 旋转的目标方向 |
代码实例:利用通过代码控制角色移动
private NavMeshAgent agent;float rotateTime = 0;
public float rotateSmooothing = 7;
public float speed = 4;void Start()
{agent = GetComponent<NavMeshAgent>();agent.updatePosition = false;agent.updateRotation = false;
}private void Update()
{if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if(Physics.Raycast(ray, out hit)){agent.SetDestination(hit.point);}rotateTime = 0;}Move();
}private void Move()
{if(agent.remainingDistance > 0.5f){agent.nextPosition = transform.position;// agent.desiredVelocity 该朝向的方向transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(agent.desiredVelocity), rotateTime);rotateTime = rotateSmooothing * Time.deltaTime;// 前进方向永远与是自身的前方// transform.Translate(transform.forward * speed * Time.deltaTime);transform.Translate(Vector3.forward * speed * Time.deltaTime);}
}
4. 导航对象
选项 | 描述 |
---|---|
All | 显示所有 |
Mesh Renderers | 显示导航网格渲染的对象们 |
Terrains | 地形 |
5. navigation area(区域)
每种区域可以设置一个花费,给予对象一个经过这段路程的耗费值
若想对象完全无法到达,点击那个对象,在导航的对象中找到navigation area,设置为not walkable。
6. 平台跳跃
首先要在烘焙中设置跳跃高度。
为可以跳跃的平台设置Generate OffMeshLinks以生成可跳跃区域
7. 导航网络障碍
通过添加导航网络障碍,来为导航网络添加动态的障碍物
功能 | 描述 |
---|---|
切割 | 在物体静止后重新生成导航网格(用于不经常移动的物体) |
8. Off Mesh Link
一个自定义的跳跃点,挂在在单独一个组件上
参数 | 描述 |
---|---|
起始 | 起始位置 |
结束 | 结束位置 |
成本 | 等距耗费倍数 |
双向 | 是否双向 |
已激活 | 是否激活 |
自动更新位置 | 运行后是否根据两个坐标当时位置更新 |
9. NavMeshComponent
先要下载导入NavMeshComponents模块。
为导航面物体添加NavMeshSurface组件。
功能 | 描述 |
---|---|
Agent Type | 导航网格使用哪一类参数进行烘培(自定义后选择一种,与Nava Mesh Agent保持一致) |
Collect Objects | 渲染范围(音量:指区域渲染) |
Use Geometry | 渲染依据mush render还是碰撞器 |
BuildNavMesh() | 重新烘培导航网络 |
2. 2D导航系统
1. 基本使用
- 基于原生导航系统的扩展
- 为需要导航的精灵添加组件 NavMeshModifier 设置导航区域
- 创建空对象,添加脚本 NavMeshSurface、NavMeshCollectSorces2D 组件。
点击 NavMeshCollectSorces2D 中的 Rotate Surface to XY 旋转至 XY 轴后,点击 NavMeshSurface中的烘焙,烘焙网络。
- 修改原生导航网络的代理,调整代理参数(如边界)。
- 为需要导航的对象添加脚本 Nav Mesh Agent
- 代码中使用
// 导航组件
NavMeshAgent agent;
// 目标
public Transform targetTrans;void Start()
{agent = GetComponent<NavMeshAgent>();// 禁止旋转agent.updateRotation = false;agent.updateUpAxis = false;
}void Update()
{SetDestination(targetTrans.position);
}// 插件存在小bug,如果在同一y轴时可能会无法正确寻路,因此需要手动为其添加位置偏移、
void SetDestination(Vector3 pos)
{float agentOffset = 0.0001f;Vector3 agentPos = (Vector3)(agentOffset * Random.insideUnitCircle) + pos;agent.SetDestination(agentPos);
}
2. 设置不可走区域
为障碍物对象(瓦片地图)添加组件 NavMeshModifier。注意勾选重写覆盖为不可行走区域。
NavMeshModifierVolume 允许你设定区域障碍。
可在此处设置烘焙区域模型(形状)
3. 改用碰撞盒进行区域判定
- 原生设置是以图像精灵的纹理区域决定区域位置大小
- 根基碰撞盒的大小形状不同,可生成出不同形状的区域以及不可达区域。
- 修改此项即启用
unity-导航系统相关推荐
- Unity基础笔记(6)—— Unity导航系统
Unity导航系统 一.NavMeshAgent组件 1. 导航系统介绍 首先看两个导航系统的应用: 网络游戏中的自动寻路功能,点击地图上的某个位置,角色自动跑到这个位置 RTS 和 Moba 类游戏 ...
- 11.5项目小结(推箱子Unity导航系统)
一.推箱子 重难点: 箱子移动,推动箱子. 1.移动: 思路: 按下WASD键,先改变player的角度,然后沿着Z方向移动: if(Input.GetKeyDown(KeyCode.W)){Vect ...
- Unity 导航系统Navigation
基于unity引擎的开发进阶之 导航系统 在游戏中常常有根据目标位置自动生成路线并自动寻路的功能,在3d导航中我们需要根据目的地生成到达目的地的可行路径. Unity的Navigation导航功能通过 ...
- unity 创建图片ui_在 Unity中 将游戏数据储存至本地文档
作者:游戏工坊-胡继伟 链接:https://blog.csdn.net/hu1262340436/article/details/110236103 在Unity中 添加本地文档储存游戏数据 首先我 ...
- Unity基础知识汇总
2.Unity相关知识 2.1 Unity介绍 Unity成为一款可以轻松创建游戏和三维互动的开发工具,是一个专业跨平台游戏引擎 Unity操作快捷键 Ctrl N New Scene 新建场景 Ct ...
- Unity_导航系统
目录 基础简介 静态网格 动态网格 分离网格连接 基础简介 Unity的导航系统是需要先分析场景中的自由活动区域和障碍区域,简单说就是先在编辑器模式下进行烘焙生成场景信息,然后再运行A*算法计算出路径 ...
- 3D游戏编程与设计作业10
3D游戏编程与设计作业10 环境说明 Unity3D 导航与寻路 Agent 和 Navmesh 练习 Obstacle和Off-Mesh-Link练习 P&D 过河游戏智能帮助实现 状态图 ...
- Unity3d学习日记 (2)C#脚本编写优化以及全自动敌人脚本实现实战
需求分析 需要编写脚本控制敌人的行为,完成包括巡逻.射击.追击.逃跑四个功能 解决思路 考虑机器人的行为受一个决策树的影响,编写有限状态自动机形成决策树,通过条件分支语句来对机器人的行为进行限制和控制 ...
- unity碰撞检测函数,碰撞信息获取,触发检测,使用粒子系统创建火焰,创建动画(火光闪烁),导航系统,通过导航系统控制人物移动,控制摄像机的跟随,控制角色动画播放
碰撞检测函数 private void OnCollisionEnter(Collision collision){print("OnCollisonEnter");}privat ...
- 【Unity 3D 从入门到实战】Unity 3D 导航系统
目录 一,前言 二,导航系统介绍 三,Navigation总控制面板介绍 1,Agents面板(导航参数设置) 2,Areas面板(层设置) 3,Bake面板(烘焙导航网格) 4,Object面板(对 ...
最新文章
- Linux下如何同时注释多行/同时取消多行注释
- oracle adf 使用,ORACLE ADF 问题总结
- react中js文件中写html,javascript – 使用静态HTML与React
- Scala元组数据的遍历
- java传送字符到前端_javaWeb后台特殊字符怎样还原传给前端正确显示?
- 对HTTP基本认识(HTTP协议入门必备)
- 学会判断Web安全网关的性能
- Protable 自定义添加搜索栏和toolbar
- 无法启动此程序因为计算机丢失gdiplus,gdiplus.dll 丢失
- 电气控制技术实训考核装置
- 日期,Wed Nov 24 2021 08:00:00 GMT+0800 (GMT+08:00) 相互转换
- jenkins如何清缓存_Maven本地缓存清理小工具
- BUUCTF Crypto RSA what writeup
- 中北大学信息商务学院计算机系学生会名单,2017年中北大学信息商务学院新媒体中心部员竞选结果公示...
- 已解决ModuleNotFoundError: No module named ‘Workbook‘
- ipv6地址概述——带你了解ipv6与ipv4的不同
- scikit-learn学习笔记-bili莫烦
- (计算机组成原理)RISC与CISC的区别
- PPT提示缺少字体怎么解决?
- PMP证书的必要性、培训机构选择以及其他相关问题整理
热门文章
- 莫比乌斯带catia建模_神奇的莫比乌斯带(mobius)
- html 选项按照abcd,怎么把Word里的多个题目的ABCD 选项快速排列整齐
- 【先进事迹】11111HTML
- php 表情 代码_PHP 大量QQ表情代码替换
- 2020604 Java基础复习
- 优秀程序员的45个习惯[摘]
- “裸考”通过CATTI考试的经历
- 按键精灵sub子程序篇
- java viewer 控件_插件制作过程记录(使用TreeViewer贡献视图)
- 4.1 Linux之初识Linux