什么网站做adsense好,做网站必须要文网文吗,php企业网站模板,wordpress 特效Unity DOTS Baking与Baker详解
最近DOTS终于发布了正式的版本, 我们来分享一下DOTS里面Baking 与Baker的关键概念#xff0c;方便大家上手学习掌握Unity DOTS开发。
对惹#xff0c;这里有一个游戏开发交流小组#xff0c;希望大家可以点击进来一起交流一下开发经验呀方便大家上手学习掌握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:BakerDependentDataAuthoring
{
// Bake的时候调用Bake函数
publicoverridevoidBake(DependentDataAuthoringauthoring)
{
// 声明所需要Baker的依赖关系
DependsOn(authoring.Other);
DependsOn(authoring.Mesh);
if(authoring.Other null)return;
if(authoring.Mesh null)return;
vartransform GetComponentTransform();
vartransformOther GetComponentTransform(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课程,您肯定不会后悔! 关注我 博毅创为游戏圈技术进阶升职加薪