Unity基础到入门-导航系统(Navigation)

这篇具有很好参考价值的文章主要介绍了Unity基础到入门-导航系统(Navigation)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

✨以下是导航相关知识点,文章如有误请指正,如果觉得对你有用,请点赞收藏关注一波,谢谢支持😘


前言

Unity 3D导航系统(Navigation) Unity 3D Navigation(导航)是用于实现动态物体自动寻路的一种技术,它将游戏场景中复杂的结构关系简化为带有一定信息的网格,并在这些网格的基础上通过一系列相应的计算来实现自动寻路
过去,游戏开发者必须自己打造寻路系统,特别是在基于节点的寻路系统中,必须手动地在 AI 使用的点之间进行导航,因此基于节点系统的寻路非常烦琐。
Unity 3D 不仅具有导航功能,还使用了导航网格(navigation meshes),这比手动放置节点更有效率而且更流畅。
更重要的是,还可以一键重新计算整个导航网格,彻底摆脱了手动修改导航节点的复杂方法。


提示:以下是本篇文章正文内容

Unity AI(Navigation)导航系统🤖🤖🤖

  种类

unity navigation,unity,游戏引擎

  NavMeshAgent类

描述

导航网格代理 👉 此组件附加到游戏中的某个移动角色,以允许该角色使用导航网格在场景中导航

一、属性、变量、方法

  1. 变量
属性名 作用
desiredVelocity 代理的期望速度,包括来自规避的任何潜在贡献。(只读)
velocity✔ 获取 NavMeshAgent 瞬时速度,或者设置一个速度来手动控制代理。
velocity.magnitude 打印向量的膜。
nav.velocity.sqrMagnitude 返回该向量的平方长度。(只读)
speed 遵循路径时的最大移动速度。
isStopped 导航停止还是恢复。
destination 获取目标点。
stoppingDistance 停止距离。
remainingDistance ✔ 剩余距离。(只读)
areaMask 指定走哪条路,-1(全选),(2^(选几个-1))
isOnOffMeshLink 是否处于分离式导航?(只读)
updatePosition 获取或设置变换位置是否与模拟的代理位置同步。默认值为 true(通过导航更新的位置)。
updateRotation 代理是否应该更新变换方向(通过导航更新的旋转)?
acceleration 代理遵循某一路径时的最大加速度,以单位/秒^2 表示。
agentTypeID 代理的类型 ID。
angularSpeed 遵循路径时的最大回转速度(以 deg/s 为单位)。
autoBraking 代理是否应自动制动以避免越过目标点?
autoRepath 如果现有路径失效,代理是否应尝试获取新的路径?
autoTraverseOffMeshLink 代理是否应自动跨越 OffMeshLink?
avoidancePriority 规避优先级别。
baseOffset 拥有 GameObject 的相对垂直位移。
currentOffMeshLinkData 当前的 OffMeshLinkData。
hasPath 代理当前是否有路径?(只读)
height 代理高度(为了从障碍物下穿过,等)。
isOnNavMesh 代理当前是否绑定到导航网格?(只读)
isPathStale 当前路径过时了吗?(只读)
navMeshOwner 返回当前放置代理的导航网格所属的对象(只读)。
nextOffMeshLinkData 当前路径上的下一个 OffMeshLinkData。
nextPosition 获取或设置导航网格代理的模拟位置。
obstacleAvoidanceType 规避品质级别。
path 获取和设置当前路径的属性。
pathPending 是正在计算过程中而尚未就绪的路径吗?(只读)
pathStatus 当前路径的状态(完整、部分或无效)。
radius 代理的规避半径。
steeringTarget 获取路径中的当前转向目标。(只读)
updateUpAxis 您可以用来指定代理是否应与导航网格的向上轴或者它所在的链接对齐。
  1. 公共函数
属性名 作用
SetDestination 设置导航的目标 如:.SetDestination(Vector 3)
CalculatePath 计算到指定点的路径并存储生成的路径(返回ture) 如:nav.CalculatePath(目标位置, NavMeshPath)
NavMeshPath.corners获取拐点
💤 💤
ActivateCurrentOffMeshLink 启用或禁用当前的网格外链接。
CompleteOffMeshLink 完成在当前 OffMeshLink 上的移动。
FindClosestEdge 找到最近的导航网格边缘。
GetAreaCost 获取在跨越特定类型的区域时的路径计算成本。
Move 将相对移动应用于当前位置。
Raycast 在导航网格中跟踪一条直线路径到达目标位置,而无需移动代理。
ResetPath 清除当前路径。
SamplePathPosition 沿着当前路径对某一位置进行取样。
SetAreaCost 设置遍历此类型区域的成本。
SetPath 为此代理分配一条新路径。
Warp 将代理调整至指定的位置。
  1. 继承的成员公共函数
属性名 作用
roadcastMessage 调用此游戏对象或其任何子项中的每个 MonoBehaviour 上名为 methodName 的方法。
endMessage 调用此游戏对象中的每个 MonoBehaviour 上名为 methodName 的方法。
endMessageUpwards 调用此游戏对象中的每个 MonoBehaviour 上或此行为的每个父级上名为 methodName 的方法。
ToString 返回对象的名称。
  1. 静态函数
属性名 作用
Destroy 移除 GameObject、组件或资源。
DestroyImmediate 立即销毁对象 /obj/。强烈建议您改用 Destroy。
DontDestroyOnLoad 在加载新的 Scene 时,请勿销毁 Object。
FindObjectOfType 返回第一个类型为 type 的已加载的激活对象。
FindObjectsOfType Gets a list of all loaded objects of Type type.
Instantiate 克隆 original 对象并返回克隆对象。

二、基本使用

  1. 引入命名空间:using UnityEngine.AI;
  2. 勾选静态导航

unity navigation,unity,游戏引擎

  1. 烘培

unity navigation,unity,游戏引擎
3. Player舔加NavMeshAgent组件
4. 创建一个目标位置
5. 设置目标位置:NavMeshAgent.SetDestination(Vector 3);
6. 代码演示:🛬🛬🛬🛬🛬🛬

	public Transform tran;
	
	private NavMeshAgent nav;
	
	void Start () {
		nav = GetComponent<NavMeshAgent>();
	}
	
	void Update () {
		nav.SetDestination(tran.position);
	}
  1. Player 身上的三个箭头

红色: 指向(阶段性目标)
蓝色: (阶段性期望速度)
黑色: (瞬时速度)

unity navigation,unity,游戏引擎

三、分离路面导航🤾‍♀️

  • 普通分离路面
  1. 设置分离路面静态

    设置方法:选中两个Plane路面,然后选中Off Mesh Link Generation(有两种选择的方法);

  2. 分离路面跳跃设置

    设置方法:选中面板Navigation->Bake->(DorpHeight(只能从高跳到低)/JumpDistance(双向跳跃)(前提是两个地面的高低差不多))

  • 高级分离路面
  1. 舔加offMeshLink组件(挂在两点其中一点上)
  2. 使用 👇

1、创建两个点分别放在地面的两端
2、然后拖给offMeshLink组件

  • 选择路线导航
  1. 选中要导航的路线

unity navigation,unity,游戏引擎

  1. 舔加Areas名称(给两条路选上名称)

unity navigation,unity,游戏引擎

unity navigation,unity,游戏引擎

  1. 选择要导航的路线名称

unity navigation,unity,游戏引擎

  1. 代码实现选导航路线

nav.areaMask获取对应层的编号

编号的计算公式2^n-1 (n为第几层)

如:选中4层 :2^3-1

unity navigation,unity,游戏引擎

例子:

navs = GetComponent<NavMeshAgent>();
navs.areaMask = 16;

选中的是第五层公式是2^5-1=16
unity navigation,unity,游戏引擎

四、堵墙

给障碍物舔加组件:NavMeshObstacle组件

unity navigation,unity,游戏引擎

五、Trail组件

unity navigation,unity,游戏引擎

unity navigation,unity,游戏引擎

六、Line组件

说明:线渲染器用于在 3D 空间中绘制自由浮动的线。

变量:

变量
alignment 选择线是朝向摄像机还是变换组件的方向。
colorGradient 设置颜色渐变,用于描述线在其长度上各个点处的颜色。
endColor 设置线终点处的颜色。
endWidth 设置线终点处的宽度。
generateLightingData 配置线以生成法线和切线。借助此数据,场景光照可以通过法线贴图和 Unity 标准着色器或是您自己的定制着色器来影响线。
loop 将线的起点和终点位置连接在一起,以形成连续循环。
numCapVertices 将它设置为大于 0 的值,可在线的每端上获得圆角。
numCornerVertices 将它设置为大于 0 的值,可在线的每个细分段之间获得圆角。
positionCount 设置/获取顶点数。
shadowBias 应用阴影偏差以防止自我阴影瑕疵。指定的值是每一段的线宽比例。
startColor 设置线起点处的颜色。
startWidth 设置线起点处的宽度。
textureMode 选择线纹理的 U 坐标是进行平铺还是拉伸。
useWorldSpace 如果启用,则在世界空间中定义线。
widthCurve 设置曲线,用于描述线在其长度上各个点处的宽度。
widthMultiplier 设置一个整体乘数,它应用于 LineRenderer.widthCurve 以获取线的最终宽度。

公共函数:

公共函数
BakeMesh 创建 LineRenderer 的快照并将其存储在 mesh 中。
GetPosition 获取线中某个顶点的位置。
GetPositions 获取线中所有顶点的位置。
SetPosition ☆ ⬅⬅⬅ 设置线中某个顶点的位置。
SetPositions ☆ ⬅⬅⬅ 设置线中所有顶点的位置。
Simplify 通过删除处于指定公差内的点来生成原始线的简化版本。

使用鼠标在屏幕画线小案例

unity navigation,unity,游戏引擎

代码演示:

private bool isDown;
private bool isUp;
private bool currenIsDown;
private bool currenIsUp;

private Vector3 curren;
private Vector3 startPos;
private Vector3 endPos;

private LineRenderer line;

private int lineDo;

private Vector3[] Postion=new Vector3[10];

private float lineTime;

void Start()
{
    line = GetComponent<LineRenderer>();
}

void Update()
{
    curren.x = Input.mousePosition.x;
    curren.y = Input.mousePosition.y;

    currenIsDown = false;
    currenIsUp = false;
    isDown = Input.GetMouseButton(0);
    if (isDown && !isUp) currenIsDown = true;
    if (!isDown && isUp) currenIsUp = true;
    isUp = isDown;

    if (currenIsDown|| isDown)
    {
        startMove();
    }
}

void startMove()
{
    startPos = curren;

    var a = Camera.main.ScreenToWorldPoint( new Vector3(startPos.x,startPos.y,10));
    var b = Camera.main.ScreenToWorldPoint( new Vector3(endPos.x, endPos.y,10));

    if (Vector3.Distance(a, b) > 0.1f)
    {
        lineDo++;
        settingOut();
        sendLinePosion();
    }

    endPos = curren;

    lineTime -= Time.deltaTime;

    if (lineTime < 0)
    {
        lineDo++;
        settingOut();
        lineTime = 0.1f;
    }
}

    void settingOut()
    {
        if (lineDo <= 9)
        {
            for (int i = lineDo; i <= 9; i++)
            {
                Postion[i] = Camera.main.ScreenToWorldPoint(new Vector3(curren.x, curren.y, 10));
            }
        }
        else
        {
            for (int j = 0; j <= 8; j++)
            {
                Postion[j] = Postion[j + 1];
            }
            Postion[9] = Camera.main.ScreenToWorldPoint(new Vector3(curren.x, curren.y, 10));
        }
    }

/// <summary>
/// 将保存的点添加到line上
/// </summary>
private void sendLinePosion()
{
    int i = 0;
    foreach (Vector3 item in Postion)
    {
        line.SetPosition(i, item);
        i++;
    }
}


NavMesh类

描述

用于访问烘焙导航网格的单例类。

NavMesh 是一个类,可用于执行空间查询(如寻路和步行性测试)、设置特定区域类型的寻路成本以及调整寻路和规避的整体行为。

静态变量:

变量名 作用
SamplePosition 在指定范围内找到导航网格上最近的点。P1
AllAreas 包含所有导航网格区域的区域遮罩常量。
avoidancePredictionTime 描述代理在未来多久后预测碰撞,以便进行规避。
onPreUpdate 设置一个要在执行帧更新期间且在导航网格更新之前调用的函数。
pathfindingIterationsPerFram 异步寻路过程中每帧处理的最大节点数。
静态函数
AddLink 向导航网格添加链接。此链接由 NavMeshLinkData 结构描述。
AddNavMeshData 戏添加指定的导航网格数据。
CalculatePath 两点之间的路径并存储生成的路径。
CalculateTriangulation 计算当前导航网格的三角形剖分。
CreateSettings 创建并返回可用于运行时导航网格构建操作的导航网格构建设置新条目。
FindClosestEdge 从导航网格上的一点找到最近的导航网格边缘。
GetAreaCost 获取区域类型几何体的寻路成本。
GetAreaFromName 返回名为导航网格区域类型的区域索引。
GetSettingsByID 返回导航网格构建设置的现有条目。
GetSettingsByIndex 按其有序索引返回导航网格构建设置的现有条目。
GetSettingsCount 返回已注册的导航网格构建设置的数量。
GetSettingsNameFromID 返回与导航网格构建设置(与提供的代理类型 ID 匹配)关联的名称。
Raycast 在导航网格上的两点之间找出一条线。
RemoveAllNavMeshData 从游戏中删除所有导航网格表面和链接。
RemoveLink 从导航网格中删除链接。
RemoveNavMeshData 从游戏中删除指定的 NavMeshDataInstance,使其无法用于代理和查询。
RemoveSettings 删除与代理类型 ID 匹配的构建设置。
SetAreaCost 设置所有代理上的区域类型几何体的寻路成本。

委托:

委托名 作用
OnNavMeshPreUpdate 一种委托,用于注册在导航网格系统更新之前调用的回调方法。

代码:文章来源地址https://www.toymoban.com/news/detail-776655.html

P1
NavMeshHit hit;
NavMesh.SamplePosition(目标点, out hit, 范围, layer) ? enemyRandomPoint : transform.position;
作用说明:在指定范围内找到导航网格上最近的点,如果找到就就执行enemyRandomPoint函数(自己创建的🙃)返回一个随机的坐标继续导航,如果没找到就是他自己的位置,就不会导致卡障碍物的旁边。

到了这里,关于Unity基础到入门-导航系统(Navigation)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】导航 Navigation 设置:窄桥、隧道、斜坡、台阶、坠落、跳跃

    Navigation 是导航网格的核心模块,可以实现对 Agent(代理)、Area(区域)、Bake(烘焙)、Object(对象)的配置。 烘焙设置可以调整烘焙的方式,如代理半径、可移动斜坡角度等。 Agent Radius :代理半径,这个代理半径决定了烘焙路面距离墙面的距离,有时两面墙距离过近时可

    2024年02月04日
    浏览(52)
  • Unity3D学习记录03——Navigation智能导航地图烘焙

    首先还是在Package Manager中安装AI Navigation 接着选择我们场景的地面,右键,找到AI的NavMesh Surface,它会为我们的Ground添加一个叫NavMesh Surface的子物体 在Inspector窗口中可以看到它的详细的参数: 图中的R,H为你人物的参数,45°为你的人物可以爬行的最大角度 Agent Type里面可以改

    2024年02月08日
    浏览(55)
  • 【Unity】Unity寻路系统讲解及Navigation实际应用

    Unity常用的寻路方式主要有以下几种: 路点寻路(WayPoint) 单元格寻路(Grid) 导航系统(Navigation) 路点寻路就是在地图上指定一些路点,让角色在路点之间移动。常用于一些固定路线的敌人或物体。 优点:路点寻路的优点是实现起来比较简单,且占用资源少、计算开销低

    2024年02月01日
    浏览(99)
  • 【Unity自动寻路】使用Navigation系统实现物体自动寻路绕开障碍物

    知识点流程图 我们在游戏场景中经常会有一些障碍物、墙壁、树木等等,如果我想要让角色或者怪物去墙的另一边,我直接在墙另一边点击左键,我希望角色自动跑过去,但是他不能直接穿透墙,他需要“智能”的绕开障碍物,自动找到可以走的路,自己过去!这就是Unity

    2024年02月03日
    浏览(52)
  • Unity navigation烘焙不显示

    1.场景设置为navigation static。 2.有mesh render。 点击bake后无反应,不显示蓝色可行走区域(nav mesh)。 将layout设置为默认布局。 [Window]→[Layouts]→[Reset All Layouts]

    2024年02月15日
    浏览(60)
  • unity关于navigation使用的问题——Window没有AI选项以及Navigation烘焙没有效果

    在Window中Package Manager的unity register下载AI Register包,然后你就发现window中有AI选项了 这个我看了其他人的解决方法都没用,然后我自己捣鼓出来了,希望可以给其他遇到这种情况的朋友一点帮助。  1.Gizmos一定要选上为蓝色,也就是右上角的那个类似地球的图标 2.Show only Selec

    2024年02月08日
    浏览(37)
  • Unity AI Navigation自动寻路

    Unity是一款强大的游戏开发引擎,而人工智能(AI)导航是游戏中至关重要的一部分。通过Unity的AI Navigation系统,开发者可以轻松地为游戏中的角色实现自动导航功能。本文将介绍Unity中AI Navigation的基础内容,帮助开发者快速入门。 Unity中的AI Navigation是一套用于游戏开发的导

    2024年04月16日
    浏览(40)
  • Unity 找不到 Navigation 组件的解决

    当我们想利用unity 里面的Navigation 组件来实现我们的物体的自动导航时,有时竟然会发现我们的菜单栏里面找不到 该组件  这时我们应该怎么办?         请确保你的项目中已经导入了Unity 的 AI 模块。要导入该模块,请打开 \\\"Project Settings\\\" (项目设置)【打开General Setti

    2024年02月11日
    浏览(43)
  • unity的AI自动寻路navigation基本用法

     1.场景中的地面和障碍物都设置成静态的,  2.给需要寻路的AI物体添加Nav Mesh Agent 组件, 3在window下面找到navigation,打开选all,调好参数后点击bake 4.运行时用代码实现鼠标点击屏幕一点,AI就自动避让障碍物到达(代码在下面)      

    2024年02月11日
    浏览(48)
  • 【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

    Android 开发中 , 最常用的 UI 架构 就是 使用一个 Activity 嵌套多个 Fragment , 这就需要 对 Fragment 进行管理 ; 在传统的 Android 开发中 , 使用 FragmentManager 和 FragmentTransaction 管理 Fragment 的生命周期 , Fragment 页面切换 , Fragment 切换动画设置运行 , Fragment 与 Fragment / Activity 之间的数据传

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包