【Unity自动寻路】使用Navigation系统实现物体自动寻路绕开障碍物

这篇具有很好参考价值的文章主要介绍了【Unity自动寻路】使用Navigation系统实现物体自动寻路绕开障碍物。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

知识点流程图

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

自动导航Navigation系统

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

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

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

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

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

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

1.首先搭建场景(道路和障碍物)

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

1.1静态障碍物
  1. 选中你想要设置为静态障碍物的游戏物体。
  2. 打开Navigation窗口。

    ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

  3. 在Object选项卡中,勾选Navigation static。

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

4.然后点击Bake 烘焙

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

这样,你就成功地设置了一个静态障碍物,除去障碍物的地方都是可以行走的道路!

1.2 动态障碍物

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

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

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

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

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

1.3 如果没有链接的路,可以搭建一个桥

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

  1. 创建两个物体作为“桥墩”。
  2. 给任意一个物体添加组件Off Mesh Link(网格外链接)。

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

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

把另一个桥墩B拖到A的组件中,B不需要添加任何组件!

这样,你就成功地搭建了一个桥,让角色可以跨越。

当然,我们也可让两个分开的区域地图自动创建链接,不需要手动搭桥

首先选中第一块区域,在Object中勾选Generate OffMeshLinks

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

然后选中第二个区域设置这个按钮,也可以两个同时选中一起勾选!

完毕后点击Bake,就会自动生成桥梁:

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

但是两个区域的间距和Jump Distance是关联的!如果跳跃距离比较小,小于两个板块的距离,就不会生成链接路线!所以跳跃参数必须大于两个板块的间距!

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

2. 设置自动寻路的物体

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

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

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);//

                }
            }
        }
    }
}

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

4. Unity Navigation 面板的BAKE参数

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

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

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

1.Agent Radius

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

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

2.Agent Height

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

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

3.Max Slope

你设置Max Slope为45度。这意味着如果你的游戏环境中有一个坡度超过45度的山坡,士兵将无法爬上去,因为这个坡度超过了他能处理的最大坡度。在烘焙之前如果模型与地面构成的夹角大于设置的最大角度,那么这个斜坡不能被烘焙为可行走的通路!角度低于设置的角度,就会被烘焙为通路,AI角色如果收到斜坡上的目的地坐标,则会沿着斜坡走!

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

4.Step Height

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

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

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎 5.Drop Height

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

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

6.Jump Distance

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

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

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

  1. 分配区域和设置成本(cost)

在Navigation窗口的"Area"部分,你可以看到预定义的区域和自定义区域。

首先自己定义一些分配区域:例如创建草地、沙漠、森林和沼泽分别分配给_walkable区域(例如,区域0);可以将火山区分配给_notWalkable区域(例如,区域4);创建一个自定义区域,例如"Bridge",并分配一个唯一的区域编号,比如20。

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

然后设置成本:在Navigation窗口的"Agent Parameters"部分,找到"Area Costs"设置。将_walkable区域的成本设为1(默认值),然后分别设置沙漠、森林、沼泽和桥梁的成本。例如,沙漠的成本设为2,森林的成本设为1.5,沼泽的成本设为3,桥梁的成本设为10。

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

这些成本可以让AI角色自动选择成本最低的路线区域!

第三步,对场景的模型分配这些区域

选中模型,比如是丛林区域

ainavigation判断有没有通路,Unity零基础课程,unity,游戏引擎

然后点击Bake进行烘焙!

这个一块模型就变成了丛林区域 

以此类推,把其他模块都设置完毕!

最后一起点击烘焙即可!

这样AI角色(Agent)就会按照数值Cost的大小进行自动选择数值最小的路线!文章来源地址https://www.toymoban.com/news/detail-771501.html

到了这里,关于【Unity自动寻路】使用Navigation系统实现物体自动寻路绕开障碍物的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 比较以下Unity AStar Pathfinding, NavMesh, Recast Navigation 寻路算法的优点与缺点

    一、AStar Pathfinding AStar Pathfinding是一种基于图搜索的寻路算法,它使用启发式搜索来找到最短路径。AStar Pathfinding的优点包括: 高效性:AStar Pathfinding是一种高效的寻路算法,因为它使用启发式搜索来找到最短路径,可以大大减少搜索空间,从而提高寻路速度。 灵活性:ASta

    2024年02月19日
    浏览(47)
  • Unity(四十七):寻路网格-内置组件实现自动寻路避障

    配置寻路区域 Navigation Static 配置静态游戏对象 Navigation Static 导航网格生成 Navigation 在 Navigation 窗口进行烘焙(菜单: Window AI Navigation )中进行处理的 自动寻路并绘制路线 Nav Mesh Agent 、 NavMeshPath 属性 功能 Agent Size Radius 代理的半径,用于计算障碍物与其他代理之间的碰撞

    2024年01月15日
    浏览(52)
  • 【Unity】NavMesh Agent实现自动寻路

    在Unity中,可以使用自带导航系统(Navigation System)实现自动寻路。 首先在Unity场景中创建一个NavMesh表面,用于描述场景中可行走的区域。 在Unity 5.6或更高版本中,可以通过以下步骤创建NavMesh表面: 选择场景中的地形或物体,

    2024年02月08日
    浏览(52)
  • 【Unity2d】2DNavMesh自动寻路实现

            在u3d中,系统自带了NavMesh组件,能够极其方便的实现自动寻路,新版的NavMesh并没有随着Unity的更新添加进引擎功能中,在2d项目中,我们想要实现NavMesh自动寻路还需要下载新的组件。这里提供网址:GitHub - h8man/NavMeshPlus: Unity NavMesh 2D Pathfinding         要在小伙

    2024年02月14日
    浏览(44)
  • Unity丨自动巡航丨自动寻路丨NPC丨

    提示:这里可以添加技术概要 本文功能是制作一个简单的自动巡逻的NPC,随机自动寻路。 注意代码要挂载在NPC身上,并且确定要挂载Rigidbody 组件 可以把组件的旋转X和z关掉就只有前后和左右旋转了。 后期功能可以自己扩展,功能简单但是实用。

    2024年01月16日
    浏览(50)
  • unity有限状态机和模糊状态机(怪物AI、自动寻路)

    自动寻路步骤: 1、把场景中不同的物体勾选static 2、烘培寻路网格 3、添加NavMeshAgent组件 4、给需要寻路的物体添加脚本 游戏中有限状态机的体现:小怪的巡逻和追逐功能 模糊状态机的体现:当玩家离小怪比较近时,小怪会追逐玩家,当玩家离小怪比较远时小怪会停止追逐玩

    2024年02月04日
    浏览(54)
  • Unity 中的简单A*寻路 (AStar寻路)实现

    本文实现的A*算法,未经过大量的优化,后续文章会进一步实现优化 后篇:A*优化讨论 结点类: 结点管理类: 单例模板: 测试脚本: 新建一个场景,将测试脚本挂载在任意物体上 新建一个画布,并添加一个按钮。其它ui元素可随意设定 将按钮关联Init方法 后续优化文章:

    2024年02月03日
    浏览(56)
  • Unity核心10——导航寻路系统

    Unity 中的导航寻路系统是能够让我们在游戏世界当中,让角色能够从一个起点准确的到达另一个终点,并且能够自动避开两个点之间的障碍物选择最近最合理的路径进行前往 ​ Unity 中的导航寻路系统的本质,就是在 A 星寻路算法的基础上进行了拓展和优化 导航网格(NavMes

    2024年02月10日
    浏览(47)
  • Unity使用ConfigurableJoint实现物理拖拽物体

    我们如何在游戏中实现拖拽物体呢,如果仅仅是让拖拽坐标,可能没有物理效果,这里可以使用Joint来实现。 首先我们在场景中放置道具。 如图,我们放置一个圆柱体Cylinder,一个Sphere球体,和地面。 圆柱体就是我们要拖动的物体,红色球体是我们点击的位置,白色的地面放

    2023年04月08日
    浏览(37)
  • 使用Unity里的ShaderGraph实现物体边框呼吸灯效果

    提前声明一下,以下效果需要在hdrp项目中进行。 首先创建好我们的正方体: 用来接下来的边框显示。 这里需要创建两个材质球,一个用于显示方块的材质,另一个用于边框的显示。 (Material用于方块材质,OutlineMat用于边框线) 为了更好地突出边框的视觉效果我这里给它加

    2024年04月22日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包