unity core-prefab

这篇具有很好参考价值的文章主要介绍了unity core-prefab。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

添加prefab:

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

unity core-prefab

 

prefab删除

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

unity core-prefab

 

BaseObject的删除过程。

unity core-prefab

 

存储:

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

unity core-prefab

 

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

unity core-prefab

 

然后创建id和meta

unity core-prefab

 

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

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

unity core-prefab

 

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

unity core-prefab

 

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

unity core-prefab

 

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

unity core-prefab

 

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

unity core-prefab

 

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

unity core-prefab

 

然后在InheritMonoBehaviours中保存脚本数据

unity core-prefab

 

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

unity core-prefab

 

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

unity core-prefab

 

prefab的实例化:

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

unity core-prefab

 

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

unity core-prefab

 

Instance回滚:

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

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

unity core-prefab

 

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

unity core-prefab

 

链接prefab:

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

unity core-prefab

 

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

unity core-prefab

 

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

unity core-prefab

 

然后kPrefabUnpackMode_OuterRoot模式执行TransferRemovedComponentsForUnpack,执行到TransferRemovedComponentsFromNestedInstancesInAssetToNewInstancesForUnpack,对需要移除的对象放到移除队列。文章来源地址https://www.toymoban.com/news/detail-419041.html

到了这里,关于unity core-prefab的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity中 Prefab导出FBX

    Unity 已经在Package Manager中集合了很多实用的插件,比如这里用到的FBX Exporter. 在Unity的菜单中Window ---- Package Manager,打开包管理界面 点击设置如图下面的Advanced ... 选择该选项 在Advanced Settings 中勾上Enable Preview Package 选择   关掉窗口 选择包类型 下面的 Unity Registry 然后找到FBX

    2024年02月11日
    浏览(48)
  • 【Unity】 预制体Prefab使用说明

    在 Unity 中,Prefab 是一个可以预先制作并重复使用的 GameObject 或组件集合,Prefab 中的 GameObject 可以有子对象和其他组件。与场景中直接创建 GameObject 不同,Prefab 可以在多个场景或项目中重复使用,并且可以轻松地进行修改和更新。Prefab 可以节省开发时间,并 提高游戏的可维

    2024年02月16日
    浏览(56)
  • 第十七章 Unity 预制件prefab(下)

    本章节我们来讲解如何编辑预制体文件。这里介绍三种打开编辑预制件的方式。第一就是通过预制件的实例游戏对象的Inspector检视面板上面的预制件“打开”按钮。 第二就是在Project工程面板中选中预制件文件(Cube.prefab),然后在Inspector检视面板中点击“打开预制件”。 第

    2024年02月04日
    浏览(30)
  • Unity 之预制体(Prefab)的解释以及用法

    Unity中的预制体(Prefab)是一种重要的资源类型,用于创建和管理游戏对象(GameObject)。预制体是一种可重用的模板,可以在游戏场景中多次实例化,使开发人员能够更轻松地创建和管理大量相似的对象。以下是有关Unity预制体的详细介绍,包括其作用和用法: 作用: 重用性

    2024年02月09日
    浏览(41)
  • 第十六章 Unity 预制件prefab(上)

    本章节我们介绍一下“预制件”,也有人叫“预制体”,也就是Prefab。在游戏世界中,那些自然环境的游戏对象,我们可以提前创建在场景中,这个大家能够理解。但是,有些游戏对象,需要根据游戏逻辑来通过代码生成,例如刷新怪物,触发机关等等。Unity 的预制件系统允许

    2024年02月08日
    浏览(57)
  • Unity AssetBundle批量打包、加载(场景、Prefab)完整流程

    1、文章介绍 2、具体思路和写法         (1)AB包的打包         (2)AB包的加载         (3)AB包卸载 3、结语 本篇博客主要起记录和学习作用,简单的介绍一下AB包批量的打包和加载AB包的方式,若各位同学有幸看到本篇博客,希望能够对你有所帮助。 (1)

    2024年02月04日
    浏览(43)
  • Unity 编辑器-查找所有未被使用的Prefab

    需求 接到一个需求,将Res里所有特效相关的prefab检查一下,没有使用的移除。 分析 先拆解一下需求,如下 代码 结果 结果如图所示。每组元素第一个为查找的prefab,之后的是使用了该prefab的预设或配表。 如果一组元素只有一个对象,则这个prefab无引用。 顶部的按钮为指定功

    2024年02月16日
    浏览(51)
  • 详解Unity预制体和预制体变体(Prefab Variant)

    一、预制体变体的创建 二、预制体与变体的绑定 三、预制体到变体的继承关系 四、变体常见API 五、变体用途 通过一个预制体创建预制体变体可以通过以下两种方法: 1.在需要创建变体的预制体上右键选择图中选项即可在预制体当前目录下创建预制体变体。  2.通过脚本进行

    2024年01月17日
    浏览(42)
  • [Unity]将物体(gameObject)与预制体(Prefab)取消关联,解绑

    在如下Hierarchy窗口中右键点击要解绑的物体  在右键菜单中选择prefab-》Unpack即可将对象与预制体解除关联      

    2024年02月11日
    浏览(49)
  • Unity Editor 遍历指定文件夹下的所有prefab

    适用场景:                  查找指定文件夹下所有的prefab并找到所有引用的图片及路径。 步骤分析:                 1、通过guid获取资源路径                 2、获取文件夹中包含后缀为.prefab的路径                 3、编辑器下加载该资源(如果对资源有编辑的话

    2024年02月04日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包