Unity Dots从入门到精通 Mono和Dots通讯
文章目录
- 前言
- 安装 DOTS 包
- Mono To Dots
- Dots To Mono
前言
DOTS(面向数据的技术堆栈)是一套由 Unity 提供支持的技术,用于提供高性能游戏开发解决方案,特别适合需要处理大量数据的游戏,例如大型开放世界游戏。
本文讲解我们的Mono代码部分,如何与Dots的System部分进行通讯。比如:交换数据,发送事件等。
- Unity 2022.3.52f1
- Entities 1.3.10
安装 DOTS 包
要安装 DOTS 包,请按照以下步骤操作:
(1)从菜单“窗口 → 包管理器”打开包管理器。
(2)搜索“ Entities” 并安装 Entities和Entities Graphics。
(3)搜索“ Universal RP” 并安装 Universal RP,并设置Graphics/Scriptable Render Pipeline Settings。
这会添加“实体”作为依赖项,并递归添加它所依赖的关联包( Burst、Collections、Jobs、Mathematics等)。
Mono To Dots
如何从Mono发送控制指令,比如创建士兵的命令到Dots中,让Dots创建指定的实体呢?
我们需要使用到DynamicBuffer,一个Dots中的消息Buffer队列,我们在Mono中可以通过World.EntityManager,获取这个共享的消息队列,并往里面添加消息数据,Dots只需要在System下接受数据并解析即可。
public class GameManager : MonoBehaviour
{public static GameManager Instance { get; private set; }private EntityManager _entityManager;private Entity _commandEntity;private void Start(){Instance = this;_entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;//创建一个专门用于存储游戏命令的"信箱实体",相当于在 ECS 世界中创建了一个命令接收站_commandEntity = _entityManager.CreateEntity();// 为该实体附加一个可动态增长的缓冲区,用于存储多个 GameCommand 命令_entityManager.AddBuffer<GameCommand>(_commandEntity);}private void Update(){if (Input.GetKeyDown(KeyCode.Alpha1))AddSpawnCommand(Faction.Red, SolderType.Melee);}void AddSpawnCommand(Faction faction, SolderType solder, int num = 1){DynamicBuffer<GameCommand> buffer = _entityManager.GetBuffer<GameCommand>(_commandEntity);// 解析网络数据为命令(示例)var command = new GameCommand{CMD = CommandType.SpawnUnit,Faction = faction,Solder = solder,Number = num};buffer.Add(command);}
//UnitSpanerSystem系统类
public partial struct UnitSpawnerSystem : ISystem
{[BurstCompile]public void OnCreate(ref SystemState state){state.RequireForUpdate<EndSimulationEntityCommandBufferSystem.Singleton>();state.RequireForUpdate<EntitiesReferences>();}[BurstCompile]public void OnUpdate(ref SystemState state){var ecbSingleton = SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>();var ecb = ecbSingleton.CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();var entitiesReferences = SystemAPI.GetSingleton<EntitiesReferences>();var job = new UnitSpawnerJob{EntitiesReferences = entitiesReferences,ECB = ecb};var jobHandle = job.ScheduleParallel(state.Dependency);jobHandle.Complete();}
}//UnitSpawnerJob类,用来实现多线程执行任务
[BurstCompile]
public partial struct UnitSpawnerJob : IJobEntity
{public EntityCommandBuffer.ParallelWriter ECB;public EntitiesReferences EntitiesReferences;public void Execute([EntityIndexInQuery] int index, ref DynamicBuffer<GameCommand> buffer){//buffer中会接收到来自Mono端的消息foreach (GameCommand cmd in buffer){ProcessCommand(index, cmd);}buffer.Clear();}//解析命令private void ProcessCommand(int index, GameCommand cmd){switch (cmd.CMD){case CommandType.SpawnUnit:var prefabEntity = GetPrefab(cmd);float3 startPosition = GetBornPos(cmd);float3 targetPosition = GetTargetPos(cmd);Entity zombieEntity = ECB.Instantiate(index, prefabEntity);ECB.SetComponent(index, zombieEntity, LocalTransform.FromPosition(startPosition));ECB.SetComponent(index, zombieEntity, new UnitMover{moveSpeed = 2,rotationSpeed = 2,targetPosition = targetPosition});break;case CommandType.DestroyUnit:break;case CommandType.ChangeTeam:break;default:throw new ArgumentOutOfRangeException();}}
}
Dots To Mono
从Dots把消息发送给Mono层,比如我们的Dots系统中,有士兵死亡,或者游戏的成功/失败,我们需要通知Mono层的主UI更新界面显示等。我们需要用到从Dots往Mono层发送事件。
新建一个数据结构,用来从Dots往Mono发送的消息结构体
public struct RcvData
{public Faction faction;public int type;public float value;public RcvData(Faction faction,int type,float value){this.faction = faction;this.type = type;this.value = value;}
}
新建一个全局的共性数据队列静态类Facade
它主要维护了一个NativeQueue 的共享队列
public static class Facade
{public static NativeQueue<RcvData> SharedQueue { get; } = new(Allocator.Persistent);public static void Cleanup(){if (SharedQueue.IsCreated){SharedQueue.Dispose();}}
}
比如我们的阵营有一个血量,血量 变化会通知Mono端的UGUI更新界面
public partial struct HealthSystem : ISystem
{private NativeQueue<RcvData>.ParallelWriter _writer;private EntityCommandBuffer.ParallelWriter _ecb;[BurstCompile]public void OnCreate(ref SystemState state){state.RequireForUpdate<EndSimulationEntityCommandBufferSystem.Singleton>();_writer = Facade.SharedQueue.AsParallelWriter();}[BurstCompile]public void OnUpdate(ref SystemState state){_ecb = SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>().CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();var job = new HealthJob{Writer = _writer,ECB = _ecb,};var jobHandle = job.ScheduleParallel(state.Dependency);jobHandle.Complete(); // 确保Job执行完成}
}[BurstCompile]
public partial struct HealthJob : IJobEntity
{public NativeQueue<RcvData>.ParallelWriter Writer;public EntityCommandBuffer.ParallelWriter ECB;public void Execute([EntityIndexInQuery] int index,ref Health health){float healthNormalized = health.healthAmount / (float)health.healthAmountMax;//发送数据到UI层Writer.Enqueue(new RcvData(health.faction, 1, healthNormalized));}
}
Mono端,我们如何接受这个数据呢?
//Update 检测Dots事件private void Update(){QueryDotsEvent();}void QueryDotsEvent(){while (Facade.SharedQueue.TryDequeue(out RcvData value)){// 主线程安全读取switch (value.type){case 1:UIManager.Instance.SetHP(value.faction, value.value);break;case 2:Money += (int)value.value;UIManager.Instance.SetMoney(value.faction, Money);break;}}}//销毁时,注意释放共享队列private void OnDestroy(){Facade.Cleanup();}
好了,这样我们就实现了Mono和Dots的双向数据通讯
应该还有别的更好的方法,欢迎大家的留言交流
相关文章:
Unity Dots从入门到精通 Mono和Dots通讯
文章目录 前言安装 DOTS 包Mono To DotsDots To Mono 前言 DOTS(面向数据的技术堆栈)是一套由 Unity 提供支持的技术,用于提供高性能游戏开发解决方案,特别适合需要处理大量数据的游戏,例如大型开放世界游戏。 本文讲…...
WLAN(无线局域网)安全
WLAN安全涉及到保护无线局域网免受各种威胁和攻击,以确保数据的保密性、完整性和可用性。以下是关于WLAN安全的多方面介绍: 一、主要安全威胁 窃听:攻击者利用特殊设备监听无线信号,获取传输中的数据,如用户的账号密…...
故障诊断——neo4j入门
文章目录 neo4jQuickStartDemo neo4j QuickStart 详情可见博客:https://www.cnblogs.com/nhdlb/p/18703804,使用docker拉取最近的一个版本进行创建 docker run -it -d -p 7474:7474 -p 7687:7687 \ -v /disk5/neo4j_docker/data:/data \ -v /disk5/ne…...
【商城实战(25)】解锁UniApp移动端适配秘籍,打造完美商城体验
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Qt 数据库操作(Sqlite)
数据库简介 关于数据库的基础知识这里就不做介绍了,相关博客可以查看: SQL基础知识 数据库学霸笔记 上面博客都写的比较详细,本文主要介绍如何使用Qt进行数据库相关操作,数据库分为关系型数据库和非关系型数据,关系…...
LINUX 指令大全
Linux服务器上有许多常用的命令,可以帮助你管理文件、目录、进程、网络和系统配置等。以下是一些常用的Linux命令: 文件和目录管理 ls:列出当前目录中的文件和子目录 bash lspwd:显示当前工作目录的路径 bash pwdcd:切…...
【Synchronized】不同的使用场景和案例
【Synchronized】不同的使用场景和案例 【一】锁的作用范围与锁对象【1】实例方法(对象锁)【2】静态方法(类锁)【3】代码块(显式指定锁对象)【4】类锁(通过Class对象显式锁定) 【二】…...
华为欧拉操作系统安装Docker服务
华为欧拉 20.03 操作系统安装 Docker 服务 一、安装前准备 系统环境检查 确认当前运行的操作系统为华为欧拉 24.03。可通过在终端执行以下命令查看: cat /etc/os - release欧拉系统可以使用以下命令: cat /etc/openEuler-release确保系统已连接互联…...
告别复杂日志解析 用bin2sql轻松实现MySQL数据闪回
mysqlbinlog⼯具使用 use test; CREATE TABLE t1 (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;INSERT INTO t1(id, name) SELECT 101, tome101; INSERT INTO t1(id, name) SELECT 102, tome1…...
uniapp简单table表
<template><view class"container"><scroll-view scroll-x"true" scroll-y"true" class"table-scroll"><view class"table-header"><view class"table-cell fixed-column">序号<…...
prompt大师高效提示词解析
Prompt大师李继刚高效提示词示例解析 一、「汉语新解」提示词 核心结构 采用Lisp语言框架嵌套中文语义,通过(defun 新汉语老师 ()...)定义角色风格(融合奥斯卡王尔德、鲁迅的批判性语言),用(隐喻 (一针见血...))构建解释逻辑链。…...
uni-app如何发布项目为app_2025
参考大佬的:uni-app项目打包成apk(本地打包篇)_uniapp打包apk-CSDN博客 1、导入前配置 在 HBuilder X 中打开uni-app项目中的 mainifest.json 文件,appid没有的话可以点“重新获取” 2、打包 然后关注控制台,导出成功…...
MySQL与Canal、RabbitMQ集成指南
MySQL 部分 1. 查看是否开启 binlog MySQL 8 默认开启 binlog。可以通过以下命令查看是否开启: SHOW VARIABLES LIKE log_bin;如果返回结果为 ON,则表示 binlog 已开启。 Variable_nameValuelog_binON 2. 若未开启 binlog,则需手动配置 …...
新品发布|启英泰伦联合启明云端推出离在线语音大模型方案
当前,生成式大模型正以颠覆性姿态重塑人机交互的边界,并逐渐向终端场景渗透。然而,云端大模型在落地终端场景时面临两大挑战: 在真实噪声场景下容易听不清、误识别,影响交互准确性;云端处理冗余数据及大规…...
网编高级 day01
网编高级 day01 0. 大纲1. Modbus协议1.1. Modbus起源1.2. 分类1.3. Modbus TCP特点 2. Modbus TCP协议格式2.1. 报文头2.2. 寄存器2.3. 功能码 0. 大纲 协议: modbus协议:modbus TCP、modbus RTUhtml 网页:http协议Webserver 工具&#x…...
2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MDA词频统计两种方式)(吴非、赵宸宇、甄红线300+关键词三种方法)
2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MD&A词频统计两种方式)(吴非、赵宸宇、甄红线300关键词三种方法) 1、时间:2001-2023年 2、来源:上市公司年报 3、参考文献: …...
数据分析与AI丨AI Fabric:数据和人工智能架构的未来
AI Fabric 架构是模块化、可扩展且面向未来的,是现代商业环境中企业实现卓越的关键。 在当今商业环境中,数据分析和人工智能领域发展可谓日新月异。几乎每天都有新兴技术诞生,新的应用场景不断涌现,前沿探索持续拓展。可遗憾的是&…...
MQ消息发送不在MySQL事务中,该如何保证一致性?
在 MQ 消息发送与 MySQL 事务分离的场景下,可通过以下方案保障数据一致性: 一、核心原则 确保 业务操作成功 与 消息发送成功 的最终一致性,避免因网络抖动、服务宕机等异常导致以下问题: 场景1:业务操作成功但消息未…...
[rust] rust学习
rust学习 1. 项目组织结构 工程 # 创建一个工程 cargo new my-project工作空间 在 Rust 中,工作空间(Workspace) 是一个包含多个 Rust 项目的共享环境,用于管理多个 crate(库或可执行文件)。它允许多个…...
艾尔登复刻Ep1——客户端制作、场景切换、网络控制
需要添加的插件内容 Netcode for GameObjects:是一个为 Unity 游戏开发提供高级网络功能的 SDK。它的主要作用是允许开发者在其 GameObject 和 MonoBehaviour 工作流中集成网络功能,并且可以与多种底层传输层协议兼容。 具体内容请看:https:…...
正则表达式(复习)
文章目录 一、[]: 一个字符集合二、{}: 重复次数三、特殊符号四、(): 分组五、python代码示例六、注意 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个…...
密码学笔记
密码学 一、密码学基础概念 1. CIA三要素 机密性 (Confidentiality):信息不被未授权者访问。 例子:用钥匙锁住日记本,只有你有钥匙。 完整性 (Integrity):信息在传输/存储中不被篡改。 例子:快递包裹封条,…...
C#结构体(Struct)详解
在 C# 中,结构体(struct) 是一种值类型数据类型,适用于封装小型数据组。与类(class)不同,结构体在栈(Stack)上分配内存,且赋值时会发生值复制。以下是结构…...
Tomato靶机通关攻略
1.安装并开启靶机 2.用Kali查询靶机IP Kali 的IP 靶机的IP 3.访问靶机 4.用御剑扫描端口 5.获取敏感目录 分别访问三个目录 6.查看目录 发现info.php并进入 查看源码,发现文件包含漏洞 利用漏洞查看日志文件 http://192.168.40.139/antibot_image/antibots/info…...
Go Ebiten小游戏开发:俄罗斯方块
在这篇文章中,我们将一起开发一个简单的俄罗斯方块游戏,使用Go语言和Ebiten游戏库。Ebiten是一个轻量级的游戏库,适合快速开发2D游戏。我们将逐步构建游戏的基本功能,包括游戏逻辑、图形绘制和用户输入处理。 项目结构 我们的项…...
Github 2025-03-12 C开源项目日报Top5
根据Github Trendings的统计,今日(2025-03-12统计)共有5个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目5C++项目1Lean的LEDE源码:为国产龙芯LOONGSON SoC loongarch64/飞腾Phytium腾锐2000系列架构添加支持 创建周期:2338 天开发语言:C协议类…...
【机器学习-基础知识】统计和贝叶斯推断
1. 概率论基本概念回顾 1. 概率分布 定义: 概率分布(Probability Distribution)指的是随机变量所有可能取值及其对应概率的集合。它描述了一个随机变量可能取的所有值以及每个值被取到的概率。 对于离散型随机变量,使用概率质量函数来描述。对于连续型随机变量,使用概率…...
Unity3D 着色器优化(Shader Optimization)
前言 Unity3D 着色器(Shader)优化是提升渲染性能的关键环节,尤其是在移动设备或复杂场景中。以下是系统的优化策略和实践建议: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经…...
基于SpringBoot的“体育购物商城”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“体育购物商城”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体模块设计 前台用户登录界面 系统首页界面…...
数据库约束
数据库约束 1. NULL约束2. UNIQUE:唯一约束3. DEFAULT:默认值约束4. PRIMARY KEY:主键约束5. FOREIGN KEY:外键约束6. CHECK约束 数据库约束是关系型数据库的一个重要功能,主要作用是保证数据的正确性,也就…...
【经典算法】Leetcode-零钱兑换问题
一、题目 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的…...
Go 语言使用Protobuf 进行序列化详解
文章目录 Go 语言使用Protobuf 进行序列化详解1. Protobuf是什么?2. 安装Protobuf 及 Go 依赖3. 编写.proto 文件4. 实现序列化和反序列化 Go 语言使用Protobuf 进行序列化详解 1. Protobuf是什么? 以下是 Protobuf 官方中文文档的概述: Protobuf(Protocol Buffers) 是一种…...
Windows控制台函数:标准输入输出流交互函数GetStdHandle()
目录 什么是 GetStdHandle? 它长什么样? 怎么用它? 它跟 std::cout 有什么不一样? GetStdHandle 是一个 Windows API 函数,用于获取标准输入、标准输出或标准错误设备的句柄。它定义在 Windows 的核心头文件 <…...
自然语言处理初学者指南
文章目录 一、说明二、自然语言处理发展史2.1 最早的自然语言处理简介2.2 历史2.3 NLP 的早期工作 三、NLP的现代方法3.1 单词编码3.2 循环神经网络3.3 强化学习3.4 深度学习 四、更进一步的方法 一、说明 对于初学者来说,自然语言处理的发展历史非常有必要了解&am…...
Kubernetes教程(七)了解集群、标签、Pod和Deployment
了解集群、标签、Pod和Deployment 一、K8s资源对象二、K8s集群1. Master2. Node 三、Namespace(命名空间)四、Label(标签)五、Pod1. 共享网络命名空间2. 共享数据 六、工作负载1. 设置副本数2. 应用升级 结语 Kubernetes的知识真的…...
【BUG分析】微服务无法读取Nacos中的共享配置
项目场景 基于Spring Cloud微服务的商城系统。 使用Nacos进行统一配置管理,在bootstrap.xml中读取配置参数。 问题描述 购物车微服务可以读取Nacos中的共享mybatis配置,商品管理微服务却读不到,启动报错提示无法配置数据库源: …...
SpringMVC (一)基础
目录 SpringMVC 一 简单使用 1 新建模块选择指定参数 2 创建实现类 3 将项目启动 4 运行结果:在浏览器当中响应执行 二 RequestMapping 三 请求限定 SpringMVC SpringMVC是Spring的web模块,用来开发Web应用,SpringMVC应用最终作为B/…...
【ES6】ES6中的类
基础定义和使用 class Animal {constructor(name, species, age) {this.name namethis.species speciesthis.age age} }let dog new Animal("Spot", "Dog", 4)私有变量 变量名前带#即可。 Getter 和Setter方法 继承 // 父类 class Point{construc…...
兴达易控Profinet 转 ModbusTCP跨网段通信模块
Profinet 转 ModbusTCP/跨网段通信模块 Profinet转ModbusTCP/跨网段通信模块,作为现代工业自动化系统中不可或缺的重要组件,正日益受到广泛关注和应用。 这种模块的核心功能是将Profinet网络协议转换为Modbus TCP协议,实现不同网络之间的无缝…...
linux 的免密切换用户PAM配置
/etc/pam.d/su是Linux系统中与用户切换(su命令)相关的PAM(Pluggable Authentication Modules,可插拔认证模块)配置文件。以下是对它的详细介绍: 简介 作用 PAM是一种用于管理系统认证的机制,…...
使用 Python pandas操作 Excel 文件
使用 Python pandas 操作 Excel 文件 flyfish pandas 是 Python 中一个强大的数据处理和分析库,它提供了丰富的数据结构(如 Series 和 DataFrame)和数据操作方法,能够方便地处理各种数据格式,包括 Excel 文件。 安装…...
UE5.5 Niagara 发射器粒子更新模块
Particle State (粒子状态)模块 Particle State 主要用于控制粒子的生存状态,包括死亡、消失、响应事件等。 Particle State Kill Particles When Lifetime Has Elapsed 当粒子的生命周期结束时,销毁这些粒子。 Lifetime &…...
状态模式的C++实现示例
核心思想 状态模式(State Pattern) 是一种行为设计模式,允许对象在其内部状态改变时改变其行为。它将状态相关的逻辑分散到不同的状态类中,避免了使用大量的条件语句来处理不同状态下的行为。 状态抽象化:将对象的状…...
ThinkPHP8.0+MySQL8.0搭建简单实用电子证书查询系统
客户花了100元买了一个系统,开始不能导入,到处找人帮忙解决。给解决能导入了,不能修改,满足不了用户的需求。用户一狠心,花200块钱,叫我给他定制了一个电子证书查询系统。还免费给部署到服务器。惭愧惭愧……...
STM32全系大阅兵(2)
接前一篇文章:STM32全系大阅兵(1) 本文内容参考: STM32家族系列的区别_stm32各个系列区别-CSDN博客 STM32--STM32 微控制器详解-CSDN博客...
upload-labs通关攻略 【Pass-01~Pass-19】
注意:GitHub中upload-labs有多个版本:19关、21关、23关。版本不同,关卡的顺序也很可能不同。此次例子是21关。 项目地址:https://github.com/c0ny1/upload-labs 一、Pass-01 【js前端检测的绕过】 1. 打开Pass-01 访问:ip/uploa…...
HCIP复习拓扑练习(修改版)
拓扑: 实际: 需求: 需求分析 1.这意味着学校内部网络能够正常解析域名并进行互联网访问。 2. PC1和PC2处于同一个内网192.168.1.0/24,其中PC1有权限访问外部网段3.3.3.0/24,而PC2没有。这涉及ACL(访问控制…...
Zabbix 7.2 + Grafana 中文全自动安装ISO镜像
简介 基于Zabbix 官方的Alma Linux 8 作为基础镜像。 镜像源都改为国内大学镜像站,自动联网安装ZabbixGrafana。 安装中文字体、Zabbix和Grafana也配置默认中文。 Zabbix 也指定中文字体,绘图无乱码。 配置时区为东八区,Zabbix配置We…...
使用 Python 将 PDF 转换为文本:打造一个简单高效的提取工具
在数字化时代,PDF 文件是我们日常生活中常见的文档格式。无论是学术论文、工作报告还是电子书,PDF 的广泛使用让提取其中文字内容成为一个常见需求。手动复制粘贴显然效率低下,而借助 Python,我们可以轻松实现自动化提取。本文将介…...
scoop退回软件版本的方法
title: scoop退回软件版本的方法 date: 2025-3-11 23:53:00 tags: 其他 前言 在软件更新后,如果出现了很影响使用体验的问题,那么可以把软件先退回以前的版本进行使用, 但是scoop本身并没有提供直接让软件回退版本的功能,因此…...