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

news2024/11/27 4:23:46

知识点流程图

自动导航Navigation系统

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

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

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

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

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

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

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

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

4.然后点击Bake 烘焙

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

1.2 动态障碍物

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

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

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

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

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

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

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

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

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

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

2. 设置自动寻路的物体

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

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class Controll : MonoBehaviour
{
    // 朝向目标点移动
    public GameObject MoveTarget;
    public GameObject Player;
    Vector3 Movedir;
    public float speed;

    NavMeshAgent navMeshAgent;
    void Start()
    {
        navMeshAgent = Player.GetComponent<NavMeshAgent>();
    }
    void Update()
    {
     

        if (Input.GetMouseButtonDown(0))
        {
            Ray OneClickPointRay = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机出发向鼠标点击的位置
            RaycastHit OutPoint;
            if (Physics.Raycast(OneClickPointRay, out OutPoint))//如果投射射线撞击到一个物体成功
            {
                navMeshAgent.SetDestination(OutPoint.transform.position);
            }
        }
    }
}

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

PS:Unity Navigation 面板的BAKE参数

  1. Agent Radius:定义网格和地形边缘的距离,也就是代理中心与墙壁或窗台的接近程度1。
  2. Agent Height:定义可以通行的最高度,也就是代理可以达到的空间有多低1。
  3. Max Slope:定义可以爬上楼梯的最大坡度,也就是代理走上坡道的陡峭程度1。
  4. Step Height:定义可以登上台阶的最大高度,也就是代理可以踏上的障碍物的高度1。
  5. Drop Height:允许最大下落距离1。
  6. Jump Distance:允许最大的跳跃距离1。

下面是Unity Navigation面板中BAKE参数的详细解释和例子:

  1. Agent Radius:这个参数定义了代理(也就是游戏中的角色)与障碍物之间的最小距离。例如,如果你设置Agent Radius为0.5,那么代理在移动时会保持至少0.5的距离远离墙壁或其他障碍物。

  2. Agent Height:这个参数定义了代理可以通过的最低高度。例如,如果你设置Agent Height为2,那么任何低于2的空间都会被视为障碍物,代理不能通过。

  3. Max Slope:这个参数定义了代理可以爬上的最大坡度。例如,如果你设置Max Slope为45度,那么任何坡度超过45度的斜坡都会被视为障碍物,代理不能爬上去。

  4. Step Height:这个参数定义了代理可以步入或跨过的最大高度。例如,如果你设置Step Height为0.4,那么任何高度超过0.4的台阶都会被视为障碍物,代理不能跨过。

  5. Drop Height:这个参数定义了代理可以从多高的地方跳下。例如,如果你设置Drop Height为2,那么代理可以从高度为2的地方跳下,但不能从更高的地方跳下。

  6. Jump Distance:这个参数定义了代理可以跳过的最大距离。例如,如果你设置Jump Distance为3,那么代理可以跳过宽度为3的沟壑,但不能跳过更宽的沟壑。

希望这些例子能帮助你更好地理解Unity Navigation面板中的BAKE参数。如果你还有其他问题,欢迎随时向我提问。祝你学习愉快!

当你设置好这些参数后,点击"Bake"按钮,Unity就会根据这些参数生成导航网格。这个过程被称为导航网格烘焙(NavMesh Baking)。生成的导航网格会在场景中显示为底层关卡几何体上的蓝色覆盖层

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【具身智能评估3】具身视觉语言规划(EVLP)度量标准汇总

参考论文&#xff1a;Core Challenges in Embodied Vision-Language Planning 论文作者&#xff1a;Jonathan Francis, Nariaki Kitamura, Felix Labelle, Xiaopeng Lu, Ingrid Navarro, Jean Oh 论文原文&#xff1a;https://arxiv.org/abs/2106.13948 论文出处&#xff1a;Jo…

华媒舍:怎样利用旅游业发展媒体套餐宣传推广分析7个经典案例

1.分析经典案例在旅游业发展中&#xff0c;依靠媒体套餐开展宣传推广成为了一种常见的方法。下面将详细介绍7个经典案例&#xff0c;从这当中我们可以得出一些宝贵经验。 案例一&#xff1a;目标市场定位成功宣传推广一定要明确市场定位&#xff0c;针对不同的受众群体制定合理…

力扣刷题-二叉树-找树左下角的值

513 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1&#xff1a; 示例 2&#xff1a; 思路 层序遍历 直接层序遍历&#xff0c;因为题目说了是最底层&#xff0c;最左边的值&a…

MATLAB图像处理技巧

MATLAB图片处理------动态绘图 1. 动态绘图2. XXXXX 1. 动态绘图 主要用到四个函数&#xff0c;分别为getframe、frame2im、rgb2ind以及imwrite&#xff1a; 1.getframe&#xff1a;获取当前绘图窗口的图片作为影片帧&#xff1b; 2.frame2im&#xff1a;从单个影片帧 F 返回索…

【JavaEE】多线程(5) -- 阻塞队列

目录 1.阻塞队列是什么? 2.生产者消费者模型 3.标准库中的阻塞队列 4.阻塞队列的实现 1.阻塞队列是什么? 阻塞队列是⼀种特殊的队列. 也遵守 "先进先出" 的原则 阻塞队列能是⼀种线程安全的数据结构, 并且具有以下特性: 当队列满的时候, 继续⼊队列就会阻塞, …

MATLAB break语句||MATLAB continue语句

MATLAB break语句 MATLAB中 break 语句用于终止 for 或 while 循环的执行&#xff0c;当在循环体内执行到该语句的时候&#xff0c;程序将会跳出循环&#xff0c;继续执行循环语句的下一语句。 注意&#xff1a;在嵌套循环中&#xff0c;break 退出只能在循环发生&#xff0c;后…

Mybatis 动态SQL插入操作②

结合上个博客一起看哦 上篇博客我们说.用户在表中插入数据的时候,有的数据可能不想插入,我们就需要设置,当用户插入这个字段的数据的时候就显示,不插入的话就为null,比如性别不想插入,那么 XML 代码如下 <?xml version"1.0" encoding"UTF-8"?> &…

mysql复习笔记04(小滴课堂)

mysql的存储引擎介绍 基于表的。 查看数据库支持的引擎&#xff1a; 查看支持的版本&#xff1a; 查看表的引擎&#xff1a; 查看所有表的存储引擎&#xff1a; 也可以修改默认引擎。 这有一张数据量庞大的表。 表是通过执行shell脚本快速创建的. 创建的表. 执行成功后会有个s…

Redis设计与实现之事务

一、事务 Redis 通过 MULTI 、DISCARD 、EXEC 和 WATCH 四个命令来实现事务功能&#xff0c;本章首先讨 论使用 MULTI 、DISCARD 和 EXEC 三个命令实现的一般事务&#xff0c;然后再来讨论带有 WATCH 的事务的实现。 因为事务的安全性也非常重要&#xff0c;所以本章最后通过…

华为组播配置案例

igmp-snooping主要用于生成二层组播表项&#xff0c;防止交换机全部接口都发组播报文 PC端配置&#xff1a; 组播源配置&#xff1a; R1 interface GigabitEthernet0/0/0 ip address 10.0.0.1 255.255.255.0 pim dm interface GigabitEthernet0/0/1 ip address 192.168.0…

面向未来的数据安全策略

人工智能&#xff08;AI&#xff09;已经成为一项突破性技术&#xff0c;可以彻底改变各个领域&#xff0c;并引发就业市场的强烈焦虑。毫不奇怪&#xff0c;它对技术和运营的变革性影响为提高效率、准确性和决策提供了巨大的可能性。 它还为黑客提供了巨大的机会。网络犯罪分…

C++学习笔记(十二)------is_a关系(继承关系)

你好&#xff0c;这里是争做图书馆扫地僧的小白。 个人主页&#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标&#xff1a;希望通过学习技术&#xff0c;期待着改变世界。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 文章目录 前言 一、继承关系…

带PWM 调光的线性降压 LED 恒流驱动器

一、基本概述 TX6410B是一种带 PWM 调光功能的线性降压 LED 恒流驱动器&#xff0c;仅需外接一个电阻就可以构成一个完整的 LED 恒流驱动电路&#xff0c;调节该外接电阻可调节输出电流&#xff0c;输出电流范围为 10~2000mA。TX6410B内置 30V 50 毫欧 MOS。TX6410B内置过热保…

【微服务】Spring Aop原理深入解析

目录 一、前言 二、aop概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk代理示例 3.1.2 jdk动态代理模拟实现…

医疗智能化革命:AI技术引领医疗领域的创新进程

一、“AI”医疗的崛起 随着人工智能&#xff08;AI&#xff09;技术的崛起&#xff0c;"AI"医疗正在以惊人的速度改变着医疗行业的面貌。AI作为一种强大的工具&#xff0c;正在为医疗领域带来前所未有的创新和突破。它不仅在医学影像诊断、病理学分析和基因组学研究等…

Ps:动作 - 基础篇

Ps 中的动作 Action可以让你自动、连续地完成多个操作&#xff0c;包括基础的调色、复杂的合成等。对于经常要执行的任务&#xff0c;使用动作&#xff0c;可大大提高工作效率。 Ps菜单&#xff1a;窗口/动作 Window/Action 快捷键&#xff1a;Alt F9 ◆ ◆ ◆ 认识动作面板…

字节开源的netPoll多路复用器源码解析

字节开源的netPoll多路复用器源码解析 引言NetPollepoll API原生网络库实现netpoll 设计思路netpoll 对比 go net数据结构 源码解析多路复用池初始化Epoll相关API可读事件处理server启动accept 事件客户端连接初始化客户端连接建立 可读事件等待读取数据 可写事件处理客户端启动…

活动 | Mint Blockchain 将于 2024 年 1 月 10 号启动 MintPass 限时铸造活动

MintPass 是由 Mint Blockchain 官方发行的 Mint 网络和社区的 NFT 通行证&#xff0c;将在 2024 年 1 月份启动限时铸造活动。今天这篇文章会着重向大家介绍即将举办的 MintPass 活动的基础信息。 MintPass 有 2 种类型&#xff1a; 类型 1&#xff1a;Mint Genesis NFT Mint…

游戏运行中突然掉线是什么原因导致的

游戏平稳运行的原因只有一个&#xff0c;掉线的原因各有个的不同。这些不同的原因有常见&#xff0c;也有不常见的。但不管出于什么原因的掉线&#xff0c;带来的损失又是相同的。 首先最常见的原因就是攻击造成的 像CC&#xff0c;DDOS。CC会造成服务器资源的浪费&…

MDK编译过程和文件类型

MDK是一款IDE软件&#xff0c;具有&#xff0c;编辑&#xff0c;编译&#xff0c;链接&#xff0c;下载&#xff0c;调试等等的功能。 1.编译器介绍&#xff1a; MDK可以编译C/C文件和汇编文件&#xff0c;MDK只是一款IDE软件&#xff0c;那他内部使用的是什么编译器呢&#x…