Unity3D 基于ECS的AI思考与怪物同步详解

前言

ECS(Entity-Component-System)是一种设计模式,它将游戏对象分为实体(Entity)、组件(Component)和系统(System),使游戏开发更加灵活和高效。

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

在游戏开发中,AI是一个非常重要的部分,它决定了游戏中怪物、NPC等角色的行为和智能。本文将介绍如何在Unity3D中使用ECS设计模式来实现AI思考与怪物同步,并给出详细的技术解析和代码实现。

一、AI思考与怪物同步的基本原理

在游戏中,怪物的行为通常是由AI控制的。AI系统需要不断地对怪物进行思考,根据游戏规则和环境来决定怪物的下一步行动。同时,怪物的行为需要与游戏世界中的其他元素同步,例如玩家的动作、场景的变化等。

为了实现AI思考与怪物同步,我们可以使用ECS设计模式。在ECS中,怪物被视为一个实体(Entity),它包含了所有与怪物相关的数据和行为组件。AI系统则是一个系统(System),它负责更新怪物的状态和行为。系统通过访问实体的数据组件来获取怪物的信息,并根据游戏规则来更新怪物的行为。

二、ECS的实现方式

在Unity3D中,我们可以使用Unity.Entities和Unity.Transforms等包来实现ECS设计模式。Unity.Entities提供了实体、组件和系统的基本功能,而Unity.Transforms则提供了实体的位置、旋转和缩放等信息。

首先,我们需要定义怪物的数据组件。例如,我们可以创建一个MonsterComponent组件来保存怪物的生命值、攻击力等信息。然后,我们需要创建一个AI系统来更新怪物的状态和行为。在系统中,我们可以通过访问MonsterComponent组件来获取怪物的信息,并根据游戏规则来更新怪物的行为。

下面是一个简单的代码示例:

using Unity.Entities;
using Unity.Transforms;public class MonsterComponent : ComponentDataWrapper<MonsterData>
{
}public struct MonsterData : IComponentData
{public float health;public float attack;
}public class AISystem : ComponentSystem
{protected override void OnUpdate(){Entities.ForEach((ref MonsterComponent monster, ref Translation translation) =>{// AI思考逻辑// 更新怪物的状态和行为});}
}

在上面的代码中,MonsterComponent组件用来保存怪物的生命值和攻击力等信息,而AISystem系统则用来更新怪物的状态和行为。在系统的OnUpdate方法中,我们可以通过Entities.ForEach来遍历所有的怪物实体,并对它们进行AI思考和行为更新。

三、怪物同步的实现方式

在游戏中,怪物的行为需要与游戏世界中的其他元素同步,例如玩家的动作、场景的变化等。为了实现怪物同步,我们可以使用Unity.Physics和http://Unity.Jobs等包来实现并行计算和碰撞检测。

首先,我们需要将怪物的碰撞体和碰撞信息保存在一个PhysicsCollider组件中。然后,我们可以创建一个PhysicsSystem系统来更新怪物的位置和碰撞信息。在系统中,我们可以通过访问PhysicsCollider组件来获取怪物的碰撞信息,并根据游戏规则来更新怪物的位置和碰撞信息。

下面是一个简单的代码示例:

using Unity.Entities;
using Unity.Physics;
using Unity.Physics.Systems;public class PhysicsCollider : ComponentDataWrapper<Collider>
{
}public class PhysicsSystem : JobComponentSystem
{private BuildPhysicsWorld m_BuildPhysicsWorldSystem;private StepPhysicsWorld m_StepPhysicsWorldSystem;protected override void OnCreate(){m_BuildPhysicsWorldSystem = World.GetOrCreateSystem<BuildPhysicsWorld>();m_StepPhysicsWorldSystem = World.GetOrCreateSystem<StepPhysicsWorld>();}protected override JobHandle OnUpdate(JobHandle inputDeps){JobHandle jobHandle = new PhysicsJob{// 更新怪物的位置和碰撞信息}.Schedule(m_BuildPhysicsWorldSystem.PhysicsWorld, inputDeps);m_StepPhysicsWorldSystem.AddInputDependency(jobHandle);return jobHandle;}private struct PhysicsJob : IJob{public void Execute(){// 更新怪物的位置和碰撞信息}}
}

在上面的代码中,PhysicsCollider组件用来保存怪物的碰撞体和碰撞信息,而PhysicsSystem系统则用来更新怪物的位置和碰撞信息。在系统的OnUpdate方法中,我们可以通过执行PhysicsJob来并行计算怪物的位置和碰撞信息,并将计算结果传递给StepPhysicsWorld系统来实现怪物的同步。

四、总结

通过以上的介绍,我们可以看到使用ECS设计模式来实现AI思考与怪物同步是非常简单和高效的。通过将怪物视为实体、组件和系统的结合体,我们可以轻松地实现怪物的行为控制和同步。同时,通过并行计算和碰撞检测,我们可以实现怪物与游戏世界的实时同步,提高游戏的表现和体验。

希望本文对你有所帮助,如果你对Unity3D基于ECS的AI思考与怪物同步有更深入的了解和研究,可以继续深入学习和探索。祝你在游戏开发的道路上越走越远,创造出更加精彩和优秀的作品!

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

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

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

相关文章

SpringBoot 启动时自动执行指定方法

在Spring Boot应用程序中&#xff0c;要实现在应用启动时自动执行某些代码&#xff0c;可以采用以下几种方式&#xff1a; 1. 使用PostConstruct注解 PostConstruct注解用于标记一个方法&#xff0c;该方法将在依赖注入完成后、构造方法之后自动执行。这适用于需要在对象创建…

移动端研发技术的进化历程

移动端研发技术 移动端研发技术主要分为原生开发和跨平台开发。本章主要介绍一下移动开发技术的过去、当下和未来&#xff0c;一步一步介绍移动技术的进化历程。 原生开发 原生应用程序是指某一个移动平台&#xff08;比如iOS或Android&#xff09;所特有的应用&#xff0c;使…

Vue项目创建新文件后都会提示仅当 “module” 选项设置为 “es2022”、“esnext”、“system”、“node16” -警告提示

警告提示 vscode中vue项目创建新文件后都会提示仅当 “module” 选项设置为 “es2022”、“esnext”、“system”、“node16” 或 “nodenext”&#xff0c;且 “target” 选项设置为 “es2017” 或更高版本时&#xff0c;才允许使用顶级 “await” 表达式。 在 VS Code 中&am…

C语言自学笔记8----C语言Switch语句

C 语言 switch 语句 switch语句使我们可以执行许多代替方案中的一个代码块。 虽然您可以使用if…else…if阶梯执行相同的操作。但是&#xff0c;switch语句的语法更容易读写。 switch … case的语法 switch (expression) { case constant1: // 语句 break; case constant2: // …

安装docker compose

尝试了各种方法 最后按照以下命令进行尝试 成功安装 mkdir -p ~/.docker/cli-plugins && \ curl -fsSL "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSEV2_VERSION-v2.23.3-rc.3}/docker-compose-linux-${TARGET_ARCH} -o ~/.docker/cli…

自适应宽带波束形成:GSC(generalized sidelobe canceller)广义旁瓣消除器原理介绍和实现代码

GSC&#xff08;generalized sidelobe canceller, 广义旁瓣消除器&#xff09;可以将有约束的LCMV算法转换为无约束的实现结构。网上关于GSC的介绍对细节方面介绍得不详细&#xff0c;并且主要是应用在窄带。宽带的GSC应用范围也比较广泛&#xff0c;例如在智能音箱等产品的麦克…

EEPROM ADDRESS BYTE长度说明

1、24C16 ADDRESS BYTE 2、24C32 ADDRESS BYTE 3、ADDRESS BYTE 长度说明 容量小于16Kbits&#xff08;含&#xff09;的EEPROM 地址是8位的 容量大于16Kbits的EEPROM地址是16位的 4、操作说明 例如&#xff1a;STM的HAL库函数中 HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi…

Clickhouse MergeTree 原理(一)

作者&#xff1a;俊达 MergeTree是Clickhouse里最核心的存储引擎。Clickhouse里有一系列以MergeTree为基础的引擎&#xff08;见下图&#xff09;&#xff0c;理解了基础MergeTree&#xff0c;就能理解整个系列的MergeTree引擎的核心原理。 本文对MergeTree的基本原理进行介绍…

若依上传文件/common/upload踩坑

前言&#xff1a;作者用的mac系统&#xff08;这个是个坑&#xff09;&#xff0c;前端用的uniapp&#xff0c;调用若依通用上传方法报错NoSuchFileException: /home/ruoyi/uploadPath/upload... 前端上传代码示例如下: uni.chooseImage({count: 1,success(res){ uni.uploa…

金融级PaaS体系规划

近日&#xff0c;在美丽春城昆明举办了一场闭门的金融行业讨论会&#xff0c;会上灵雀云首席解决方案专家杜东明受邀进行了《金融级PaaS体系规划》的主题分享。他指出&#xff0c;PaaS体系的重要性日益凸显&#xff0c;已经成为金融行业发展的重要驱动力&#xff0c;它能够为金…

maven打包把所有依赖的jar copy到一个文件夹

在maven项目中,是使用依赖坐标来引入jar包,在引入jar包的时候,maven也会默默的帮助我们导入这个jar包所依赖的jar包。 但是当我们打包项目使用jar包运行的时候,往往会出现缺少jar的情况: 如果我们一个一个添加缺少的jar包到classpath下就会很麻烦,而且我们也不知到mave…

React进阶(Redux,RTK,dispatch,devtools)

1、初识Redux 是React最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia(Vuex)&#xff0c;可以独立于框架运行 作用&#xff1a;通过集中管理的方式管理应用的状态 案例-实现一个计数器 实现步骤&#xff1a; Redux管理数据的流程&#xff1a; state:一个对象&…

Vue中的知识点

1.vue中for的key有什么用&#xff1f; Key是给虚拟DOM加的一个标识&#xff0c;当数据发生变化时&#xff0c;vue会去根据【新数据】去生成【新的虚拟DOM】。随后会将【新的虚拟dom】与【旧的虚拟dom】进行对比。对比时的依据就是这个key. 不用key,获取用index当key都有可能出现…

MySQL基础-----多表查询之内外连接与自连接

目录 前言 一、内连接 1.隐式内连接 2.显式内连接 二、外连接 1.左外连接 2.右外连接 三、自连接 1.自连接查询 2.联合查询 前言 本期我们学习MySQL中多表查询的内连接、外连接和自连接。这里我会通过相关的案例去讲解多表查询中的内外连接与自连接的查询方式&#xff…

2024.3.9-408学习笔记-C-字符函数和字符串函数

1、strlen函数 用于计算字符串长度&#xff08;除了末尾的\0&#xff09;。 函数格式&#xff1a;size_t strlen ( const char * str )。 字符串以\0作为结束标志&#xff0c;strlen函数返回的是在字符串中\0前面出现的字符个数&#xff08;不包含\0&#xff09;。 注意&am…

ARM 汇编指令:(七) STM/LDM多寄存器加载/多存储指令

一.四种栈 考验大家理解能力的地方来了&#xff0c;专心点&#xff0c;嘿嘿&#xff01;&#xff01; 1.满增栈&#xff1a;进栈&#xff08;先移动指针再入栈&#xff0c;指针往地址增大的方向移动&#xff09;&#xff1b;出 栈&#xff08;先出栈&#xff0c;栈指针往地址…

Java中的IO流是什么?

Java中的IO流&#xff08;Input/Output Stream&#xff09;是Java编程语言中用于处理输入和输出操作的一种重要机制。在Java中&#xff0c;IO流被用来读取和写入数据&#xff0c;这些数据可以来自各种来源&#xff0c;如文件、网络连接、内存缓冲区等。Java的IO流提供了丰富的类…

分享通义ChatGPT实用技能123

前言 作为一名程序员&#xff0c;你一定有过这样的经历&#xff1a;排查某个 bug 花费了好几个小时&#xff0c;在各个搜索引擎尝试搜索&#xff0c;浏览了几十甚至上百个网站&#xff0c;结果搜到的答案千篇一律&#xff0c;没有一个说到点上。而自从有了 ChatGPT&#xff0c…

船舶AIS监控网络-船位信息查询:实时查询船舶动态,服务于船舶安全航行管理、港口调度计划、物流、船代、货代。【AIS动态信息编写船舶轨迹】

文章目录 引言I 预备知识1.1 相关术语1.2 主要功能1.3 MongoDB和Es各自优势II 系统架构2.1 电子海图开源JavaScript包2.2 地图渲染库2.3 地图服务调用(天地图)2.4 在Elasticsearch(ES)中存储船舶轨迹数据III 数据同步方案3.1 基于 Binlog 实时同步3.2 数据迁移工具:Canal3.3…

通过网口或串口走Modbus协议,读写数据库中的数据

智能网关IGT-DSER方便实现多台PLC与数据库之间的数据通讯&#xff0c;既可以读取PLC的数据上报到数据库&#xff0c;也可以从数据库查询数据后写入到PLC的寄存器&#xff0c;还可以将数据库的数据转为Modbus服务端/从站&#xff0c;实现数据库内的数据也可以走Modbus协议通过网…