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,对需要移除的对象放到移除队列。
unity core-prefab相关推荐
- 认识Unity中Prefab
认识Unity中Prefab 目录 认识Unity中Prefab 一.Prefab是什么? 二.prefab创建 三.关于预制类型问题 Unity官网介绍Prefab Type:https://doc ...
- 第十六章 Unity 预制件prefab(上)
本章节我们介绍一下"预制件",也有人叫"预制体",也就是Prefab.在游戏世界中,那些自然环境的游戏对象,我们可以提前创建在场景中,这个大家能够理解.但是,有 ...
- Unity中 Prefab导出FBX
Unity 已经在Package Manager中集合了很多实用的插件,比如这里用到的FBX Exporter. 在Unity的菜单中Window ----> Package Manager,打 ...
- unity missing prefab , 场景全是紫色和透明色
简单说下这个问题,因为之前遇到费了好大功夫才解决掉,在网上查也没查到相关资料,所以纪录一下,希望能帮到遇到同样问题的朋友. 我的情况是因为前端资源移动了文件夹,路径变化,导致cacheserver上面 ...
- Unity预制件Prefab的概念,创建与加载(包括动态加载)
1 预制件定义 英文单词Prefab,含义就是预制件,比如板房就是用预制的铁板组合成的. 回到游戏中,也是类似的概念.一个3D场景中,如果有很多重复的东西,比如树木,草,箱子啥的,那就可以预制一个东西 ...
- 深入理解Unity的prefab和序列化过程
遇到一个好帖子,所以记下来: https://connect.unity.com/p/unityeditorzhi-tong-guo-serializedobjectlei-shi-xian-pi-l ...
- Unity 修改Prefab实例将Transform变为RectTransform
引用:Is there a way to destroy/replace a GameObject that is inside or part of a Prefab instance? Chang ...
- 第十七章 Unity 预制件prefab(下)
本章节我们来讲解如何编辑预制体文件.这里介绍三种打开编辑预制件的方式.第一就是通过预制件的实例游戏对象的Inspector检视面板上面的预制件"打开"按钮. 第二就是在Projec ...
- Unity预制件Prefab Day04
预制体简介:Prefab,预先准备好的物体,可以重复使用和利用.(一种资源类型,可以多次在场景进行实例) 管理预制体:在Assets中建立"Prefabs"文件夹,用于管理预制体. ...
- Unity的prefab
Prefab概念: Prefab是一种资源类型--存储在项目视图中的一种可反复使用的游戏对象.因而当游戏中须要非常多反复使用的对象.资源等时,Prefab就有了用武之地.它拥有下面特点: 能够放到多个 ...
最新文章
- 现金流量表整理及开发
- 即构科技邱国钦:遇到问题解决问题 慢慢点可以拟合成线
- 2016年10个重要的可视化发展
- android 开启子线程执行for循环_C++11之多线程 - Part2 Joining和Detaching的使用
- java赋值兼容原则,多态问题抛出(赋值兼容性原则遇上父类与子类同名函数的时候)...
- flush privileges提示Table 'mysql.servers' doesn't exist解决办法
- c# LINQ 使用
- 网站使用CDN有什么优势?
- 电动自行车16 CFR 1512标准要求及流程
- oracle 大于当天时间_ORACLE日期时间函数大全
- Centos6连接网络配置
- excel中以文本形式保存长数字
- 微信小程序修改制作生成头像——校庆头像制作小程序
- OA系统是什么意思?企业为什么要用OA办公系统软件?
- 照片调色系列教程(一):打造格调美女
- Android小Demo——绘制小机器人
- python斗地主出牌算法_python模拟斗地主发牌
- python自制小游戏_教你用Python自制拼图小游戏,一起来制作吧
- 断网的html页面,断网情况下,前端页面处理
- 第五章 黎明踏浪号 Facebook (一)