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

知识点流程图

自动导航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)。生成的导航网格会在场景中显示为底层关卡几何体上的蓝色覆盖层

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java8新特性之-LocalDateTime

java8新特性之-LocalDateTime 首先&#xff0c;我们必须明确&#xff0c;JAVA为什么在有Date这个类的情况下&#xff0c;又引入了LocalDateTime 大体上来说。 java8引入为了解决旧的java.util.Date和java.util.Calendar等类在处理日期和时间时存在的一些问题&#xff0c;并提供…

[python]用python获取EXCEL文件内容并保存到DBC

目录 关键词平台说明背景所需库实现过程方法1.1.安装相关库2.代码实现 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 背景 在搭建自动化测试平台的时候经常会提取DBC文件中的信息并保存为excel或者其他文件格式&#xff0c;用于自动化测试。本文…

一篇文章了解Flutter Json系列化和反序列化

目录 一. 使用dart:convert实现JSON格式编解码1. 生成数据模型类2. 将JSON数据转化成数据模型类3. 数据模型类转化成JSON字符串 二、借助json_serializable实现Json编解码1.添加json_annotation、build_runner、json_serializable依赖2. 创建一个数据模型类3. 使用命令行生成JS…

http状态码(一)400报错

一 400报错汇总 ① 综述 一、4xx状态码报错说明&#xff1a; 客户端行为导致的报错二、通用的4xxHTTP报错1) 4002) 4013) 4034) 4045) 405 --> 不允许方法&#xff0c;可能跨域或者nginx限制请求方法6) 4087) 4138) 419三、ngin自身定义的4xx报错495、496、497、498、4…

centOS7 安装tailscale并启用子网路由

1、在centOS7上安装Tailscale客户端 #安装命令所在官网位置&#xff1a;https://tailscale.com/download/linux #具体命令为&#xff1a; curl -fsSL https://tailscale.com/install.sh | sh #命令执行后如下图所示2、设置允许IP转发和IP伪装。 安装后&#xff0c;您可以启动…

Python框架批量数据抓取的高级教程

一、背景介绍 批量数据抓取是一种常见的数据获取方式&#xff0c;能够帮助我们快速、高效地获取网络上的大量信息。本文将介绍如何使用Python框架进行大规模抽象数据&#xff0c;以及如何处理这个过程中可能遇到的问题。 二、项目需求 我们将爬取大量知乎文章&#xff0c;讨…

机器学习 | 机器学习基础知识

一、机器学习是什么 计算机从数据中学习规律并改善自身进行预测的过程。 二、数据集 1、最常用的公开数据集 2、结构化数据与非结构化数据 三、任务地图 1、分类任务 Classification 已知样本特征判断样本类别二分类、多分类、多标签分类 二分类&#xff1a;垃圾邮件分类、图像…

为什么选择计算机?大数据时代学习计算机的价值探讨

还记得当初自己为什么选择计算机? 计算机是在90年代兴起的专业,那时候的年轻人有驾照、懂外语、懂计算机是很时髦的事情! 当初你问我为什么选择计算机,我笑着回答:“因为我梦想成为神奇的码农!我想像编织魔法一样编写程序,创造出炫酷的虚拟世界!”谁知道,我刚入门的…

Leetcode刷题笔记题解(C++):224. 基本计算器

思路&#xff1a; step 1&#xff1a;使用栈辅助处理优先级&#xff0c;默认符号为加号。 step 2&#xff1a;遍历字符串&#xff0c;遇到数字&#xff0c;则将连续的数字字符部分转化为int型数字。 step 3&#xff1a;遇到左括号&#xff0c;则将括号后的部分送入递归&#x…

java --- 异常

目录 一、异常体系介绍 二、异常的作用 三、异常处理方式 3.1 捕获异常 2.1 灵魂一问&#xff1a; 如果try中没有遇到问题&#xff0c;如何执行&#xff1f; 2.2 灵魂二问&#xff1a;如果try中可能会遇到多个问题&#xff0c;怎么执行&#xff1f; 2.3 灵魂三问&#x…

动态规划优化技巧

一、斐波那契系列 1、滚动数组优化空间复杂度 2、dp数组初始化/处理边界优化 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台

NtripShare Mos监测平台边缘计算终端与自动优化平差算法

忙忙乎乎23年又要过去了&#xff0c;回头看今年做的事&#xff0c;只有两件事值得一提&#xff1a; 1、自动化监测边缘计算终端&#xff1b; 2、自动优化平差算法。 自动化监测边缘计算终端 终端采用全国产硬件方案终端支持全站仪供电控制终端支持远程控制终端支持数据缓存技…

WebLangChain_ChatGLM:结合 WebLangChain 和 ChatGLM3 的中文 RAG 系统

WebLangChain_ChatGLM 介绍 本文将详细介绍基于网络检索信息的检索增强生成系统&#xff0c;即 WebLangChain。通过整合 LangChain&#xff0c;成功将大型语言模型与最受欢迎的外部知识库之一——互联网紧密结合。鉴于中文社区中大型语言模型的蓬勃发展&#xff0c;有许多可供利…

arcgis更改服务注册数据库账号及密码

最近服务器数据库密码换了&#xff0c;gis服务也得换下数据库连接密码。传统官方的更改方式&#xff08;上传连接配置文件&#xff09;&#xff1a; ArcGIS Server数据库注册篇(I) — 更新数据库密码_arcgis server sde换密码-CSDN博客 方式太麻烦了&#xff0c;需要安装ArcG…

PyTorch自动梯度计算(注意点)

if params.grad is not None: params.grad.zero_() 我们实际的运算往往会涉及到若干个requires-grad为true的张量进行运算&#xff0c;在这种情况下&#xff0c;Pytorch会计算整个计算图上的损失的导数&#xff0c;并把这些结果累加到grad属性中。多次调用backward()会导致梯度…

数据结构与算法—哈希表

哈希表 文章目录 哈希表1. 问题引出2. 基本介绍3. 应用实例 1. 问题引出 看一个实际需求&#xff0c;google公司的一个上机题:有一个公司&#xff0c;当有新的员工来报道时&#xff0c;要求将该员工的信息加入(id,性别&#xff0c;年龄等)&#xff0c;当输入该员工的id时&#…

CodeBlocks定义异常:multiple definition of 和 first defined here

基于链表实现贪吃蛇案例时候&#xff0c;在CodeBlocks的CPP源文件定义函数和全局变量均报错 异常现象 在**自定义的cpp**文件定义全局变量、对象、函数等均出现重复定义和首次定义 multiple definition of Controller::showCopy() first defined here 异常解决方案 正确代码…

RabbitMQ手动应答与持久化

1.SleepUtil线程睡眠工具类 package com.hong.utils;/*** Description: 线程睡眠工具类* Author: hong* Date: 2023-12-16 23:10* Version: 1.0**/ public class SleepUtil {public static void sleep(int second) {try {Thread.sleep(1000*second);} catch (InterruptedExcep…

HashMap构造函数解析与应用场景

目录 1. HashMap简介 2. HashMap的构造函数 2.1 默认构造函数 2.2 指定初始容量和加载因子的构造函数 3. 构造函数参数的影响 3.1 初始容量的选择 3.2 加载因子的选择 4. 构造函数的应用场景 4.1 默认构造函数的应用场景 4.2 指定初始容量和加载因子的构造函数的应用…

海安行车记录仪avi杀病毒导致文件丢失的恢复案例

海安行车记录仪&#xff0c;听名字就知道是个小小小品牌&#xff0c;而且用的文件格式是比较古老的AVI&#xff0c;这种文件格式是微软设计的&#xff0c;后来并没有普及&#xff08;不支持4G以上大文件而且结构过于松散&#xff09;。这个恢复案例比较特殊的地方是不太清楚做过…