Unity DOTS从入门到精通之EntityCommandBufferSystem

news2025/3/10 11:19:09

文章目录

    • 前言
    • 安装 DOTS 包
    • ECB
    • ECB可以执行的指令
    • 示例:

前言

DOTS(面向数据的技术堆栈)是一套由 Unity 提供支持的技术,用于提供高性能游戏开发解决方案,特别适合需要处理大量数据的游戏,例如大型开放世界游戏。
本文讲解了如何使用“ ECB ”来执行Job处理过程中无法执行的命令,例如“创建实体”。

  • 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等)。

在这里插入图片描述

ECB

“ ECB ” (Entity Command Buffer) 是一个缓冲区,在 Unity DOTS 中用于管理和执行 EntityCommandBuffer 命令队列的重要系统。它确保了跨线程和跨帧操作的安全性
默认提供了以下几种 EntityCommandBufferSystem 实现:
BeginInitializationEntityCommandBufferSystem
EndInitializationEntityCommandBufferSystem
BeginSimulationEntityCommandBufferSystem
EndSimulationEntityCommandBufferSystem
BeginPresentationEntityCommandBufferSystem
EndPresentationEntityCommandBufferSystem
FixedStepSimulationEntityCommandBufferSystem
这些系统的名称中包含了它们所属的阶段(Initialization、Simulation、Presentation)以及它们在这些阶段中的执行时机(Begin 和 End)。
在这里插入图片描述

ECB可以执行的指令

ECB 可以执行的命令在 EntityCommandBuffer 方法中定义。
・AddBuffer(Entity):添加一个缓冲区。
・AddComponent(Entity, T):添加一个组件。
・AddComponent(EntityQuery,ComponentType):添加一个组件。
・AddSharedComponent(Entity, T):添加一个共享组件。
・AddSharedComponent(EntityQuery, T):添加一个共享组件。
・CreateEntity(EntityArchetype):创建一个实体。
・DestroyEntity(Entity):摧毁一个实体。
・DestroyEntity(EntityQuery):销毁一个实体。
・RemoveComponent(Entity):删除一个组件。
・RemoveComponent(Entity,ComponentType):删除一个组件。
・RemoveComponent(EntityQuery,ComponentType):删除一个组件。
・SetBuffer(Entity):更新缓冲区。
・SetComponent(Entity, T):更新一个组件。
・SetSharedComponent(Entity, T):更新共享组件。
・实例化(实体):创建一个实例。
・ToConcurrent():转换为并行ECB。
・Playback(EntityManager):执行命令。
・Dispose():处理。

各类 EntityCommandBufferSystem 的区别与用途

2.1 BeginInitializationEntityCommandBufferSystem
所属阶段: Initialization(初始化阶段)
执行时机: 在 InitializationSystemGroup 的最开始执行。
用途: 适用于在所有初始化系统运行之前提交命令,例如在初始化前预加载资源或设置初始状态。
示例使用场景: 预加载游戏资源,初始化全局状态。

2.2 EndInitializationEntityCommandBufferSystem
所属阶段: Initialization(初始化阶段)
执行时机: 在 InitializationSystemGroup 的最后执行。
用途: 适用于在所有初始化系统运行之后提交命令,例如生成初始实体或设置初始组件。
示例使用场景: 创建游戏中的初始实体,设置初始组件数据。

2.3 BeginSimulationEntityCommandBufferSystem
所属阶段: Simulation(模拟阶段)
执行时机: 在 SimulationSystemGroup 的最开始执行。
用途: 适用于在模拟逻辑运行之前提交命令,例如重置状态或准备模拟所需的实体和组件。
示例使用场景: 重置游戏逻辑状态,准备模拟所需的实体。

2.4 EndSimulationEntityCommandBufferSystem
所属阶段: Simulation(模拟阶段)
执行时机: 在 SimulationSystemGroup 的最后执行。
用途: 适用于在模拟逻辑运行之后提交命令,例如销毁实体或更新组件数据。
示例使用场景: 销毁不再需要的实体,更新组件数据以反映模拟结果。

2.5 BeginPresentationEntityCommandBufferSystem
所属阶段: Presentation(呈现阶段)
执行时机: 在 PresentationSystemGroup 的最开始执行。
用途: 适用于在渲染之前提交命令,例如更新与渲染相关的组件或准备渲染所需的实体。
示例使用场景: 更新渲染相关的组件,准备渲染所需的实体。

2.6 EndPresentationEntityCommandBufferSystem
所属阶段: Presentation(呈现阶段)
执行时机: 在 PresentationSystemGroup 的最后执行。
用途: 适用于在渲染之后提交命令,例如清理渲染相关的资源或处理后处理效果。
示例使用场景: 清理渲染资源,处理后处理效果。

2.7 FixedStepSimulationEntityCommandBufferSystem
所属阶段: Simulation(模拟阶段),专为固定时间步长设计。
执行时机: 在固定时间步长的模拟阶段执行。
用途: 适用于需要与物理引擎等固定时间步长系统配合的操作,例如处理碰撞事件或物理模拟后的操作。
示例使用场景: 处理物理引擎的碰撞事件,更新与物理模拟相关的组件。

示例:

从System 往Job层传递

partial struct BulletMoverSystem : ISystem
{
    [BurstCompile]
    public void OnCreate(ref SystemState state)
    {
        state.RequireForUpdate<EndSimulationEntityCommandBufferSystem.Singleton>();
    }

    [BurstCompile]
    public void OnUpdate(ref SystemState state)
    {
        var ecb = SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>()
            .CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();

        var job = new BulletMoverJob
        {
            deltaTime = SystemAPI.Time.DeltaTime,
            ECB = ecb,
        };

        var jobHandle = job.ScheduleParallel(state.Dependency);
        jobHandle.Complete();
    }
}

Job中的ECB使用


[BurstCompile]
public partial struct ShootAttackJob : IJobEntity
{
    public EntitiesReferences EntitiesReferences;
    public float DeltaTime;
    public EntityCommandBuffer.ParallelWriter ECB;

    public void Execute([EntityIndexInQuery] int index,
        ref LocalTransform localTransform,
        ref FindTarget findTarget,
        ref ShootAttack shootAttack,
        ref UnitMover unitMover)
    {
        shootAttack.timer -= DeltaTime;
        if (shootAttack.timer > 0f)return;
        shootAttack.timer = shootAttack.timerMax;
		
		//克隆实体
        Entity bulletEntity = ECB.Instantiate(index, EntitiesReferences.bulletPrefabEntity);
        float3 bulletSpawnWorldPosition = localTransform.TransformPoint(shootAttack.bulletSpawnLocalPosition);
        //修改实体组件
        ECB.SetComponent(index, bulletEntity, LocalTransform.FromPosition(bulletSpawnWorldPosition));
        ECB.SetComponent(index, bulletEntity, new Bullet
        {
            speed = 5,
            damageAmount = shootAttack.damageAmount
        });
        //销毁实体
		ECB.DestroyEntity(index, entity);
    }
}

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

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

相关文章

MySQL 索引的数据结构(详细说明)

6. MySQL 索引的数据结构(详细说明) 文章目录 6. MySQL 索引的数据结构(详细说明)1. 为什么使用索引2. 索引及其优缺点2.1 索引概述 3. InnoDB中索引的推演3.1 索引之前的查找3.2 设计索引3.3 常见索引概念1. 聚簇索引2. 二级索引&#xff08;辅助索引、非聚簇索引&#xff09;…

初学者快速入门Python爬虫 (无废话版)

全篇大概 5000 字(含代码)&#xff0c;建议阅读时间 40min 一、Python爬虫简介 1.1 什么是网络爬虫&#xff1f; 定义&#xff1a; 网络爬虫&#xff08;Web Crawler&#xff09;是自动浏览互联网并采集数据的程序&#xff0c;就像电子蜘蛛在网页间"爬行"。 分类&…

【git】ssh配置提交 gitcode-ssh提交

【git】ssh配置提交 gitcode-ssh提交 之前一直用的是gitee和阿里云的仓库&#xff0c;前两天想在gitcode上面备份一下我的打洞代码和一些资料 就直接使用http克隆了下来 。 在提交的时候他一直会让我输入账号和密码&#xff0c;但是我之前根本没有设置过这个&#xff0c;根本没…

【二】JavaScript能力提升---this对象

目录 this的理解 this的原理 事件绑定中的this 行内绑定 动态绑定 window定时器中的this 相信小伙伴们看完这篇文章&#xff0c;对于this的对象可以有一个很大的提升&#xff01; this的理解 对于this指针&#xff0c;可以先记住以下两点&#xff1a; this永远指向一个…

<论文>MiniCPM:利用可扩展训练策略揭示小型语言模型的潜力

一、摘要 本文跟大家一起阅读的是清华大学的论文《MiniCPM: Unveiling the Potential of Small Language Models with Scalable Training Strategies》 摘要&#xff1a; 对具有高达万亿参数的大型语言模型&#xff08;LLMs&#xff09;的兴趣日益增长&#xff0c;但同时也引发…

SpringCloud系列教程(十三):Sentinel流量控制

SpringCloud中的注册、发现、网关、服务调用都已经完成了&#xff0c;现在就剩下最后一部分&#xff0c;就是关于网络控制。SpringCloud Alibaba这一套中间件做的非常好&#xff0c;把平时常用的功能都集成进来了&#xff0c;而且非常简单高效。我们下一步就完成最后一块拼图Se…

ArcGIS操作:15 计算点的经纬度,并添加到属性表

注意&#xff1a;需要转化为地理坐标系 1、打开属性表&#xff0c;添加字段 2、计算字段&#xff08;以计算纬度为例 !Shape!.centroid.Y ) 3、效果

蓝桥杯历年真题题解

1.轨道炮&#xff08;数学模拟&#xff09; #include <iostream> #include <map> using namespace std; const int N1010; int x[N],y[N],v[N]; char d[N]; int main() {int n;int ans-100;cin>>n;for(int i1;i<n;i)cin>>x[i]>>y[i]>>v…

IP-地址

主机号&#xff08;Host ID&#xff09; IP地址简介&#xff1a;IP地址是每台接入互联网的设备所拥有的唯一标识符&#xff0c;类似于电话号码的分层结构&#xff0c;由网络号和主机号组成。为了便于记忆&#xff0c;32位二进制的IP地址通常以点分十进制表示。 网络号&#xf…

2025-03-08 学习记录--C/C++-PTA 习题10-1 判断满足条件的三位数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h> #include <math.h>int search( int n );int…

三星首款三折叠手机被曝外屏6.49英寸:折叠屏领域的新突破

在智能手机的发展历程中,折叠屏手机的出现无疑是一次具有里程碑意义的创新。它打破了传统手机屏幕尺寸的限制,为用户带来了更加多元和便捷的使用体验。而三星,作为手机行业的巨头,一直以来都在折叠屏技术领域积极探索和创新。近日,三星首款三折叠手机的诸多细节被曝光,其…

LINUX网络基础 [五] - HTTP协议

目录 HTTP协议 预备知识 认识 URL 认识 urlencode 和 urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式 HTTP的方法 HTTP的状态码 ​编辑HTTP常见Header HTTP实现代码 HttpServer.hpp HttpServer.cpp Socket.hpp log.hpp Makefile Web根目录 H…

WPS Word中英文混杂空格和行间距不一致调整方案

文章目录 问题1&#xff1a;在两端对齐的情况下&#xff0c;如何删除参考文献&#xff08;英文&#xff09;的空格问题2&#xff1a;中英文混杂行间距不一致问题问题3&#xff1a;设置中文为固定字体&#xff0c;设置西文为固定字体参考 问题1&#xff1a;在两端对齐的情况下&a…

CSDN博客:Markdown编辑语法教程总结教程(中)

❤个人主页&#xff1a;折枝寄北的博客 Markdown编辑语法教程总结 前言1. 列表1.1 无序列表1.2 有序列表1.3 待办事项列表1.4 自定义列表 2. 图片2.1 直接插入图片2.2 插入带尺寸的图片2.3 插入宽度确定&#xff0c;高度等比例的图片2.4 插入高度确定宽度等比例的图片2.5 插入居…

电子学会—2024年月6青少年软件编程(图形化)四级等级考试真题——水仙花数

水仙花数 如果一个三位数等于它各个数位上的数字的立方和&#xff0c;那么这个数就是水仙花数&#xff0c;例如:153 111 555 333&#xff0c;153就是一个水仙花数。 1.准备工作 (1)保留默认角色小猫; (2)白色背景。 2.功能实现 (1)使用循环遍历所有三位数&#xff0c;把所…

JetBrains学生申请

目录 JetBrains学生免费授权申请 IDEA安装与使用 第一个JAVA代码 1.利用txt文件和cmd命令运行 2.使用IDEA新建项目 JetBrains学生免费授权申请 本教程采用学生校园邮箱申请&#xff0c;所以要先去自己的学校申请校园邮箱。 进入JetBrains官网 点击立即申请&#xff0c;然…

langchain系列(终)- LangGraph 多智能体详解

目录 一、导读 二、概念原理 1、智能体 2、多智能体 3、智能体弊端 4、多智能体优点 5、多智能体架构 6、交接&#xff08;Handoffs&#xff09; 7、架构说明 &#xff08;1&#xff09;网络 &#xff08;2&#xff09;监督者 &#xff08;3&#xff09;监督者&…

侯捷 C++ 课程学习笔记:深入理解智能指针

文章目录 每日一句正能量一、引言二、智能指针的核心概念&#xff08;一&#xff09;std::unique_ptr&#xff08;二&#xff09;std::shared_ptr&#xff08;三&#xff09;std::weak_ptr 三、学习心得四、实际应用案例五、总结 每日一句正能量 如果说幸福是一个悖论&#xff…

访问不了 https://raw.githubusercontent.com 怎么办?

修改 Hosts 文件&#xff08;推荐&#xff09;​ 原理&#xff1a;通过手动指定域名对应的 IP 地址&#xff0c;绕过 DNS 污染。 步骤&#xff1a; 1、访问 IPAddress.com&#xff0c;搜索 raw.githubusercontent.com&#xff0c;获取当前最新的 IPv4 地址&#xff08;例如 1…

大模型工程师学习日记(十五):Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析)

1. datasets 库核心方法 1.1. 列出数据集 使用 d atasets 库&#xff0c;你可以轻松列出所有 Hugging Face 平台上的数据集&#xff1a; from datasets import list_datasets# 列出所有数据集 all_datasets list_datasets()print(all_datasets)1.2. 加载数据集 你可以通过 l…