首页 > 其他分享 >Unity 最新DOTS系列之《Baking与Baker的详解》

Unity 最新DOTS系列之《Baking与Baker的详解》

时间:2023-12-01 10:12:14浏览次数:28  
标签:DOTS Baking Baker entity Unity Authoring

Unity DOTS Baking与Baker详解

Unity DOTS Baking与Baker详解

最近DOTS终于发布了正式的版本, 我们来分享一下DOTS里面Baking 与Baker的关键概念,方便大家上手学习掌握Unity DOTS开发。

Unity DOTS开发模式,为了让大家在”创作”游戏的时候使用原来组件方式来编辑游戏场景与资源,同时Unity提供了一种Baking机制,把普通的GameObject数据转成ecs模式下的entity数据,程序运行的时候,直接加载转换好的ECS模式的数据。在深入了解Baking与Baker机制之前,我们先熟悉几个概念:

Authoring: 英文单词是”创作”的意思,上文提到ECS模式开发的时候创作游戏节点可以使用原来的方式,再通过baking转换。所以那些待转换成ecs 模式的GameObject与Component被称为Aurthoring。

Baking: 指的是把传统GameObject+组件数据转成ecs模式下所需要的数据的过程;

Baker: 指的是某种Authoring转ECS模式的具体执行者与执行逻辑;

有了这些概念以后,接下来我们来详细地分析Unity DOTS的Baking与Baker。

Unity DOTS Baking 机制核心剖析

Authoring Data: 当你在编辑你的游戏项目应用的时候,像传统的脚本,资源,以及其它的一些游戏数据的依赖,这种编辑方式非常灵活,方便用户查看,与使用。这些编辑的数据,我们叫做Authoring data。

Runtime Data 是ECS模式运行的时候需要的数据,当你运行程序时,作为游戏数据来进行处理。这种模式的数据有高效的性能与高效的存储。它是为计算机运行处理而设计,换句话说对开发者的直观性,没有传统的GameObject模式那么友好。

开发者需要在Unity里面把Authoring Scene作为SubScene加载进来,当编辑Authoring场景中的Authoring 物体时,Baking过程会被触发,并在后台完成。

Baking有两种模式:

Full Baking(全局Baking): 对Authoring Scene里面的所有物体做Baking操作;

Incremental Baking(增量Baking): 只对变化了的物体进行Baking操作;

1:烘培好的ECS模型下的 entity场景数据不在磁盘上,就会发生Full Baking;

2:Authoring Scene的内容被修改,同时烘焙好的entity scene数据(Runtime Data)过期;

3:如果baking code 在编译Baker代码后发现包含了一个 [BakingVersion] 的attribute (特性), 这个意味着 bake代码被改变了,entity scene 过期了,就会引发full baking;

7:你在编辑器的 Preferences (偏好设置)清理了baking cache,会到导致full baking;

Full Baking会输出一些文件到存储到硬盘上,当编辑器运行程序会加载这些文件。

当使用subscene机制, 加载一个"创作场景"的时候,同时也初始化了 incremental baking。当在场景中执行一个incremental baking 的过程时,意味着当你编辑一个 "创作创景"的时候,可以直接访问和使用你的baking的结果。它只针对变化的数据与组件进行Bake。

Unity DOTS Baker 机制核心剖析

每个组件数据的Baker还需要向系统来注册它执行时候的依赖关系,这样当它依赖的数据发生变化的时候,才会触发这个组件的Baker调用。默认情况下一个Baker只能访问一个 authoring component,但是有时候仍然需要从其它的组件, GameObjects 或者各种各样的资源, 所以整个baking 处理需要知道这些依赖关系,如果其它的这些对象改变了,那么这个baker也需要重新执行。例如,如果是一个 authoring GameObject 是一个cube, Unity在bake的时候,就会把这个entity 渲染成一个cube,如果这个authoring GameObject 随后被修改成了一个 球体, 那么 ECS也必须要相通地做出改变,要把这个entity渲染成球体,这个就意味着unity要删除以前早期的Cube Entity, 并创建一个新的球的entity,或者改变entity让他显示一个球体。又比如 一个GameObject 有一个材质, 依赖一个 scriptable object。Baker需要定义一个资源依赖,这样才能确保资源 scriptable object被改变的时候,这个object 会被重新Baker。整个过程全部都是自动发生的,我们普通开发者可以不用管。

最后给大家展示一个普通MonoBehaviour Component的Baker,代码如下:

ECS Component:

publicstructDependentData:IComponentData

{

publicfloatDistance;

publicintVertexCount;

}

Authoring Component:

publicclassDependentDataAuthoring:MonoBehaviour

{

publicGameObjectOther;

publicMeshMesh;

}

定义从Authoring Compongt到ECS Component的Baker:

publicclassGetComponentBaker:Baker<DependentDataAuthoring>

{

// Bake的时候调用Bake函数

publicoverridevoidBake(DependentDataAuthoringauthoring)

{

// 声明所需要Baker的依赖关系

DependsOn(authoring.Other);

DependsOn(authoring.Mesh);

if(authoring.Other == null)return;

if(authoring.Mesh == null)return;

vartransform = GetComponent<Transform>();

vartransformOther = GetComponent<Transform>(authoring.Other);

if(transform == null)return;

if(transformOther == null)return;

varentity = GetEntity(TransformUsageFlags.Dynamic);

AddComponent(entity,newDependentData

{

Distance = Vector3.Distance(transform.position,transformOther.position),

VertexCount = authoring.Mesh.vertexCount

});

}

}

今天分享到这里,关注我们,学习更多的最新Unity DOTS 进阶与实战相关的知识.

尊敬的准VIP客户:

我们Unity DOTS课程也正式发布了,我们课程经过9年多的更新与迭代,已经涵盖了Unity 开发中遇到的绝大部分问题,涵盖了Unity主程序进阶,升职加薪所需要的系统的知识体系,主流游戏类型的重点难点技术解决方案。我们的老师10:00~23:00提供实时解答与回复,包含但不限于客户端+服务端。相信我们提供的游戏开发技术服务能很好地帮助到您。选择我们的VIP课程,您肯定不会后悔!

 

关注我!

博毅创为游戏圈技术进阶,升职加薪

标签:DOTS,Baking,Baker,entity,Unity,Authoring
From: https://www.cnblogs.com/bycw/p/17869104.html

相关文章

  • Unity DOTS Component概述
    最近DOTS终于发布了正式的版本,我们来分享以下DOTS里面地几个关键概念,方便大家上手学习掌握UnityDOTS开发。UnityDOTS中Entity作为实体不直接去存放数据,而是将数据以一个个的组件为载体来存放起来。每个Entity会得到一些不同的ComponentData的组合,这些组合代表着不同的Entity......
  • Unity DOTS World Entity ArchType Component EntityManager System概述
    最近DOTS终于发布了正式的版本,我们来分享以下DOTS里面地几个关键概念,方便大家上手学习掌握UnityDOTS开发。UnityDOTS中所有的Entities都是被放到World世界中。每个Entity在它所在的World里面有唯一不同的ID号来区分。DOTS项目中可以同时有多个World。每个World有一个Entity......
  • Unity DOTS系列之System中如何使用SystemAPI.Query迭代数据
    最近DOTS发布了正式的版本,我们来分享一下System中如何基于SystemAPI.Query来迭代World中的数据,方便大家上手学习掌握UnityDOTS开发。SystemAPI.Query的使用System有两种,一种是Unmanaged的ISystem,一种是managed的SystemBase,这两种System都可以通过SystemAPI.Query来迭代与......
  • Unity DOTS中ECS核心架构详解
    最近DOTS终于发布了正式的版本, 我们来分享一下DOTS中ECS的几个关键概念与结构,方便大家上手学习掌握Unity DOTS开发。 ECS中的World  Unity DOTS ECS架构中所有的Entity都是被放到了World对象里面,每个Entity在World里面都有唯一的Id号。Unity DOTS 可以同时支持很多个......
  • Unity ECS最新DOTS环境搭建教程
    最近DOTS终于发布了正式的版本, 今天我们来基于Unity2023.1.6来搭建DOTS1.0.16的开发环境与注意事项。 1获取DOTS的在线文档   UnityDOTS的权威资料比较少,我们主要的都是基于DOTS的官方文档来进行学习和使用。UnityDOTS的官方文档的下载地址:https://docs.unity3d.c......
  • Unity DOTS系列之Struct Change核心机制分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面StructChange机制,方便大家上手学习掌握UnityDOTS开发。基于ArchType与Chunk的Entity管理机制  我们回顾以下ECS的内存管理核心机制,基于ArchType+Chunk的Entity管理模式。每个Entity不直接存放数据,数据全部存放到Component......
  • Unity DOTS系列之Aspect核心机制分析
      最近DOTS发布了正式的版本,我们来分享一下DOTS里面Aspect机制,方便大家上手学习掌握UnityDOTS开发。Aspect 机制概述当我们使用ECS开发的时候,编写某个功能可能需要某个entity的一些组件,如果我们一个个组件的查询出来,可能参数会写很长。如果我们编写某个功能的时候,需要enti......
  • Unity DOTS系列之BlobAsset核心机制分析
     最近DOTS发布了正式的版本,我们来分享一下DOTS里面BlobAsset机制,方便大家上手学习掌握UnityDOTS开发。BlobAsset概叙DOTS提供了BlobAsset机制来把数据生成高效的二进制数据。BlobAsset的数据是不可变的。BlobAsset只支持非托管类型数据。支持Burst编译器编译出来的类型。同......
  • Unity DOTS系列之Filter Baking Output与Prefab In Baking核心分析
     最近DOTS发布了正式的版本,我们来分享一下DOTS里面Baking核心机制,方便大家上手学习掌握UnityDOTS开发。今天给大家分享的Baking机制中的FilterBakingOutput与PrefabInBaking。FilterBakingOutput机制在默认情况下,Baking会为每个GameObject生成的Entity与Component,......
  • Unity DOTS系列之Filter Baking Output与Prefab In Baking核心分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面Baking核心机制,方便大家上手学习掌握UnityDOTS开发。今天给大家分享的Baking机制中的FilterBakingOutput与PrefabInBaking。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发......