添加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相关推荐

  1. 认识Unity中Prefab

    认识Unity中Prefab 目录 认识Unity中Prefab 一.Prefab是什么? 二.prefab创建 三.关于预制类型问题 Unity官网介绍Prefab Type:https://doc ...

  2. 第十六章 Unity 预制件prefab(上)

    本章节我们介绍一下"预制件",也有人叫"预制体",也就是Prefab.在游戏世界中,那些自然环境的游戏对象,我们可以提前创建在场景中,这个大家能够理解.但是,有 ...

  3. Unity中 Prefab导出FBX

    Unity 已经在Package Manager中集合了很多实用的插件,比如这里用到的FBX Exporter. 在Unity的菜单中Window ----> Package Manager,打 ...

  4. unity missing prefab , 场景全是紫色和透明色

    简单说下这个问题,因为之前遇到费了好大功夫才解决掉,在网上查也没查到相关资料,所以纪录一下,希望能帮到遇到同样问题的朋友. 我的情况是因为前端资源移动了文件夹,路径变化,导致cacheserver上面 ...

  5. Unity预制件Prefab的概念,创建与加载(包括动态加载)

    1 预制件定义 英文单词Prefab,含义就是预制件,比如板房就是用预制的铁板组合成的. 回到游戏中,也是类似的概念.一个3D场景中,如果有很多重复的东西,比如树木,草,箱子啥的,那就可以预制一个东西 ...

  6. 深入理解Unity的prefab和序列化过程

    遇到一个好帖子,所以记下来: https://connect.unity.com/p/unityeditorzhi-tong-guo-serializedobjectlei-shi-xian-pi-l ...

  7. Unity 修改Prefab实例将Transform变为RectTransform

    引用:Is there a way to destroy/replace a GameObject that is inside or part of a Prefab instance? Chang ...

  8. 第十七章 Unity 预制件prefab(下)

    本章节我们来讲解如何编辑预制体文件.这里介绍三种打开编辑预制件的方式.第一就是通过预制件的实例游戏对象的Inspector检视面板上面的预制件"打开"按钮. 第二就是在Projec ...

  9. Unity预制件Prefab Day04

    预制体简介:Prefab,预先准备好的物体,可以重复使用和利用.(一种资源类型,可以多次在场景进行实例) 管理预制体:在Assets中建立"Prefabs"文件夹,用于管理预制体. ...

  10. Unity的prefab

    Prefab概念: Prefab是一种资源类型--存储在项目视图中的一种可反复使用的游戏对象.因而当游戏中须要非常多反复使用的对象.资源等时,Prefab就有了用武之地.它拥有下面特点: 能够放到多个 ...

最新文章

  1. 现金流量表整理及开发
  2. 即构科技邱国钦:遇到问题解决问题 慢慢点可以拟合成线
  3. 2016年10个重要的可视化发展
  4. android 开启子线程执行for循环_C++11之多线程 - Part2 Joining和Detaching的使用
  5. java赋值兼容原则,多态问题抛出(赋值兼容性原则遇上父类与子类同名函数的时候)...
  6. flush privileges提示Table 'mysql.servers' doesn't exist解决办法
  7. c# LINQ 使用
  8. 网站使用CDN有什么优势?
  9. 电动自行车16 CFR 1512标准要求及流程
  10. oracle 大于当天时间_ORACLE日期时间函数大全
  11. Centos6连接网络配置
  12. excel中以文本形式保存长数字
  13. 微信小程序修改制作生成头像——校庆头像制作小程序
  14. OA系统是什么意思?企业为什么要用OA办公系统软件?
  15. 照片调色系列教程(一):打造格调美女
  16. Android小Demo——绘制小机器人
  17. python斗地主出牌算法_python模拟斗地主发牌
  18. python自制小游戏_教你用Python自制拼图小游戏,一起来制作吧
  19. 断网的html页面,断网情况下,前端页面处理
  20. 第五章 黎明踏浪号 Facebook (一)

热门文章

  1. 数据可视化图表ECharts视频教程
  2. Swift3.0通过闭包回调传递参数 / @escaping
  3. mysql——多表操作
  4. 服务器系统 主板支持,服务器主板支持
  5. 为什么00后不把工作当饭碗,却在背后偷偷努力?
  6. 51单片机入门教程(3)——数码管显示
  7. SAP 原因代码的两种配置优缺点
  8. strongswan编译、配置
  9. 【米思米机械设备知识分享】- 游标卡尺使用方法介绍
  10. 浅谈淘宝搜索排序算法【转自淘宝搜索博客】