1 导航系统简介

​ 导航系统用于智能避障并寻找目标物体,如:王者荣耀中,当玩家跑到敌方塔的攻击范围内,敌方塔就会发射火团攻击玩家,当玩家逃跑时,火团会智能跟随玩家,其中智能跟随就使用到了导航系统。

1)导航系统使用流程

  • 将地面、路障等静态对象的 Static 属性设置为 Navigation Static;
  • 在 Navigation 窗口烘焙(Bake)导航网格;
  • 给导航角色添加 NavMeshAgent 组件;
  • 给导航角色添加脚本组件,并在脚本组件中设置导航目标位置(navMeshAgent.SetDestination)。

2)烘焙导航网格面板属性

​ 依次选择【Window→Navigation】打开导航窗口,再选择 Bake 选项卡,烘焙导航网格面板属性如下:

  • Agent Radius:角色半径
  • Agent Height:角色高度
  • Max Slope:角色能爬的最大坡度
  • Step Height:角色爬台阶时每步能跨的最大高度

3)NavMeshAgent 组件面板属性

  • Base Offset:导航角色与网格中心的偏移量
  • Speed:导航过程中最大速度
  • Angular Speed:拐弯时角速度
  • Acceleration:加速度
  • Stopping Distance:离目标多远停下
  • Auto Braking:当角色快达到目标时,自动减速
  • Radius:导航角色半径
  • Height:导航角色高度
  • Quality:导航质量,质量越高,导航算法越优,导航路径越短
  • Priority:导航角色优先级(多个导航角色过独木桥时,谁先过)
  • Auto Traverse Off Mesh Link:自动跨越分离路面
  • Auto Repath:自动重新规划路径
  • Area Mask:分层剔除,设置导航角色可以走哪些层

4)NavMeshAgent 组件常用属性和方法

// 设置导航目标
public bool SetDestination(Vector3 target)
// 停止导航(过时)
public void Stop()
// 恢复导航(过时)
public void Resume()
// 计算到指定位置的导航路径,如果路径不存在,返回false,说明通过导航不能到达该位置
// 如果路径存在,path里会存储到指定位置的所有拐点信息,获取拐点:Vector3[] corners = path.corners
public bool CalculatePath(Vector3 targetPosition, NavMeshPath path)
// 完成分离路面导航,继续走剩下的路
public void CompleteOffMeshLink() // 停止还是恢复
isStopped
// 期望导航速度
desiredVelocity
// 当前导航速度
velocity
// 停止距离,距离目标多远时停下来
stoppingDistance
// 导航剩余距离
remainingDistance
// 通过导航更新位置
updatePosition
// 通过导航更新旋转
updateRotation
// 分层剔除,设置导航角色可以走哪些层,int类型(32位),-1表示全选,2^n表示只选第n层(n从0开始)
areaMask
// 角色当前是否正处于分离路面导航状态
isOnOffMeshLink
// 当前分离路面连接数据,包含startPos、endPos、activated、linkType等属性
currentOffMeshLinkData

2 应用

1)游戏界面

2)设置 Navigation Static

​ 选中地面、斜坡、台阶、路障等静态对象,将 Static 属性设置为 Navigation Static,如下:

3)烘焙导航网格

​ 依次选择【Window→Navigation】打开导航窗口,再选择 Bake 选项卡,设置 Max Slope、Step Height 属性分别为 45、1.1,如下:

​ 点击 Bake 烘焙导航网格,导航网格显示如下:

​ 其中,蓝色和浅绿色表示导航可以走的区域。

4)添加 NavMeshAgent 组件

​ 给胶囊体添加 NavMeshAgent 组件。

5)添加脚本组件

​ NavigationController.cs

using UnityEngine;
using UnityEngine.AI; public class NavigationController : MonoBehaviour {
private NavMeshAgent navMeshAgent;
private Transform target; private void Awake() {
navMeshAgent = GetComponent<NavMeshAgent>();
target = GameObject.Find("Target").transform;
} private void Update() {
navMeshAgent.SetDestination(target.position);
}
}

​ 说明:NavigationController 脚本组件挂在胶囊体上。

​ TargetController.cs

using UnityEngine;

public class TargetController : MonoBehaviour {
private CharacterController character;
private float speedRate = 4f; private void Awake() {
character = GetComponent<CharacterController>();
} private void Update () {
float hor = Input.GetAxis("Horizontal");
float ver = Input.GetAxis("Vertical");
Vector3 speed = new Vector3(hor, 0, ver) * speedRate;
character.SimpleMove(speed);
}
}

​ 说明:TargetController 脚本组件挂在球体上,并且球体上需要挂载 CharacterController 组件,其 Slope Limit、Step Offset 属性分别设置为 45、1.1。

6)运行效果

​ 声明:本文转自【Unity3D】导航系统

【Unity3D】导航系统的更多相关文章

  1. Unity3D 引擎基础 C# (数据结构入门) Unity3D 界面 UI(NGUI)(动画系统,导航系统)(委托与事件,常用设计模式)

    Geomagic Sculpt 2016.2 Windows Software 11个月前 (01-17) 0评论 Geomagic Sculpt 触觉式三维设计 触碰您的设计使用三维工具做三维设计. ...

  2. Unity3D寻路导航烘焙

    在初次进行3D(三维)游戏体验中,避免不了对游戏有生疏的情况,因此在游戏中一般会插入新手指导.自动寻路.导航地图等AI人工智能技术到游戏中,方便玩家更快体验,为了玩家的体验更好,Unity3D寻路导航 ...

  3. Unity3d学习 预设体(prefab)的一些理解

    之前一直在想如果要在Unity3d上创建很多个具有相同结构的对象,是如何做的,后来查了相关资料发现预设体可以解决这个问题! 预设体的概念: 组件的集合体 , 预制物体可以实例化成游戏对象. 创建预设体 ...

  4. Unity3d入门 - 关于unity工具的熟悉

    上周由于工作内容较多,花在unity上学习的时间不多,但总归还是学习了一些东西,内容如下: .1 根据相关的教程在mac上安装了unity. .2 学习了unity的主要的工具分布和对应工具的相关的功 ...

  5. TDD在Unity3D游戏项目开发中的实践

    0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...

  6. warensoft unity3d 更新说明

    warensoft unity3d 组件的Alpha版本已经发布了将近一年,很多网友发送了改进的Email,感谢大家的支持. Warensoft Unity3D组件将继续更新,将改进的功能如下: 1. ...

  7. Unity3D框架插件uFrame实践记录(一)

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

  8. Unity3D 5.3 新版AssetBundle使用方案及策略

    1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...

  9. 山寨Unity3D?搜狐畅游的免费开源游戏引擎Genesis-3D

    在CSDN上看到了<搜狐畅游发布3D游戏引擎Genesis-3D 基于MIT协议开源>(http://www.csdn.net/article/2013-11-21/2817585-cha ...

  10. 从Unity3D编译器升级聊起Mono

    接前篇Unity 5.3.5p8 C#编译器升级,本文侧重了解一些Mono的知识. Unity3D的编译器升级 新升级的Mono C#编译器(对应Mono 4.4) Unity编辑器及播放器所使用的M ...

随机推荐

  1. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.26)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  2. [转帖]为什么需要在脚本文件的开头加上#!/ bin / bash?

    本文翻译自:Why do you need to put #!/bin/bash at the beginning of a script file? I have made Bash scripts ...

  3. [转帖]Windows设置WiFi走外网,有线网卡走内网。

    https://www.itblogcn.com/article/1844.html   文章目录 设置笔记本 WIFI 走外网,网线走内网: 1.查看路由表: 2.删除默认路由: 3.添加 WiFi ...

  4. [转帖]TiDB Lightning 在数据迁移中的应用与错误处理实践

    TiDB Lightning 在数据迁移中的应用与错误处理实践 作者简介:DBA,会点 MySQL,懂点 TiDB,Python. 个人主页:https://tidb.net/u/seiang/ans ...

  5. [转帖]jmeter正则表达式提取器获取数组数据-02篇

    接上篇,当我们正则表达式匹配到多个值以后,入下图所示,匹配到21个结果,如果我们想一次拿到这一组数据怎么办呢 打开正则表达式提取器页面,匹配数字填入-1即可 通过调试取样器就可以看到匹配到已经匹配到多 ...

  6. [转帖]Jmeter创建简单的HTTP(S)请求测试-3

    在上一章节中,介绍了Jmeter基本的组成组件,那么我们如何使用这些组件去完成测试呢,以下将通过创建一个简单的HTTP(S)测试进行说明,另外,除JDBC请求外,Jmeter进行测试构建的步骤大同小异 ...

  7. [转帖]GC日志分析工具——GCViewer案例

    原创 石页粑粑 来自zxsk的码农 2020-09-28 06:18 一.GCViewer介绍 业界较为流行分析GC日志的两个工具--GCViewer.GCEasy.GCEasy部分功能还是要收费的, ...

  8. Oracle AWR学习之二-利用ChatGPT编写一键获取AWR报告的脚本

    Oracle AWR学习之二-ChatGPT提升效率之n 背景 之前生成awr报告比较麻烦, 想着能够一键生成. 再辅以部分shell或者是python处理就可以进行细致的分析. 这一块其实还是比较简 ...

  9. 【转帖】You can now run a GPT-3-level AI model on your laptop, phone, and Raspberry Pi

    https://arstechnica.com/information-technology/2023/03/you-can-now-run-a-gpt-3-level-ai-model-on-you ...

  10. 一个Redis dump文件的简要分析过程

    摘要 遇到一个老大难的问题. 让帮忙分析一下一个Redis的dump文件. 虽然之前写过了rdb和rdr的文档 但是感觉大家都喜欢拿来主义. 没办法. 今天继续进行深入一点的分析. 原理其实还是基于r ...