
ECS
文章平均质量分 80
RuntimeCube
这个作者很懒,什么都没留下…
展开
-
[C#] C# Tasks vs. Unity Jobs
两周前,我们针对 Unity 的新 C# 作业系统测试了 async 和 wait 关键字以及 C# Task 系统的性能。这测试了 Task 系统中异步和等待的常见组合,但没有直接针对 Unity 的 C# 作业系统测试任务系统。今天我们将对此进行测试,并在此过程中了解如何在没有 async 和 wait 关键字的情况下使用Task系统。翻译 2024-03-10 21:55:57 · 297 阅读 · 0 评论 -
[Unity Entitas] CookBook 典型的例子Hello world[10]
“Hello world”就是一个典型的例子,用来说明手头技术的主要好处。对于编程语言,人们使用一个将 Hello World 输出到控制台的小程序。对于我看到的大多数 ECS 实现,从 MoveSystem 开始。翻译 2022-08-13 19:52:47 · 400 阅读 · 0 评论 -
[Unity Entitas] CookBook 响应式系统Reactive System[9]
响应式系统是一个只有在我们需要处理实体时才会被调用的系统。在内部,响应式系统使用收集器实例(有关更多信息,请参阅收集器章节)。作为用户,您需要扩展一个抽象类 ReactiveSystem。该系统的目的是销毁标有 Destroyed 组件的实体。正如您在 GetTrigger 方法中看到的,我们返回一个收集器,它监视一组已销毁的实体。...翻译 2022-08-13 19:23:49 · 197 阅读 · 0 评论 -
[Unity Entitas] CookBook 系统System[8]
ECS 或面向数据的设计的主要目标是分离状态形式的行为。系统是我们定义行为的地方。在系统中,我们可以编写创建新状态、更改给定状态或破坏状态的代码。在 Entitas-CSharp 中,我们必须实现多个接口才能将类标记为系统。ISystem 接口是一个基础接口,我们不必自己实现。它只是内部使用的标记(所谓的幽灵协议)。如果我们想有一个应该定期执行的系统,我们需要实现 IExecuteSystem。...翻译 2022-08-11 22:18:04 · 200 阅读 · 0 评论 -
[Unity Entitas] CookBook 索引Index[7]
这也是我们推荐的,当您需要存储从一个实体到另一个实体的引用时(更多内容请参见 ingredience 章节)。当我们开始创建实体并向它们添加组件时,它们将开始进入组,并且索引将被通知添加了具有以下组件的实体。它获取前一个组件,因此它可以从 HashMap 中删除条目,如果我们用另一个组件替换它,它将再次接收带有新值的添加事件。你可能需要一个更复杂的,你想在一个范围内获取实体,或者有一个更复杂的索引键。在这个片段中,我们要求上下文为我们提供位置上的所有实体,其中“输入”受到影响,我们过滤掉非交互的实体。...翻译 2022-08-11 21:13:59 · 194 阅读 · 0 评论 -
[Unity Entitas] CookBook 收集器Collector[6]
在这个例子中,我们定义我们想要收集所有移除GameBoardElement组件的实体。在内部,收集器将要求一组包含GameBoardElement组件的实体。它将自己订阅组事件并保留对将离开组的实体的引用列表,因为我们对Removed事件感兴趣。即使我们再次向它添加GameBoardElement组件,它仍然会保持收集状态,并且它会再次添加到组中。您可能不会单独使用它,但它仍然是Entitas非常重要的成分。可以激活和停用收集器,以便我们可以停止和恢复对组的观察。...翻译 2022-08-02 08:46:54 · 172 阅读 · 0 评论 -
[Unity Entitas] CookBook 组[5]
ECS典型的“HelloWorld”就是所谓的“movesystem”。移动系统是一个系统,它采用所有具有位置和速度分量的实体并交换该实体上的位置分量,有效地将其移向速度矢量。当我们意识到这个实体上有什么样的其他组件并不重要时,AHA时刻就到来了。它可以是人、狗、汽车、直升机或房子。如果它具有位置分量和速度分量,则必须移动它。...翻译 2022-08-01 23:29:36 · 103 阅读 · 0 评论 -
[Unity Entitas] CookBook 上下文Context[4]
上下文是实体的管理数据结构。实体不能单独创建,必须通过context.CreateEntity()创建。这样,上下文可以管理我们创建的所有实体的生命周期。它也是第一个在我们操作实体时收到通知的观察者(参见实体章节中的实体观察部分)。...翻译 2022-08-01 23:13:57 · 201 阅读 · 0 评论 -
[Unity Entitas] CookBook 实体[3]
引用计数是一种内部机制,可确保实体在不再被引用之前不会被重用。当您保留对实体的引用时,您必须调用entity.Retain(this);当需要删除引用时,调用entity.Release(this);很重要。这些调用增加和减少引用计数。Entitas-CSharp的所有内部类都尊重这种机制,你的代码也应该如此。如果您在保留对实体的引用时不调用Retain,您最终可能会保留对已被销毁并重生为其他实体的实体的引用。...翻译 2022-07-31 23:21:42 · 144 阅读 · 0 评论 -
[Unity Entitas] CookBook 组件[2]
组件是ECS中最简单的成分。它是数据的原子表示。它可以是空的,具有一个或多个属性,甚至可以标记为唯一。在下文中,我将解释关于Entitas-CSharp的差异。翻译 2022-07-31 23:07:38 · 430 阅读 · 0 评论 -
[Unity Entitas] CookBook 介绍[1]
Hi,我的名字是Maxim,我是一名软件开发人员。2012年底,我在柏林的休闲游戏工作室Wooga工作时偶然发现了ECS(实体组件系统)和Entitas(ECS的实现)。从那以后,我帮助改进了Entitas并将其移植到不同的语言,并自己用它构建了几个游戏和应用程序。老实说,写这本书不是我的主意。Entitas-CSharp社区的优秀人士将我推向了这个方向,并承诺在此过程中提供帮助。由于这是我写的第一章,我仍然希望能得到一些帮助。...翻译 2022-07-31 22:32:55 · 241 阅读 · 0 评论 -
[Unity ECS] 在 Burst 中的 in 参数
Unity Burst编译器将你的C#代码转换为高度优化的机器代码。我们经常从我们的论坛用户(如@dreamingimlatios)那里得到一个问题,那就是Burst代码中的函数参数。开发者是否应该使用它们,在哪里使用?我们已经把这篇文章放在一起,试图更详细地解释它们。什么是in 参数 C# 7.2 引入了 in 参数修饰符,即通过引用将一些东西传递给一个函数,而被调用的函数不允许修改这些数据。int Foo(in int a, ref int b){ a = 42; // 这将是一个翻译 2022-01-13 21:31:07 · 402 阅读 · 0 评论 -
[Unity ECS] 关于 DOTS:实体组件系统
英文原文:https://blog.unity.com/technology/on-dots-entity-component-system 这是关于我们新的以数据为导向的技术栈(DOTS)的几篇文章之一,分享一些关于我们如何和为什么走到今天,以及我们接下来要去哪里的见解。 在我的上一篇文章中,我谈到了 HPC# 和 Burst 作为 Unity 未来发展的底层基础技术。我喜欢将我们栈的这一层称为“游戏引擎的引擎”。任何人都可以使用这个栈来编写游戏引擎。我们可以。我们会。你也可以。不喜欢我们的翻译 2022-01-13 17:58:59 · 824 阅读 · 1 评论 -
[Unity ECS] 在 DOTS 中的: C++ & C#
英文原文:https://blog.unity.com/technology/on-dots-c-c 这是对我们新的面向数据的技术堆栈 (DOTS) 的简要介绍,分享一些关于我们如何以及为什么达到今天的位置以及下一步要去哪里的见解。我们计划在不久的将来在这个博客上发布更多关于 DOTS 的信息。 让我们来谈谈C++。今天,Unity是用这种语言编写的。 许多高级游戏程序员最后的问题之一是,他们需要提供一个目标处理器可以理解的指令的可执行文件,执行后就可以运行游戏。 对于我们代码的性能关翻译 2022-01-13 15:17:43 · 480 阅读 · 0 评论 -
[Unity ECS] 如何找到有关 DOTS 包的更多信息?
您想了解有关 DOTS 内部结构的更多信息吗? 我希望你通过寻找答案找到这篇文章的方法。我将快速向您展示如何了解有关 Unity 及其内部结构的更多信息。这是一个很好的灵感来源。作为布雷达应用科技大学的一名游戏开发学生,我可以将研究文件中获得的知识应用到我的 DOTS 项目中,也可以应用到我的 C++ 项目中。从 Unity 源代码中,您可以了解大量面向数据的设计或多线程的一般应用。 我的队友 Menno 在创建native containers的过程中文档停止时,从文件中学到了很多东西!如果你还没翻译 2022-01-11 19:57:32 · 323 阅读 · 0 评论 -
[Unity ECS] Unity DOTS 编辑器
介绍 了解 Unity 编辑器如何在使用 DOTS 进行开发时为您提供支持对于加快工作流程和获取调试信息非常重要。在这篇文章中,我将介绍可用于 DOTS 的编辑器功能。要跟随这篇文章,您将需要以下软件包。Entities:安装此包及其依赖项将添加使用 DOTS 开发所需的一切,例如burst编译器和Job System。DOTS Editor: 虽然是可选的,但此包将为 DOTS 添加额外的编辑器功能,将在此处介绍。Entity Debugger可以在以下位置找到:Window >翻译 2022-01-11 19:36:45 · 974 阅读 · 0 评论 -
[Unity ECS] 实体之间如何交互
我们如何实现实体之间的交互? 在我们真正回答这个问题之前,我们应该制定实际问题。概要 在ECS中,当涉及到实体之间的交互时,有两个问题:读和写访问。事实是,交互并不真正存在,它们隐藏了底层关系的实现。那么,一个关系无非是数据的转变。(更多关于) 为了推理出创建这些转变的正确工具,我们需要推理我们的代码并问自己以下五个问题。我们对哪些数据进行操作?我们的域是什么?我们转换的可能输入是什么。数据使用的频率是多少?我们实际上在转变什么?我们的算法会是什么样子?我们多久进行一次转变?翻译 2022-01-09 22:46:50 · 1409 阅读 · 0 评论 -
[Unity ECS] 连接实体或实体的关系
问题所在 在游戏中,不同的对象经常相互作用,例如,一个按钮可以打开一扇门,一个孩子可以跟随它的父母等等。在新的ESC系统中,这些层次结构并非小事,层次结构并没有真正地原生存在。那么,我们如何在一个层次结构中链接实体呢?将实体链接为一个组 在新的ESC中,如果你通过ConvertToEntity将一个GameObject转换成实体,那么这个层次结构就不会被转换成ESC World(新版的ECS已经自动会连接实体,将自动在根物体上创建LinkedEntityGroup)。这方面的简单解决方案叫做Lin翻译 2022-01-09 21:46:20 · 625 阅读 · 0 评论 -
[Unity Native Container] 自定义Native Container [第 5 部分]:ParallelFor 使用 ParallelWriter 和线程索引
介绍 在本系列之前,我们研究了创建自己的自定义Native Container并添加对功能的支持,例如在Job完成时解除分配以及添加并行Job支持的多种方法。在这一部分中,我们将研究另一种使用 [NativeSetThreadIndex] 添加对并行写入的支持的方法。 本文不会使用以前文章中的代码,而是实现一个全新的Native Container。因此,我们假设你已经了解了如何做这件事。如果没有,你可以回去阅读本系列的前几篇文章。1) NativeSummedFloat3 Setup 我们.翻译 2022-01-09 21:34:10 · 602 阅读 · 0 评论 -
[Unity ECS] 使用非托管内存
这个包中的 Native- 和 Unsafe- 集合是从非托管内存分配的,这意味着垃圾收集器不知道它们的存在。您负责释放不再需要的任何非托管内存。未能释放大量或大量的分配可能会导致浪费越来越多的内存,这最终可能会减慢甚至崩溃您的程序。分配器 分配器管理一些非托管内存,您可以从中进行分配。不同的分配器以不同的方式组织和跟踪它们的内存。三个标准提供的分配器是:Allocator.Temp最快的分配器。对于非常短暂的分配。临时分配不能传递给Job。 每一帧,主线程都会创建一个临时分配器,该分配器翻译 2022-01-02 21:18:43 · 1961 阅读 · 0 评论 -
[Unity ECS] Unity Collections Package
该包提供了可用于Job 和 Burst 编译代码的非托管数据结构。这个包提供的集合分为三类:Unity.Collections 中名称以 Native- 开头的集合类型具有安全检查,以确保它们被正确处理并以线程安全的方式使用。Unity.Collections.LowLevel.Unsafe 中名称以 Unsafe- 开头的集合类型没有这些安全检查。剩余的集合类型没有被分配并且不包含指针,因此实际上它们的处理和线程安全从来都不是问题。这些类型只保存少量数据。 Native-t翻译 2022-01-02 19:45:46 · 4268 阅读 · 0 评论 -
[Unity ECS] 在Job中使用托管类型
英文原文:https://www.jacksondunstan.com/articles/5397我们永远无法从作业中实际使用托管对象 Job 结构不能包含托管类型,如字符串、类实例或委托。目前这是一个痛苦,因为很多 Unity API 依赖于这些,所以我们不得不处理它们。今天我们将讨论如何在我们的Job中使用托管类型来弥补这一点。管理方法 为了说明我们想要做什么,让我们从使用大量托管类型的工作开始。其目的是选择要为游戏结果显示的文本。struct Player{ public翻译 2022-01-01 23:52:17 · 1250 阅读 · 0 评论 -
[Unity ECS] 如何使用Unity DOTS DynamicBuffer
英文原文:https://snack.planetarium.dev/eng/2020/05/unity-dots-start-to-use-dynamic-buffer/IBufferElementData 实现 正如添加到实体的组件必须实现 IComponentData 接口一样,DynamicBuffer 也必须实现 IBufferElementData 接口。我创建了一个实现 IBufferElementData 的 IntBufferElement 结构。它的格式类似于ICompo翻译 2021-12-28 22:18:51 · 1295 阅读 · 0 评论 -
[Unity ECS] 游戏对象转换和子场景 [2]
IConvertGameObjectToEntity 制作转换系统(子类化 GameObjectConversionSystem)确实允许您处理转换世界中的所有事情。但是如果你想要每个类型的行为怎么办?每当它被转换时,就会发生一些事情。 Unity 有另一个内置转换系统,称为 ConvertGameObjectToEntitySystem。该系统将遍历从转换世界返回的所有游戏对象。然后使用 GetComponents 并查看是否有 IConvertGameObjectToEntity。然后调用 .C翻译 2021-12-20 21:21:58 · 1181 阅读 · 0 评论 -
[Unity ECS] 游戏对象转换和子场景 [1]
游戏只是关于玩家输入改变数据,然后看到不同呈现的事物,因此玩得开心。这些数据是使用 Unity 的 WYSIWYG 工具在scene设计的。但是那些基于 GameObject 的数据与 ECS 不兼容。如果像以前一样轻松编写数据,而是在运行时获取 ECS 数据,以便我们可以有效地处理它们,那就太好了。本文基于 Entities 包版本 0.5.1游戏之前是怎么制作的 让我们想想为什么我们会看到像这样每一帧都正确绘制的立方体?在经典的 GameObject 中,引擎代码会编译整个层次树,并以正确翻译 2021-12-19 19:59:21 · 1922 阅读 · 0 评论 -
[Unity ECS] Blob Asset 入门
英文原文:https://coffeebraingames.wordpress.com/2020/11/29/getting-started-with-blob-asset/ Blob Asset是 Unity 的 DOTS 中使用的概念。基本上,它是一种存储在非托管内存中的资产,可以在组件内部访问。这里的“Asset”一词并不是传统意义上的资产,如预制件、纹理、3D 模型、音频剪辑等。该术语用于表示数据。它可以像整数一样简单,也可以像结构数组一样复杂,也可以像 NativeHashMap 形式的翻译 2021-12-18 13:08:33 · 935 阅读 · 0 评论 -
[Unity ECS] 使用Scriptableobject和 Blob asset,创建实用类
英文原文:https://neilmarkcorre.wordpress.com/2020/12/01/working-with-scriptable-objects-and-blob-assets-and-creating-a-utility-class/&esmp; 因此,您希望将可编写脚本的对象转换为可在 ECS 系统中使用的数据——但是,您无法使用纯 ECS 直接访问 SO。今天,我将与您分享如何将可编写脚本的对象转换为 Blob 资产,并分享我在学习 Blob 资产时创建的实用程序翻译 2021-12-15 23:33:41 · 620 阅读 · 0 评论 -
[Unity] 使用Scriptable Objects 和 Blob Assets,并创建一个实用类
英文原文:https://neilmarkcorre.wordpress.com/tag/gameobjectconversionsystem/ 所以,你想把scriptable objects转换为可以在ECS系统中使用的数据–但是,你不能用纯ECS直接访问scriptable objects。今天,我将与大家分享如何将scriptable objects转换为Blob assets,同时也分享我在研究Blob assets时创建的一个实用类。 首先,让我们快速定义一下什么是blob asset翻译 2021-07-03 19:25:27 · 743 阅读 · 0 评论 -
[Unity] ECS中的重复多态性
多态性是那些难以摆脱的OOP基础之一。它很容易做到,而且非常直观。我们用它来重构代码,使其更有条理。我们用它来管理不同的行为,同时只保持一个单一的接口。我们还用它来制作全面的创作编辑器,通过与反射相辅相成,影响运行时的行为。 然而,在一个不允许引用类型的环境中,它是无法做到的(Unity的HPC#)。它可以在ECS中以另一种方式进行复制,这就是本帖的内容。OOP版本 比方说,我们有一个投射物的框架。我们还可以说,我们的游戏世界是带有魔法的蒸汽朋克。我们希望能够同时支持子弹和魔法弹丸,如火球。我翻译 2021-07-01 20:44:23 · 457 阅读 · 0 评论 -
[Unity] “Entity Prefab” 管理
英文原文:https://coffeebraingames.wordpress.com/2020/07/19/entity-prefab-management/ 我目前正在制作一个2D建造者游戏的原型,作为一个副业项目。不过这次是用纯ECS制作的,或者至少是大部分。我想做一个和我们为《 Academia 》做的一样的原型,但要用纯ECS。我想,真的需要建立一个,这样我就可以弄清楚并创建我所选择的流派所需要的用DOTS建立的实用代码/框架。一路走来,我已经做了一些。其中一个是管理 “entity pre翻译 2021-06-30 23:09:24 · 622 阅读 · 0 评论 -
[Unity] IComponentData中可用的各种列表
Unity的ECS非常不同,如果你想利用Burst编译器的优势,它需要一个C#子集。这个子集被称为高性能C#(HPC#)。对于ECS的组件部分,只允许由 blittable 类型组成的结构。你不能有像类那样的引用类型。public struct Character : IComponentData { public string name; // 这是不允许的。字符串是一个类。} 这意味着您不能使用我们大多数Unity程序员熟悉的System.Collects中的容器。让我向您展示如何翻译 2021-06-30 22:28:19 · 1947 阅读 · 0 评论 -
[Unity]Blob Asset 的入门
Blob资产是Unity的DOTS中使用的一个概念。基本上,它是一种存储在非托管内存中的资产,可以在组件中访问。这里的 "资产 "并不是指传统意义上的资产,如预制件、纹理、3D模型、音频剪辑等。这个术语是指数据。它可以是简单的整数,也可以是复杂的结构数组,或者NativeHashMap形式的查找表。只允许非空类型,所以没有类和委托等引用类型。我们建议使用blob资产来保存不可变的数据…目前是这样。 一个明显的用法是存储一个静态值的数据库,它的引用可以被添加到一个组件中。(你不能在组件中存储普通的集合翻译 2021-06-30 20:17:31 · 923 阅读 · 0 评论 -
Unity ECS Manual [25]
Creating gameplay 本节包含了关于如何在Unity编辑器中创建基于DOTS的游戏和其他应用程序的信息。它还包括ECS提供的系统和组件,以帮助你实现游戏功能。这些系统包括:Unity.Transforms: 提供了定义世界空间变换的组件、三维物体层次结构和管理它们的系统。Unity.Hybrid.Renderer: 提供组件和系统以在Unity运行时渲染ECS实体。Gameplay supporting packages DOTS中的一些游戏功能需要额外的软件包来支持它们。翻译 2021-06-29 20:36:36 · 222 阅读 · 0 评论 -
Unity ECS Manual [24]
Generic jobs(泛型Job) 在普通的C#中,我们可以使用继承和接口来使一段代码与一系列的类型一起工作。比如说。 // The method is not limited to just one kind of // input but rather any type which implements IBlendable. void foo(IBlendable a) {...} 在HPC#中,我们不能使用托管类型或虚拟方法调用,所以泛型是我们使一段代码在一系翻译 2021-06-29 19:47:04 · 207 阅读 · 0 评论 -
Unity ECS Manual [23]
Job extensions(Job扩展) Unity C#作业系统让你在多线程上运行代码。该系统提供调度、并行处理和多线程安全。作业系统是Unity的一个核心模块,它提供了通用的接口和类来创建和运行作业(无论你是否使用ECS)。这些接口包括:IJob:创建一个作业,在任何线程或核心上运行,由作业系统调度器决定。IJobParallelFor: 创建一个可以在多个线程上并行运行的作业,以处理NativeContainer的元素。IJobExtensions:提供运行IJob的扩展方法翻译 2021-06-29 19:20:01 · 194 阅读 · 0 评论 -
Unity ECS Manual [22]
Version numbers(版本号)翻译 2021-06-29 19:15:54 · 159 阅读 · 0 评论 -
Unity ECS Manual [21]
Write groups(写入组) 一个常见的ECS模式是,一个系统读取一组输入组件并写入另一个组件作为其输出。然而,在某些情况下,你可能想覆盖一个系统的输出,并使用一个基于不同输入组的不同系统来更新输出组件。写入组提供了一个机制,让一个系统覆盖另一个系统,即使你不能改变另一个系统。 一个目标组件类型的写入组由ECS应用WriteGroup特性的所有其他组件类型组成,并以该目标组件类型为参数。作为一个系统创建者,你可以使用写组,这样你的系统的用户就可以排除你的系统在其他情况下选择和处理的实体。这种过翻译 2021-06-29 13:32:35 · 302 阅读 · 0 评论 -
Unity ECS Manual [20]
Sync points(同步点) 同步点(sync point)是程序执行中的一个点,它等待到目前为止已经安排好的所有作业完成。同步点限制了你在一段时期内使用作业系统中所有可用的工作线程的能力。因此,一般来说,你应该以避免同步点为目标。...翻译 2021-06-29 07:20:24 · 245 阅读 · 0 评论 -
Unity ECS Manual [19]
Entity Command Buffers EntityCommandBuffer(ECB)类解决了两个重要问题:当你在工作中时,你不能访问EntityManager。当你执行一个结构性变化(如创建一个实体)时,你会创建一个同步点,并且必须等待所有作业完成。 EntityCommandBuffer抽象允许你排队更改(来自Job或来自主线程),以便它们稍后可以在主线程上生效。Entity command buffer systems Entity command buffer syst翻译 2021-06-28 21:57:37 · 225 阅读 · 0 评论 -
Unity ECS Manual [18]
Looking up data(查阅数据) 访问和修改ECS数据的最有效方式是使用一个具有实体查询和作业的系统。这提供了对CPU资源的最佳利用,同时内存缓存失误最少。事实上,你的数据设计的目标之一应该是使用最有效、最快的路径来执行大部分的数据转换。然而,有时你需要在程序中的一个任意点访问一个任意实体的任意组件。 给定一个实体对象,你可以在其IComponentData和动态缓冲区中查找数据。方法不同,取决于你的代码是在系统中使用Entities.ForEach或使用[IJobChunk]作业执行,还翻译 2021-06-28 21:50:36 · 306 阅读 · 0 评论