【UnityDOTS 六】预制实例化成Entity

news2024/11/23 16:37:13

预制实例化成Entity


前言

从Authoring模式中,如何通过预制件来实例化一个对应的Entity对象到DOTS系统中。

一、Authoring模式与Runtime模式

Authoring创作模式:即我们熟悉的方便操作的创建预制的模式
Runtime模式:运行模式,即在运行时,在subScene中对应的Entity模式
点击右上角可以更改模式。
在这里插入图片描述
可以方便的查看对应Entity的相关信息:比如它由哪些Component组成,对应的Aspect,以及关联的System。

在这里插入图片描述

二、转换一个SubScene中的GameObject

1.自动转

在Scene中创建一个subScene。
将一个预制,或者GameObject放到这个subScene中,则Unity内置的脚本会被自动转换为对应的Component。注意有一些组件比如渲染相关的,需要运行起来才能看到对应的Component。

2.自定义组件的转换

部分自定义的组件,需要我们利用DOTS提供的接口,来转换成对应的Component附加到Entity中去。
如官网提供的实例:

     public class MyAuthoring : MonoBehaviour
     {
         public int Value;
     }

     public struct MyComponent : IComponentData
     {
         public int Value;
         public float3 Position;
     }

     public class MyBaker : Baker<MyAuthoring>
     {
         public override void Bake(MyAuthoring authoring)
         {
             // Accessing the transform using Baker function, not the GameObject one
             // so the this baker can keep track of the dependency
             var transform = GetComponent<Transform>();
             var entity = GetEntity(TransformUsageFlags.Dynamic);
             AddComponent(entity, new MyComponent
             {
                 Value = authoring.Value,
                 Position = transform.position
             } );
         }
     }

利用Baker转换对应的Component到对应的Entity中。
具体步骤:

  • 定义一个自己想要添加到Entity身上的Component结构
  • 在想要挂载这个Component的Entity对应的GameObject身上挂载一个MonoBehaviour脚本,脚本的内容就是你想要转换为对应Component的内容。
  • 声明一个继承于Backer的类,泛型参数为你想要转换的MonoBehaviour脚本类
  • 在对应的Bake函数中,利用Baker类中的结构,GetEntity获取对应的Entity。
  • new 一个你想要添加到这个Entity上的Component结构,然后通过AddComponent给获取到的Entity添加上对应的组件
  • 给这个Component实例的变量进行赋值。

这样就实现了把一个MonoBehaviour脚本中的数据,转成Component添加到对应的Entity上了

3.预制体的转换

上面写的都是放到subScene来转换entity实例,下面说说如何将预制体转换为对应的Entity实例。

1.首先挂载一个GameObject到SubScene中,挂载一个MonoBehaviour脚本,MonoBehaviour脚本中定义一个Public的GameObject变量暴露给Inspect使用,然后通过将一个预制移动到Inspector的MonoBehaviour脚本上的对应GameObject变量上。这一点与以前实例化GameObject差不多。
2.写一个MonoBehaviour脚本对应的Baker类,然后通过GetEntity(GameObject, TransformUsageFlags)接口获取到挂载到MonoBehaviour身上对应的预制的Entity。
3.这个预制也会被转换成一个subScene中的Entity,所以也可以通过GetEntity获取到这个Entity。

以上就是常规的预制转换成Entity的流程,接下来要利用EntityManager.Instantiate接口来实例化更多相同的Entity。

4.将上面的预制Entity存到某个Component中用于实例化。
5.通过SystemAPI.GetSingleton获取上面单例Component,然后CollectionHelper.CreateNativeArray接口申请对应数量的Entity容器。
6.调用state.EntityManager.Instantiate,传入Component中缓存的Entity,以及申请好的NativeArray<Entity>容器变量,NativeArray<Entity>变量会填充好实例化后的所有Enitity。
7. 再针对这些Entity进行自己想要的操作,比如添加对应的Component,或者修改预制Prefab中通过Bake添加的Component的属性值等。
8. dispose掉临时的NativeArray<Entity>容器变量

总结

只要添加到SubScene中的预制都会经过Bake,转换成对应的Entity,包括用Public GameObject方式链接的,也包括嵌套链接的。最好是通过在这里插入图片描述来查看非运行状态下Runtime模式中的Entity,就可以知道SubScene中有多少嵌套的预制被转换。

每个预制都可以通过bake这个流程进行任意转换自定义Component,同时也可以将对应的Entity缓存到Component中,然后通过.EntityManager.Instantiate来批量实例化Entity,这个有点像以前实例化预制的接口,不同的是需要提前申请对应的Entity的NativeArrary空间来存放实例化的Entity,最后可以通过填充好的NativeArrary的Entity数组来遍历进行一些额外操作。

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

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

相关文章

Three.js教程:网格模型

推荐&#xff1a;将 NSDT场景编辑器 加到你的3D工具链 工具集&#xff1a; NSDT简石数字孪生 网格模型(三角形概念) 本节课给大家演示网格模型Mesh渲染自定义几何体BufferGeometry的顶点坐标,通过这样一个例子帮助大家建立**三角形(面)**的概念 三角形(面) 网格模型Mesh其实…

Spring Boot 中的 XA 事务

Spring Boot 中的 XA 事务 在现代化的应用程序开发中&#xff0c;事务管理是一个重要的话题。事务管理可以确保数据的一致性和完整性&#xff0c;同时也可以避免数据丢失和冲突等问题。在分布式环境中&#xff0c;XA 事务是一种常用的事务管理方式。在本文中&#xff0c;我们将…

基于麦克风阵列模块I2s6路slot数字音频信号的ADSP/STM32F4处理

hezkz17进数字音频系统研究开发交流答疑 1麦克风阵列 2 ADAU1452 DSP 输入接口 3 PCM数据算法处理

uni-app获取节点的相关信息

获取单个节点&#xff1a; selectorQuery.select(selector) 在当前页面下选择第一个匹配选择器 selector 的节点&#xff0c;返回一个 NodesRef 对象实例&#xff0c;可以用于获取节点信息。 selector 说明&#xff1a; selector 类似于 CSS 的选择器&#xff0c;但仅支持下列…

Jenkins 参数化构建

目录 前言&#xff1a; 以下是Jenkins官方的介绍&#xff1a; 首先新建一个自由风格的job&#xff0c;然后勾选“This project is parameterized”&#xff0c;如下图&#xff1a; 勾选参数构建 choice parameterized&#xff1a; 选项&#xff1a; 使用参数&#xff1a;…

linux驱动struct file_operations`中设置`owner`成员变量。

在Linux内核中&#xff0c;struct file_operations结构体是用来定义一个文件操作的集合。该结构体中包含了一组函数指针&#xff0c;这些函数指针指向了与文件操作相关的函数&#xff0c;例如文件的打开、关闭、读写、定位等操作。同时&#xff0c;该结构体中还包含了一些元数据…

Opencv项目实战:00 专栏内容介绍

目录 Opencv项目实战专栏介绍&#xff1a; 01 文字检测OCR 02 角度探测器 03 扫描二维码&条形码 04 全景图片拼接 05 物体检测 06 文档扫描仪 07 人脸识别和考勤系统 08 Yolov3更高精度的检测物体 09 物体尺寸测量 10 面部特征提取及添加滤镜 11 使用Opencv高亮…

接近完美的监控系统—普罗米修斯

内容 隐藏 1.怎么采集监控数据&#xff1f; 2.采集的数据结构与指标类型 2.1 数据结构 2.2 指标类型 3.实例概念 4.数据可视化 5.应用前景 普罗米修斯(Prometheus)是一个SoundCloud公司开源的监控和告警系统。当年&#xff0c;由于SoundCloud公司生产了太多的服务&#…

ant vue 自定义首页菜单实现

如图,我把 views/dataScreening/DataScreening 页面,设置成首页,登录以后自动跳转到这个页面 实现代码: 文件:/src/config/router.config.js import { UserLayout, TabLayout, RouteView, BlankLayout, PageView } from @/components/layouts/*** 走菜单,走权限控制* @t…

【深度学习】AIGC ,ControlNet 论文,原理,训练,部署,实战,教程

论文&#xff1a;https://arxiv.53yu.com/pdf/2302.05543 代码&#xff1a;https://github.com/lllyasviel/ControlNet 得分几个博客完成这个事情的记录了&#xff0c;此篇是第一篇&#xff0c;摘录了一些论文内容。ControlNet 的原理极为朴实无华&#xff08;对每个block添加…

c++ connect函数连接失败

bool Connect() {//初始化网络WSADATA wsadata;WSAStartup(MAKEWORD(2, 2), &wsadata);if (0 ! WSAStartup(MAKEWORD(2, 2), &wsadata))return false;if (LOBYTE(wsadata.wVersion) ! 2 ||HIBYTE(wsadata.wVersion) ! 2) {printf("请求协议版本失败!\n");ret…

Ghatgpt正式登录苹果手机应用商城,并支持Siri和快捷指令

根据最新信息&#xff0c;OpenAI 发布的 ChatGPT 官方 iOS 应用程序迎来了重大更新。该应用程序已经在上个月登陆了美国、英国、法国、德国和韩国等 App Store&#xff0c;并且成为该市场上最受欢迎的免费应用程序。 作为生产力类应用的领导者&#xff0c;该应用程序完全免费&a…

MYSQL执行一条SELECT语句的具体流程

昨天CSDN突然抽风 我一个ctrlz把整篇文章给撤掉了还不能复原 直接心态崩了不想写了 不过这部分果然还是很重要,还是写出来吧 流程图 这里面总共有两层结构Server层 储存引擎 Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包…

PF-Net点云补全解读

论文链接&#xff1a;https://arxiv.org/pdf/2003.00410.pdfhttps://arxiv.org/pdf/2003.00410.pdf PF-Net是一个点云补全模型&#xff0c;整体网络为生成对抗网络&#xff08;Gan&#xff09;构成&#xff0c;G网络负责生成缺失的数据&#xff0c;D网络负责鉴别G网络生…

为什么Unity使用AssetBundle热更的时候要剔除掉.mainfest文件

1&#xff09;为什么Unity使用AssetBundle热更的时候要剔除掉.mainfest文件 ​2&#xff09;Addressable热更&#xff0c;断点续传问题 3&#xff09;在线性空间&#xff0c;使用后处理解决UI混合问题 这是第341篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&am…

计算机毕业论文内容参考|基于Python的手机订餐系统的设计与实现

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势3课题内容相关技术与方法介绍系统分析系统设计系统实现系统测试总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于Python的手机订餐系统的设计与实现 摘要 本文基于Python语言,设计并实现了一个手机订餐…

我的毕业故事

前言 2023年6月25日&#xff0c;在拿到双证(毕业证书/学士学位证书)之后&#xff0c;我正式毕业&#xff0c;结束了本科学习阶段。 由于毕业设计中了盲审&#xff0c;因此在大致顺利的过程中平添了不少故事&#xff0c;这里就对近两个月做一个回顾。 盲审 首先解释一下什么…

MySQL之binlog、redolog、undolog

1.binlog是 mysql server 层的一种二进制日志&#xff0c;用来记录数据库的写入操作&#xff0c;并以"事务"的形式保存在磁盘上&#xff0c;主要的使用场景有主从复制和数据恢复。 2.redo log &#xff08;重做日志&#xff09;是InnoDB存储引擎产生的&#xff0c;记…

day30-Oracle函数

Oracle函数 1.oracle字符函数 1.1 拼接函数concat 1.2 首字母转大写initcap 1.3 lower转小写&#xff1b;upper转大写 1.4 trim去除首尾空格 1.5 substr截取字符串3,4,3代表从第三个字符开始&#xff0c;4代表共截取4个字符 1.6 replace替换字符串 2.oracl…

局部均方差滤波(磨皮)

note 锚点灰度值 用 原图像对应点的原灰度值 和 局部均值加权得到 局部均值 由 掩膜 区域计算得到 权重 由 局部方差 与用户输入参数计算确定 code // 局部均方差滤波 /*\brief 局部均方差滤波\param src:原矩阵&#xff0c;单通道\param res:结果矩阵\param size:掩膜矩形…