当前位置: 首页 > news >正文

unity core-prefab

添加prefab:

添加一个组件到prefab,需要通过将组件对应的对象存在磁盘种后,再标记为prefab的一个部分。这部分在prefab.cpp中

 

prefab删除

prefab删除一个对象的方式是分两种情况,第一种就是这个对象再prefab中还存在则通过放到PrefabModification::RemovedComponents的移除对象池中,并设置prefab是脏的状态。在之后的状态下移除。另一种就是missing的情况下通过BaseObject的DestroySingleObject来移除。他是通过加锁后在另一个线程删掉object的。

 

BaseObject的删除过程。

 

存储:

当要保存prefab的时候会执行PrefabCreation.cpp的SavePrefab_Internal。首先他会寻找是否存在这个名字和路径下的prefab了,如果存在会先删掉。

 

然后分几种情况保存,一个是在assets中的,一个在实例化树中的,还有一种在失去关联的时候保存的。

 

然后创建id和meta

 

然后保存的时候分两种情况。

一种是在实例化树中保存的或者是失去关联关系的,这种情况下直接拷贝出副本来执行。

 

另一种是在assets里保存的,这种他要在PersistentManager::GetInstanceIDsAtPath中遍历所有文件

 

找到所有相关的prefab都设置一遍

 

然后让实例化出来的prefab执行awake并且刷新属性,

 

然后会对克隆出来的对象设置属性。

 

在InheritGameObjectAndTransformProperties设置属性,包括gameobject属性,component属性以及transform属性

 

然后在InheritMonoBehaviours中保存脚本数据

 

然后把克隆的数据写objectsToWrite中,

 

最后写object,实际就是序列化文件。

 

prefab的实例化:

在PrefabInstance.cpp中实现。实例化就相当于放在了场景中,这一步是需要拷贝源prefab的,在保存prefab的时候也会执行

 

将位置,大小,锚定点之类的拷贝一份到实例化文件。如果prefab源文件保存,这些实例化的文件需要重新awake,然后会更新数据。

 

Instance回滚:

instance还有回滚功能,在prefabInstance的RevertPrefabInstance实现,也就是在撤销的时候处理,先通过传进来的object转到prefabinstance来确定是否属于prefabinstance,通过GetObjectDataArrayFromPrefabRoot来收集哪些是已有的哪些是新增的,RevertInstantiatedAssetReferencesToParentObject回滚使用的material。

然后首先通过std::reverse逆转addObjects,然后对数据一个一个删除。最后通过RevertAllButDefaultPrefabOverrides来回滚rootTransform,rootRectTransform和rootGO。

 

如果是没链接上的则直接链接上的对象就可以了。他链接上的方法是找到源prefab,然后赋值一下prefab数据。

 

链接prefab:

在启动场景的时候,构建app的时候,保存场景的时候都会链接prefab,比如在启动场景时执行LoadSceneOperation::CompleteAwakeSequence(),在editor下会会执行UnpackAllPrefabInstances

 

到PrefabConnection.cpp里执行UnpackAllPrefabInstances,获取所有prefab的实例,并对每个进行解压,

 

如果这个prefab是属于kPrefabUnpackMode_OuterRoot,也就是解析外层的模式下则执行TransferModifiedPropertiesForUnpack,执行到TransferModifiedPropertiesFromNestedInstancesInAssetToNewInstancesForUnpack。这里主要对prefab被修改的部分修正。

 

然后kPrefabUnpackMode_OuterRoot模式执行TransferRemovedComponentsForUnpack,执行到TransferRemovedComponentsFromNestedInstancesInAssetToNewInstancesForUnpack,对需要移除的对象放到移除队列。

相关文章:

  • rollup常用插件详解
  • 基于Solidworks的三维光路结构示意图绘制实例演示-技术细节
  • Day726.Java平台模块系统 -Java8后最重要新特性
  • 虚机的部分磁盘空间被谁吃了?
  • leetcode88. 合并两个有序数组
  • 【python 】pygame制作简单的游戏移动操作
  • 软件流程和管理(五):Stakeholder Management Communication
  • JavaScript 案例一 --bind,call,apply
  • 计算机毕业设计django基于python金太阳家居电商平台(源码+系统+mysql数据库+Lw文档)
  • Crypto Pragmatist:5个值得关注的加密叙事
  • SpringBoot配置文件
  • 幸福心理与抗逆力培养的工控系统安全实验课程研究
  • springcloud搭建实战<十>【zuul网关】
  • 【推荐系统】推荐系统基础算法-基于协同的推荐算法
  • Https加密过程
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Angular 4.x 动态创建组件
  • JAVA多线程机制解析-volatilesynchronized
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • ReactNative开发常用的三方模块
  • Redis学习笔记 - pipline(流水线、管道)
  • Spark RDD学习: aggregate函数
  • 飞驰在Mesos的涡轮引擎上
  • 近期前端发展计划
  • 删除表内多余的重复数据
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 算法-图和图算法
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 正则表达式小结
  • 最简单的无缝轮播
  • AI算硅基生命吗,为什么?
  • ​业务双活的数据切换思路设计(下)
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (TOJ2804)Even? Odd?
  • (附源码)php投票系统 毕业设计 121500
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)UDP基本编程步骤
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET基础篇——反射的奥妙
  • .NET框架
  • .NET面试题(二)
  • .NET文档生成工具ADB使用图文教程
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [<MySQL优化总结>]
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [C#]winform部署yolov9的onnx模型
  • [C++]指针与结构体
  • [CSS]CSS 的背景