添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

自动导航Navigation系统

我们在游戏场景中经常会有一些障碍物、墙壁、树木等等,如果我想要让角色或者怪物去墙的另一边,我直接在墙另一边点击左键,我希望角色自动跑过去,但是他不能直接穿透墙,他需要“智能”的绕开障碍物,自动找到可以走的路,自己过去!这就是Unity 的 Navigation导航系统帮助我们做的事情!请看大屏幕!

这里面有两个重要的对象:

1.场景需要烘焙成导航地图

2.设置受导航地图影响的代理物体!

如下图:player 在导航系统叫代理Agent 你只需要把作为代理的对象加一个组件Nav mesh agent! 就会受烘焙好的AI地图影响!否则不影响!

3.代理的运动不能用Translate()函数,只能用  MyNav.SetDestination(移动的目标点);设置运动的目标点!

Unity中的Navigation就像是一个智能的GPS系统,它可以告诉游戏角色如何最好地到达目的地。它会考虑所有的障碍物,并找出一条最佳路径。这就像你在现实生活中使用地图或导航应用从一个地方到另一个地方一样。

如果没有Navigation,游戏角色可能会直接走向障碍物,或者走出游戏的边界,这会让游戏看起来不真实,也会影响游戏的可玩性。而有了Navigation,游戏角色就可以像真实的人一样,知道如何避开障碍,如何选择最佳的路径。

所以,Navigation在Unity中的作用就是帮助游戏角色更真实、更自然地移动。它让游戏角色能够理解他们的环境,并做出合理的决策。这对于创建一个有趣、引人入胜的游戏至关重要!

在Unity中,我们可以使用AI和Navigation导航来实现自动寻路。下面是一份详细的框架和步骤,帮助你理解如何在Unity中设置场景和使用Navigation导航。

在Unity中,动态障碍物是一种特殊的障碍物,它可以在游戏运行时动态地改变位置或形状。这对于创建一个动态且富有挑战性的游戏环境非常有用。

要创建一个动态障碍物,你需要做的就是给游戏物体添加一个名为 Nav Mesh Obstacle 的组件。这个组件会让Navigation系统知道这个物体是一个障碍物,角色需要绕过它。

当你移动带有 Nav Mesh Obstacle 组件的游戏物体时,Navigation系统会自动更新导航网格,以反映障碍物的新位置。这意味着,你的游戏角色会自动知道如何绕过这个新的障碍物。

  1. 选中任意游戏物体。
  2. 添加组件 Nav Mesh Obstacle

这样,你就成功地设置了一个动态障碍物。NavMesh Obstacle是一个组件,可以附加到你想要阻挡角色移动的物体上,它会动态地更新NavMesh,让代理(就是我们要在这个导航地图中自动训练的对象)绕开它。

1.3 如果没有链接的路,可以搭建一个桥
  1. 创建两个物体作为“桥墩”。
  2. 给任意一个物体添加组件 Off Mesh Link(网格外链接)。

Off Mesh Link是一个组件,可以附加到你想要让角色进行特殊动作的物体上,例如跳跃,爬梯,开门等,它会在NavMesh之间创建一个链接,让代理可以跨越它。

  1. 创建游戏主角。
  2. 添加组件: Nav Mesh Agent(导航代理)。

NavMesh Agent是一个组件,可以附加到你想要移动的角色上,它会自动寻找最佳的路径,避开障碍物和其他代理,实现平滑的移动效果。

3.让角色按照导航跑向鼠标点击的位置

完整代码:

核心代码:  MyNav.SetDestination(oneOutHitObj.point);//意思是获取射线与射中的物体的交叉点世界坐标,返回三维向量

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class NavStudy : MonoBehaviour GameObject OneTARGET; GameObject AIPlayer; NavMeshAgent MyNav; // 实现一个物体自动寻路到达指定的坐标点 void Start() OneTARGET = GameObject.Find("Target"); AIPlayer = GameObject.Find("Player"); MyNav = AIPlayer.GetComponent<NavMeshAgent>(); // Update is called once per frame void Update() if (Input.GetMouseButtonDown(0)) Ray MousePos = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit oneOutHitObj; if (Physics.Raycast(MousePos,out oneOutHitObj)) if (oneOutHitObj.transform.tag=="Wall") Debug.Log("点击到地面了"+ MouseWorldPos); //为点击的位置克隆一个球 //oneOutHitObj.point 的意思是获取射线与射中的物体的交叉点坐标,返回三维向量 MyNav.SetDestination(oneOutHitObj.point);//

注意:   MyNav.SetDestination(oneOutHitObj.point);

以上就是在Unity中使用AI和Navigation导航实现自动寻路的详细步骤。希望这篇文章能帮助你理解和掌握这个技术。如果你有任何问题或者需要进一步的解释,欢迎随时向我提问。祝你学习愉快!

4. Unity Navigation 面板的BAKE参数

下文所说的代理,就是AI地图中寻路的那个主角!

下面是Unity Navigation面板中BAKE参数的详细解释和例子:注意:这些参数的数值,Unity是比较参考生活中人类的行为的!所以这些数值可以模拟人类生活中的参数作为参考!

1. Agent Radius

假设你在制作一个第一人称射击游戏,你的角色是一个士兵。你设置Agent Radius为0.5米,这意味着在导航过程中,士兵会自动保持至少0.5米的距离远离墙壁或其他障碍物,以避免过于接近或碰撞,AI主角与障碍物之间保持的距离!

2.Agent Height

直接翻译为AI主角(代理)的身高!在同样的射击游戏中,你设置Agent Height为2米。这意味着如果有一个高度低于2米的隧道或者洞口,士兵将无法通过,因为他的身高(代理高度)超过了这个限制。设置人物能够通过洞口、门口的最低高度!假如设置为0.8米,那就意味着场景中构成洞口的场景,上下间距最低不能低于0.8,大于0.8,才会被烘焙成通路!

4.Step Height

你设置Step Height为0.4米。这意味着在游戏中,如果有一个高度超过0.4米的台阶,士兵将无法直接走上或者跨过,因为他不能 跨越 这么高的台阶。这里面谈到的跨越很有意思,如果一个很高的障碍物挡住AI主角的去路,它可以依据自己的最大跳高能力跳过去!

简单说,就是角色能跳跃的最大高度!就跟体育调高比赛中能跳的最大高度!这个高度还要求小于Agent Height(代理身高),系统认为你不可能跳出比自己身高还高的高度!

5.Drop Height

这个就是你抗摔的高度!这个高度和前面的数值都没关系!毕竟一个人身高可能6m,跳高1m,但是能从3米的高度跳下来!也是合理的!你设置Drop Height为2米。这意味着士兵可以从最高2米的地方跳下而不会受到伤害,但如果他需要从一个高于2米的地方跳下,那么这可能会导致他受伤或者死亡。

6.Jump Distance

你设置Jump Distance为3米。这意味着在游戏中,士兵可以跳过宽度不超过3米的沟壑或者障碍物,但如果遇到更宽的沟壑,他将无法跳过去。

5.关于最佳区域的设置(Areas)

1.静态简单 导航 (1)不改变 导航 期间,路障的情况,并且不能进行跳跃类操作,即连续不跳跃类 <1>首先建立如下模型,其中四周墙壁和中间的黄色墙壁为 障碍物 ,胶囊和小球分别为起点和终点。要求:胶囊从起点位置出发,绕过四条黄色的柱子,到达小球位置。 选择地面和所有 障碍物 点开箭头。将这些调整为Naviagtion static类型 <3>选择capsule,添加脚本和Nav Mesh Agent组件 using S 2.添加角色 3.创建多个 障碍物 ,尽量摆的复杂一点,来检查Navmesh的可用性和效率。 4.选中地形,在 Navigation 窗口中,设置 Navigation Static 5.依次选中 障碍物 ,在avigat... 3.给主角添加Nav mesh Agent 组件 4.烘焙地图,简单来说就是烘焙 自动 行走的路径(要注意蓝色区域为烘焙的路径,其它区域是不识别的,可以通过调整参数来达到你想要 导航 的区域) 5.创建一个c#代码,名为navment,挂载到要进行 寻路 物体 上。代码如下 using System.Collections; using System.Collections.Gene 1. 在yolov5中训练一个特定 物体 的检测模型 首先需要在yolov5中训练一个特定 物体 的检测模型,以便能够在视频流中检测到该 物体 。可以 使用 已有的数据集进行训练,也可以自己收集数据集进行训练。 2. 使用 yolov5检测特定 物体 并提取特征向量 在视频流中 使用 训练好的yolov5模型检测到特定 物体 后,可以 使用 deepsort算法对该 物体 进行跟踪。在进行跟踪之前,需要从检测结果中提取特征向量,以便后续进行相似度计算。 3. 记录特定 物体 的跟踪信息 在进行跟踪时,需要记录特定 物体 的跟踪信息,包括其位置、速度、加速度等信息,以便后续进行标注。 4. 判断是否需要锁定标注 在跟踪过程中,可以通过设定一定的条件来判断是否需要对特定 物体 进行锁定标注。例如,可以判断特定 物体 是否满足一定的停留时间或者是否出现在特定区域内等条件。 5. 对特定 物体 进行锁定标注 如果特定 物体 满足锁定标注的条件,可以将其标注为锁定状态,并记录其标注信息。在后续的跟踪过程中,无论该 物体 是否离开了视野,都会将其标注为锁定状态。 6. 实现 锁定标注的显示和管理 最后需要 实现 锁定标注的显示和管理功能,以便用户可以方便地查看和管理已锁定的特定 物体 。可以 使用 图形界面显示锁定标注信息,并提供相应的管理功能,例如删除、编辑等。