Unity DOTS系列之Filter Baking Output与Prefab In Baking核心分析

news2024/10/2 8:27:45

最近DOTS发布了正式的版本, 我们来分享一下DOTS里面Baking核心机制,方便大家上手学习掌握Unity DOTS开发。今天给大家分享的Baking机制中的Filter Baking OutputPrefab In Baking

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

Filter Baking Output 机制

在默认情况下,Baking会为每个GameObject生成的Entity与Component, 这些entity都会被创建到Conversion World里面。然后在创作的时候不是所有的GameObject都需要被转换成Entity。例如: 在一个样条曲线上,一个控制点在创作的时候被用到了,但是bake成ecs数据后可能就再也没有用了,所以不需要把这个控制点Bake成entity。

为了不把这个GameObject Bake产生的Entity输出到World并保存到entity scene里面,我们可以给这个Entity添加一个BakingOnlyEntity tag Component。当你添加了这个tag component后,Baking系统就不会把你这个entity存储到entity scene里面,也不会把这个entity生成到运行的main World里面。我们可以直接在Baker函数里面添给entity 添加一个BakingOnlyEntity的组件数据,也可以在Authoring GameObject里面添加一个 BakingOnlyEntityAuthoring的组件,这两种方式都可以达到同样的效果没有区别。

你也可以给组件添加注解[BakingType],[TemporaryBakingType] attributes过滤掉掉组件component,让它不输出到entity中。

[TemporaryBakingType]:被这个attributes注记的Component会在Baking Output的时候不会输出到entity。这个Component只会存活在Baker过程中,Baker结束以后就会销毁。

我们有时候需要在Baking System里面批量处理一些组件数据,处理完后这些组件就没有用了。例如,baker 把一个bounding box 转换成了ecs component 数据,接下来我们定义了一个Baking System批量处理所有的entity,来计算entity的凸包。计算完成后原来的bounding box组件就可以删除了,这种情况下就可以使用上面的Filter Component Bake output机制。

Prefab In Baking机制

生成entity prefab到entity scene以后,我们就可以像使用普通的Prefab创建GameObject一样来创建entity到世界。但是使用enity prefab之前一定要确保它已经被Baker到了entity scene。当预制体实例化到Authoring Scene中的时候,Baking把它当作普通的GameObject来进行转换,不会把它当作预制体。

生成一个entity prefab你需要注册一个Baker,在Bake函数里面添加一个依赖关系,让这个依赖于Authoring GameObject Prefab。然后Prefab将会被bake出来。我们搞一个组件保存了entity prefab的一个引用,那么unity就会把这个entity prefab 序列化到subscene中。当需要使用这个entity prefab的时候就能获取到。代码如下:

public struct EntityPrefabComponent : IComponentData
 {
 public Entity Value;
 }
 public class GetPrefabAuthoring : MonoBehaviour
 {
 public GameObject Prefab;
 }
 public class GetPrefabBaker : Baker<GetPrefabAuthoring>
 {
 public override void Bake(GetPrefabAuthoring authoring)
 {
 // Register the Prefab in the Baker
 var entityPrefab = GetEntity(authoring.Prefab, TransformUsageFlags.Dynamic);
 // Add the Entity reference to a component for instantiation later
 var entity = GetEntity(TransformUsageFlags.Dynamic);
 AddComponent(entity, new EntityPrefabComponent() {Value = entityPrefab});
 }
 }
    #endregion

在Baking的时候,当我们需要引用一个entity prefab, 可以使用EntityPrefabReference。这个会把它序列化到entity scene文件里面去。运行的时候直接load进来,就可以使用了。这样可以防止多个subscene不用重复拷贝生成同一个Prefab。

#region InstantiateLoadedPrefabs
 public partial struct InstantiatePrefabReferenceSystem : ISystem
 {
 public void OnStartRunning(ref SystemState state)
 {
 // Add the RequestEntityPrefabLoaded component to the Entities that have an
 // EntityPrefabReference but not yet have the PrefabLoadResult
 // (the PrefabLoadResult is added when the prefab is loaded)
 // Note: it might take a few frames for the prefab to be loaded
 var query = SystemAPI.QueryBuilder()
                .WithAll<EntityPrefabComponent>()
                .WithNone<PrefabLoadResult>().Build();
 state.EntityManager.AddComponent<RequestEntityPrefabLoaded>(query);
 }
 public void OnUpdate(ref SystemState state)
 {
 var ecb = new EntityCommandBuffer(Allocator.Temp);
 // For the Entities that have a PrefabLoadResult component (Unity has loaded
 // the prefabs) get the loaded prefab from PrefabLoadResult and instantiate it
 foreach (var (prefab, entity) in
 SystemAPI.Query<RefRO<PrefabLoadResult>>().WithEntityAccess())
 {
 var instance = ecb.Instantiate(prefab.ValueRO.PrefabRoot);
 // Remove both RequestEntityPrefabLoaded and PrefabLoadResult to prevent
 // the prefab being loaded and instantiated multiple times, respectively
 ecb.RemoveComponent<RequestEntityPrefabLoaded>(entity);
 ecb.RemoveComponent<PrefabLoadResult>(entity);
 }
 ecb.Playback(state.EntityManager);
 ecb.Dispose();
 }
 }
    #endregion
实例化entity prefab可以使用EntityManager与entity command buffer。
#region InstantiateEmbeddedPrefabs
 public partial struct InstantiatePrefabSystem : ISystem
 {
 public void OnUpdate(ref SystemState state)
 {
 var ecb = new EntityCommandBuffer(Allocator.Temp);
 // Get all Entities that have the component with the Entity reference
 foreach (var prefab in
 SystemAPI.Query<RefRO<EntityPrefabComponent>>())
 {
 // Instantiate the prefab Entity
 var instance = ecb.Instantiate(prefab.ValueRO.Value);
 // Note: the returned instance is only relevant when used in the ECB
 // as the entity is not created in the EntityManager until ECB.Playback
 ecb.AddComponent<ComponentA>(instance);
 }
 ecb.Playback(state.EntityManager);
 ecb.Dispose();
 }
 }
    #endregion
实例化EntityPrefabReference,可以使用如下代码:
 #region InstantiateLoadedPrefabs
 public partial struct InstantiatePrefabReferenceSystem : ISystem
 {
 public void OnStartRunning(ref SystemState state)
 {
 // Add the RequestEntityPrefabLoaded component to the Entities that have an
 // EntityPrefabReference but not yet have the PrefabLoadResult
 // (the PrefabLoadResult is added when the prefab is loaded)
 // Note: it might take a few frames for the prefab to be loaded
 var query = SystemAPI.QueryBuilder()
                .WithAll<EntityPrefabComponent>()
                .WithNone<PrefabLoadResult>().Build();
 state.EntityManager.AddComponent<RequestEntityPrefabLoaded>(query);
 }
 public void OnUpdate(ref SystemState state)
 {
 var ecb = new EntityCommandBuffer(Allocator.Temp);
 // For the Entities that have a PrefabLoadResult component (Unity has loaded
 // the prefabs) get the loaded prefab from PrefabLoadResult and instantiate it
 foreach (var (prefab, entity) in
 SystemAPI.Query<RefRO<PrefabLoadResult>>().WithEntityAccess())
 {
 var instance = ecb.Instantiate(prefab.ValueRO.PrefabRoot);
 // Remove both RequestEntityPrefabLoaded and PrefabLoadResult to prevent
 // the prefab being loaded and instantiated multiple times, respectively
 ecb.RemoveComponent<RequestEntityPrefabLoaded>(entity);
 ecb.RemoveComponent<PrefabLoadResult>(entity);
 }
 ecb.Playback(state.EntityManager);
 ecb.Dispose();
 }
 }
    #endregion

在实例化EntityPrefabReference之前,Unity必须要先加载对应的entity prefab,然后才能使用它,添加RequestEntityPrefabLoaded组件能确保entity prefab被加载。Unity会PrefabLoadResult加载到带有RequestEntityPrefabLoaded同一个entity上。

预制体也是entity,也可以被查询到,如果需要把一个预制体被查询到,可以在查询条件上添加IncludePrefab。

 #region PrefabsInQueries
 // This query will return all baked entities, including the prefab entities
 var prefabQuery = SystemAPI.QueryBuilder()
                .WithAll<BakedEntity>().WithOptions(EntityQueryOptions.IncludePrefab).Build();
#endregion
使用EntityManager与entity command buffer也可以销毁一个预制体节点,代码如下:
            #region DestroyPrefabs
 var ecb = new EntityCommandBuffer(Allocator.Temp);
 foreach (var (component, entity) in
 SystemAPI.Query<RefRO<RotationSpeed>>().WithEntityAccess())
 {
 if (component.ValueRO.RadiansPerSecond <= 0)
 {
 ecb.DestroyEntity(entity);
 }
 }
 ecb.Playback(state.EntityManager);
 ecb.Dispose();
            #endregion

今天的Baking 系列就分享到这里了,关注我学习更多的最新Unity DOTS开发技巧。

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

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

相关文章

优化单元测试效率:Spring 工程启动耗时统计

相关文章&#xff1a; Java Agent 的简单使用 本文相关代码地址&#xff1a;https://gitee.com/dongguabai/blog 单元测试在软件项目的可持续发展中扮演着不可或缺的角色&#xff0c;这一点毫无疑问。不久前&#xff0c;公司大佬在内部分享时也提到过&#xff1a;单元测试是…

“动捕设备+飞兔渲染软件”,激发数字人短视频营销新动力

随着短视频行业持续破发&#xff0c;短视频成为目前吸引流量最快的方式之一。同时&#xff0c;元宇宙催生众多虚拟主播、虚拟偶像、虚拟IP等&#xff0c;以数字人形象结合短视频形式&#xff0c;在社交平台上频频出圈。如虚拟美妆达人“柳夜熙”一条视频涨粉150w&#xff0c;但…

[卷积神经网络]FasterNet论文解析

一、概述 FasterNet是CVPR2023的文章&#xff0c;通过使用全新的部分卷积PConv&#xff0c;更高效的提取空间信息&#xff0c;同时削减冗余计算和内存访问&#xff0c;效果非常明显。相较于DWConv&#xff0c;PConv的速度更快且精度也非常高&#xff0c;识别精度基本等同于大型…

【计算机网络(1)】计算机网络体系结构1:计算机网络概述

文章目录 概念 & 功能 & 发展计算机网络的概念计算机网络的功能计算机网络的发展网络的本质 组成 & 分类计算机网络的组成计算机网络的分类 概念 & 功能 & 发展 计算机网络的概念 1. 网络 网一样的东西或网状系统。其中&#xff08;有线电视网络、电信网…

亲测解决no module named ‘PyQt5.QtCore‘

如果是在windows上遇到这个问题&#xff0c;升级一下VS Studio即可。 运行坏境和问题 Win10 Anaconda 解决方法 升級vs studio from 2022 preview to 2022。

springboot配置注入增强(四)使用框架实现自定义数据源和自定义属性解析

1.代码 框架代码已经上传到gitee中 代码链接&#xff1a;https://gitee.com/summer-cat001/config-enhance jar包&#xff1a;https://gitee.com/summer-cat001/config-enhance/tree/master/build/libs 2.使用方式 2.1 引入jar包 引入本地jar包或者把jar包上传到自己的ma…

年薪20w+,做测试的第4年,从手工测试到自动化测试每一步都是艰难的~

自己已经做了好几年的手工测试了&#xff0c;越来越觉得如果一直在手工测试的道路上前进&#xff0c;并不会有很大的发展&#xff0c;所以通过自己的努力&#xff0c;已经成功的转入自动化测试的方向&#xff0c;那么想快速的转入自动化方向&#xff0c;我们应该怎么做呢&#…

Linux的命令基本格式

因为对服务器来讲&#xff0c;图形界面会占用更多的系统资源&#xff0c;而且会安装更多的服务、开放更多的端口&#xff0c;这对服务器的稳定性和安全性都有负面影响。其实&#xff0c;服务器是一个连显示器都没有的家伙&#xff0c;要图形界面干十么&#xff1f;说到这里&…

python—openpyxl操作excel详解

前言 openpyxl属于第三方模块&#xff0c;在python中用来处理excel文件。 可以对excel进行的操作有&#xff1a;读写、修改、调整样式及插入图片等。 但只能用来处理【 .xlsx】 后缀的excel文件。 使用前需要先安装&#xff0c;安装方法&#xff1a; pip install openpyxl…

基于二维小波变换的散斑相位奇异构造算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 图(1)表示散斑原图像&#xff0c;(2)表示对(1)图像进行x轴方向的极化分析的小波相位图&#xff0c;呈周期的水平条纹&#xff0c;(3)表示对(1)图像…

大数据Doris(十二):扩容缩容

文章目录 扩容缩容 一、FE 扩容和缩容 1、增加 FE 节点 2、 删除 FE 节点

非接触式外径测量仪 光电在线检测

非接触式的检测方式可以在不损伤产品表面的情况下&#xff0c;进行高精度的检测&#xff0c;它能对一些高温、熔融等不易测量的轧材检测&#xff0c;适用面更广。光电非接触式的外径测量仪同样是非接触式的检测方式&#xff0c;完成了线缆电缆、橡胶、塑料等产品的高精度检测。…

YOLOv7改进:新颖的上下文解耦头TSCODE,即插即用,各个数据集下实现暴力涨点

💡💡💡本文属于原创独家改进:上下文解耦头TSCODE,进行深、浅层的特征融合,最后再分别输入到头部进行相应的解码输出,实现暴力暴力涨点 上下文解耦头TSCODE| 亲测在多个数据集实现暴力涨点,对遮挡场景、小目标场景提升也明显; 收录: YOLOv7高阶自研专栏介绍: …

✔ ★【备战实习(面经+项目+算法)】 10.22学习时间表(总计学习时间:4.5h)(算法刷题:7道)

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

rust学习——操作字符串、字符串转义、操作UTF8-字符串 (操作中文字符串)

文章目录 操作字符串追加 (Push)插入 (Insert)替换 (Replace)1、replace2、replacen3、replace_range 删除 (Delete)1、 pop —— 删除并返回字符串的最后一个字符2、 remove —— 删除并返回字符串中指定位置的字符3、truncate —— 删除字符串中从指定位置开始到结尾的全部字…

CentOS7单磁盘挂载一个目录

1、查看磁盘是否存在 fdisk -l 2、格式化磁盘 mkfs -t ext4 /dev/vdb 3、查看磁盘分区的UUID blkid /dev/vdb 4、创建挂载目录 mkdir -p /data 5、磁盘挂载 mount /dev/vdb /data 6、设置开机启动自动挂载 需要让系统开机自动挂载&#xff0c;需要将挂载信息写入到/etc/f…

安装PyCharm必看,手把手教你安装pycharm

目录 一&#xff0c;简介 二&#xff0c;安装包 一&#xff0c;简介 Jetbrains家族和Pycharm版本划分&#xff1a; pycharm是Jetbrains家族中的一个明星产品&#xff0c;Jetbrains开发了许多好用的编辑器&#xff0c;包括Java编辑器&#xff08;IntelliJ IDEA&#xff09;、…

超实用!你不得不知道的7款项目管理神器

大家好&#xff0c;我是老原。 一个项目无论大小&#xff0c;都需要一款高效且实用的项目管理工具&#xff0c;对项目流程进行把控、及时共享工作文档&#xff0c;从而让工作变得更有效率。 大家在网上搜到的就有很多&#xff0c;譬如project、禅道、甘特图等这些都是使用率超…

“深入探讨Java JUC中的ReentrantLock锁:实现多线程同步与并发控制“

简介 1、从Java5开始&#xff0c;Java提供了一种功能更强大的线程同步机制——通过显式定义同步锁对象来实现同步&#xff0c;在这种机制下&#xff0c;同步锁由Lock对象充当。 2、Lock 提供了比synchronized方法和synchronized代码块更广泛的锁定操作&#xff0c;Lock允许实…

YOLOv8优化:独家创新(Partial_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(Partial_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 Partial_C_Detect | 亲测在多个数据集能够实现大幅涨点 💡💡💡Yolov8魔术师,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提…