Unity3D学习FPS游戏(11)敌人AI巡逻(NavMesh)

前言:前面两篇博客已经实现了简单的敌人,但是呢,这样很无趣。因为敌人只会站在原地被攻击,所以本篇我们将实现敌人AI巡逻,让敌人动起来。

敌人AI巡逻

  • 场景丰富一下
  • 导航网格NavMesh
    • 构建导航网格
    • 导航网格优化
      • 玩家被当作障碍物
      • 不允许爬窗
    • 敌人添加Nav Mesh Agent
  • 巡逻功能
    • 目标
    • 设置巡逻点
    • 代码控制敌人巡逻
  • 效果

场景丰富一下

之前的场景只有一个地面,因为要让敌人巡逻,而敌人巡逻位置通常一个小范围的地方。
所以我从素材里面拖出了一个房子,打算让AI只在房子里面巡逻。
把房子的屋顶删掉了,方便观察AI移动情况。
大家可以根据自己需求去构建场景。
在这里插入图片描述

导航网格NavMesh

这是Unity自带的一个可以实现自动寻路的AI功能,我们将用它实现敌人AI巡逻,以及后续的追击玩家等寻路功能。

构建导航网格

创建NavMesh Surface组件,菜单-GameObject-AI-NavMesh Surface,然后直接烘焙Bake就好了。
在这里插入图片描述
NavMesh Surface是一个导航网格,能够让我们为敌人AI定义可以行走的表面。

导航网格优化

玩家被当作障碍物

构建网格时候,会发现,玩家也会被当成障碍物。
在这里插入图片描述
可以通过图层来进行烘培时忽略玩家。
点击Player的属性,找到图层Layer,添加新的Layer。
在这里插入图片描述
在这里插入图片描述
然后把新建的Layer,给Player属性中换上。

这时候再回到我们的NavMesh中,把Include Layers中的Player给勾选掉重新烘培,就不会把玩家视作为障碍物了。
在这里插入图片描述

不允许爬窗

会发现自动创建的导航网格,爬窗也有路径。
在这里插入图片描述
可以在Agent Type进行修改。
在这里插入图片描述
可以设置Agent代理的一些属性,会决定导航网格的构建。目前默认的是普通人类的角色设置,我们可以加号新建一个设置为HoverBot。
Radius表示能通过的最小宽度;Height表示能通过的最小高度;Step Height设置物体向上能到达的路径的高度(类似人一步能迈多高),例如上楼和上坡等带有向上走的行为;Max Slope设置场景的斜坡的最大角度;
然后因为不想让它能翻窗所以,Step Height要非常低,还有Max Slope也要低些。
在这里插入图片描述
修改NavMeshSurface的Agent Type为HoverBot,重新烘培。
在这里插入图片描述
这时候烘焙出来就不会有翻窗和把玩家当作障碍物的问题了。

敌人添加Nav Mesh Agent

导航网格构建好了,还需要让敌人挂载Nav Mesh Agent组件,才能控制敌人在NavMesh上移动。
记得设置Agent Type切换为HoverBot。
在这里插入图片描述
通过代码控制敌人的NavMeshAgent能够自动找到去目标地点的最短路,并移动过去。

巡逻功能

目标

希望敌人在小屋子范围里面巡逻走动。

设置巡逻点

创建WayPoints空的GameObject,房间内巡逻就是在四个点之间循环移动,所以在WayPoints下面创建四个GameObject调整Transform,这四个位置点就作为巡逻点。
在这里插入图片描述

代码控制敌人巡逻

主要是操作NavMeshAgent来控制,常用的几个属性有:

  • destination是NavMeshAgent组件的目的地
  • nextPosition是NavMeshAgent组件的当前的位置信息
  • pathPending判断路径是否在计算路径
  • remainingDistance和目标距离的剩余位置

思路主要是,获取前面设置的四个位置,以此按照顺序到达不同巡逻点。每次到达一个巡逻点后,就前往下一个巡逻点。

代码思路,可以看具体的代码和注释会理解的清楚。主要就是Update的时候判断是否抵达当前巡逻点,抵达了就去下一个巡逻点。

[Header("AI")]
public NavMeshAgent enemyAgent;// 路径导航代理
public GameObject wayPointParent;// 存放巡逻点
public Transform[] wayPoints;// 存放巡逻点数组
public int wayPointIndex = 1;// 当前巡逻点数组下标
void Start()
{enemyAgent = this.GetComponent<NavMeshAgent>();// 获取NavMeshAgent组件if (wayPointParent)// 获取四个巡逻点存放在数组中{wayPoints = wayPointParent.GetComponentsInChildren<Transform>();SetNextDestination();// 设置下一个目标位置}
}
void Update()
{// 没有在计算路径,而且到达目标位置很近(距离小于0.1f)if (!enemyAgent.pathPending&&enemyAgent.remainingDistance<0.1f){SetNextDestination();// 设置下一个目标位置}
}
// 设置下一个目标位置
private void SetNextDestination()
{if (wayPoints.Length <= 0) // 不存在巡逻点,就不用设置了return;enemyAgent.destination = wayPoints[wayPointIndex].position;// 设置下一个目标位置wayPointIndex++;// 下标加加if (wayPointIndex == wayPoints.Length)// 巡逻点下表循环wayPointIndex = 1;// 跳过第0个巡逻点,因为获取的第0个巡逻点是Parent,用不上
}

效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

去地面算法——depth_clustering算法调试(1)

1 源码下载 论文&#xff1a; 《2016-Fast Range Image-Based Segmentation of Sparse 3D Laser Scans for Online Operation》 《2017-Efficient Online Segmentation for Sparse 3D Laser Scans》 代码&#xff1a;git链接 2 问题记录 2.1 无法找到qt问题 问题截图&…

NUXT3学习日记一(在我git中拉取代码、文件讲解)

Nuxt 3 是一个基于 Vue 3 的现代框架&#xff0c;用于构建服务器端渲染&#xff08;SSR&#xff09;和静态生成的应用程序。它提供了一种简化的方式来创建高性能的 Vue 应用&#xff0c;具有许多强大的功能和优点。以下是 Nuxt 3 的一些主要应用和优点&#xff1a; 一、应用场…

vue3项目中内嵌vuepress工程两种实现方式

目录 一、示例二、创建vuepress工程三、配置vue项目的打包命令四、 通过iframe嵌套实现过程五、 将vue项目打包&#xff0c;启本地服务运行index.html 一、示例 vue项目&#xff0c;点击用户手册按钮&#xff0c;通过a标签跳转到vuepress框架搭建的页面。点击后者通过路由跳转…

简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?

大家好&#xff0c;我是锋哥。今天分享关于【简述 synchronized 和 java.util.concurrent.locks.Lock 的异同&#xff1f;】面试题。希望对大家有帮助&#xff1b; 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同&#xff1f; 在Java编程中&#xff0c;synchro…

centos7上安装mysql

1.现查看虚拟机上有没有wget包&#xff0c;如果没有的话进行安装 yum install -y wget 2.进入MySQL :: Download MySQL Yum Repository下载mysql安装源 找到与linux相应的版本&#xff0c;复制地址&#xff0c;如果找不到地址&#xff0c;可以复制如下 3.下载mysql官方yum源 …

操作系统离散存储练习题

1. (简答题)分页存储管理系统具有快表&#xff0c;内存访问时间为2ns&#xff0c;检索快表时间为0.5ns&#xff0c;快表命中率为80%&#xff0c;求有效访问时间 -分析&#xff1a;首先访问缓存&#xff08;快表&#xff09;&#xff0c;如果没有找到访问内存&#xff08;页表&…

PHP搭建开发环境(Windows系统)

要搭建一个完整的PHP动态网站&#xff0c;离不开操作系统、Web服务器、数据库、和PHP软件。 虽然有不错方便的方式&#xff0c;比如使用phpstudio等等等等许多面板都是非常快速不错的方式&#xff0c;但是这里是教会大家如何配置而不只是依赖别人整合好的面板软件&#xff0c;…

开源 2 + 1 链动模式、AI 智能名片、S2B2C 商城小程序在用户留存与品牌发展中的应用研究

摘要&#xff1a;本文以企业和个人品牌发展中至关重要的用户留存问题为切入点&#xff0c;结合管理大师彼得德鲁克对于企业兴旺发达的观点&#xff0c;阐述了用户留存对品牌营收的关键意义。在此基础上&#xff0c;深入分析开源 2 1 链动模式、AI 智能名片、S2B2C 商城小程序在…

SpringBoot后端解决跨域问题

1.全局方式 新建一个conifg配置类&#xff0c;内容如下&#xff1a; Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")//是否发送Cookie.allowCrede…

「数据要素」行业简报|2024.11.上刊

纵观数据要素行业动态&#xff0c;洞察行业风向&#xff0c;把握行业脉搏&#xff01; 一、政策发布 1、《山东省公共数据资源登记管理工作规范(试行)》公开征求意见 11月7日&#xff0c;为认真贯彻落实《中共中央办公厅 国务院办公厅关于加快公共数据资源开发利用的意见》《…

什么是RAG? LangChain的RAG实践!

1. 什么是RAG RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型&#xff1a; 基于预训练模型&#xff08;当时LLM的概念不像现在这么如日中天&#xff0…

Vite初始化Vue3+Typescrpt项目

初始化项目 安装 Vite 首先&#xff0c;确保你的 Node.js 版本 > 12.0.0。然后在命令行中运行以下命令来创建一个 Vite Vue 3 TypeScript 的项目模板&#xff1a; npm init vitelatest进入项目目录 创建完成后&#xff0c;进入项目目录&#xff1a; cd vue3-demo启动…

nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。

在项目中会碰见需要在nginx代理多个项目&#xff0c;如果在加上uniapp开发的H5端的项目&#xff0c;你还要在nginx中区分PC端和手机H5端&#xff0c;这就会让人很头大&#xff01;网上大部分的资料都是采用在nginx的conf配置文件中添加区分pc和手机端的变量例如&#xff1a;set…

软件测试项目实战

软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前&#xff0c;要经过一系列的严格测试&#xff0c;才能保证交付质量。 一、引言 1.编写目的 本文档…

2024开发者浏览器必备扩展,不允许还有人不知道~

在开发过程中&#xff0c;优秀的扩展工具能够极大提升我们的工作效率&#xff0c;简化工作流程&#xff0c;并使得在浏览器中的开发和调试变得更加便捷。 根据市场占比&#xff0c;Chrome、Safari、Edge、Firefox、Opera 是前五大浏览器&#xff0c;其中Chrome浏览器占据了领先…

分享一个傻瓜式一键启动的加速器

主要发现开通一个号能电脑手机互通&#xff0c;原来电脑手机各一个加速器钱包在滴血。。。一个月也很便宜差不多二十多 链接放这了&#xff0c;有需要自提&#xff1a;首页-小熊加速器http://xxjsq.co/ytfa

TDesign了解及使用

文章目录 1、概述2、快速开始2.1使用 npm 安装2.2通过 浏览器引入 安装2.3、使用 3、简单案例3.1 路由创建3.2、 页面创建3.3、 Table组件3.4、序号展示3.5、 图片展示及预览3.6、 性别字段处理 1、概述 TDesign 是腾讯推出的设计系统&#xff0c;旨在提供一致的设计语言和视觉…

11Java面向对象高级(篇2,Java程序的核心套路!!!!)

更多java知识请点击上面专栏&#xff01;&#xff01;&#xff01; 修道之始&#xff1a; 01Java基础入门(纯小白也能入门&#xff0c;速通Java&#xff0c;知识点归纳超级全面&#xff01;&#xff01;&#xff01;2024版后端成仙起始篇&#xff01;&#xff01;&#xff01;…

定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)

一、QTimer与QRandomGenerator &#xff08;一&#xff09;QTimer&#xff08;定时器&#xff09;[2] QTimer类为定时功能提供了一个高级编程接口。在使用QTimer时&#xff0c;实例化一个QTimer对象并将其timeout()发射信号与合适的信号槽相连接。通过调用QTimer的start()函数…

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言&#xff1a;自2021年起&#xff0c;翼鸥教育便开始应用OceanBase社区版&#xff0c;两年间&#xff0c;先后部署了总计12套生产集群&#xff0c;其中核心集群占比超过四分之三&#xff0c;所承载的数据量已突破30TB。自2022年10月&#xff0c;OceanBase 社区发布了4.2.x 版…