引用:Is there a way to destroy/replace a GameObject that is inside or part of a Prefab instance?
Changing Transform on a Prefab instance (jiantou) is not allowed.
这里用到的需求是做ui特效时将3Dmesh 渲染到ui层,用的ugui,ugui依赖于RectTransform,所以就有这个问题

将Prefab应用的Model对象的Transform修改为RectTransform

默认Model对象导入Transform组件,但是在ui中有些组件需要RectTransform组件,所以就需要强制将Transform变为RectTransform,这里通过调整Hierarchy面板内的prefab实例并且应用到prefab中,来完成修改,当然还有一个简单方法就是直接修改prefab

/// <summary>/// 把Prefab中的Transform替换为RectTransform/// 有个不足的地方是prefab的继承关系会丢失(Variant关系丢失)/// 如果一个prefab中引用另一个prefab,这种关系也会丢失/// </summary>/// <typeparam name="T">RectTransform</typeparam>/// <param name="obj"></param>private void AddComponentFromPrefab<T>(GameObject obj)  where T :UnityEngine.Component{PrefabAssetType prefabType = PrefabUtility.GetPrefabAssetType(obj);//Debug.Log($"AddComponentFromPrefab,name:{obj.name},PrefabAssetType:{prefabType}");switch (prefabType){case PrefabAssetType.Regular:case PrefabAssetType.Variant://获取prefab实例的根节点GameObject prefabRoot = PrefabUtility.GetOutermostPrefabInstanceRoot(obj);//获取prefab资源,在project中的GameObject prefabAsset = PrefabUtility.GetCorrespondingObjectFromSource(obj);//Object prefabAsset = PrefabUtility.GetCorrespondingObjectFromOriginalSource(obj);//获取资源的路径名字string assetPath = AssetDatabase.GetAssetPath(prefabAsset);//Debug.Log(assetPath);//断开Model的联系,如果是Model是禁止修改RectTransform的PrefabUtility.UnpackPrefabInstance(prefabRoot, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction); //有个不足的地方是prefab的继承关系会丢失,这里是完全断开连接,非完全的方式没有测试PrefabUtility.SaveAsPrefabAssetAndConnect(prefabRoot, assetPath, InteractionMode.AutomatedAction);//修改prefab的RectTransform,如果修改实例的RectTransfom是失败的(Model虽然断开连接,但是还是禁止直接修改prefab实例的RectTransfom)GameObject pobj = PrefabUtility.LoadPrefabContents(assetPath);var ts=pobj.GetComponentsInChildren<Transform>();foreach (var t in ts)if (!(t is RectTransform))t.gameObject.AddComponent<T>();PrefabUtility.SaveAsPrefabAsset(pobj, assetPath);PrefabUtility.UnloadPrefabContents(pobj);break;case PrefabAssetType.Model:PrefabUtility.UnpackPrefabInstanceAndReturnNewOutermostRoots(obj, PrefabUnpackMode.Completely);if (!(obj.transform is T))obj.AddComponent<T>();break;default:break;}}

测试

AddComponentFromPrefab<RectTransform>(gameObject);

将测试代码写到Start方法中,且脚本设置[ExecuteInEditMode]标签,挂载prefab跟节点,
测试结果:

结果:

执行代码后Model引用变为prefab内的普通物体,切换修改成功RectTransform,并且prefab也已经修改成功

Prefab和GameObject的正向和逆向查找引用

转自 Unity研究院之Prefab和GameObject的正向和逆向查找引用

[MenuItem("Assets/Check Prefab Use ?")]private static void OnSearchForReferences(){//确保鼠标右键选择的是一个Prefabif(Selection.gameObjects.Length != 1){return;}//遍历所有游戏场景foreach(EditorBuildSettingsScene scene in EditorBuildSettings.scenes){if(scene.enabled){//打开场景EditorApplication.OpenScene(scene.path);//获取场景中的所有游戏对象GameObject []gos = (GameObject[])FindObjectsOfType(typeof(GameObject));foreach(GameObject go  in gos){//判断GameObject是否为一个Prefab的引用if(PrefabUtility.GetPrefabType(go)  == PrefabType.PrefabInstance){UnityEngine.Object parentObject = EditorUtility.GetPrefabParent(go); string path = AssetDatabase.GetAssetPath(parentObject);//判断GameObject的Prefab是否和右键选择的Prefab是同一路径。if(path == AssetDatabase.GetAssetPath(Selection.activeGameObject)){//输出场景名,以及Prefab引用的路径Debug.Log(scene.path  + "  " + GetGameObjectPath(go));}}}}}}public static string GetGameObjectPath(GameObject obj){string path = "/" + obj.name;while (obj.transform.parent != null){obj = obj.transform.parent.gameObject;path = "/" + obj.name + path;}return path;}

Unity2018.4的Prefab Variant(Prefab变种)功能

转自[Unity]Unity2018.4的Prefab Variant(Prefab变种)功能

Unity 2018.4中送了一个新的功能: Prefab Variant

思路是, Prefab Variant 继承于一个父Prefab, 父Prefab属性修改后:

  • (1)如果子Prefab的某些属性不动, 则父Prefab的属性影响子Prefab的属性, 此为 [属性继承]

  • (2)如果对子Prefab的某些属性进行修改/覆盖, 则父Prefab的属性无法影响, 此为 [属性定制]

创建Prefab Variant的方法为: 把Prefab从Hierarchy再次拉到Project中,选择 Prefab Variant

用处举例:

比如做一个UGUI窗体模板, 上面有标题文字和关闭按钮

邮件窗体继承于此窗体模板,制作成为一个PrefabVariant, 但是标题文字定制修改为”邮件”

这时,可以通过修改窗体模板中的关闭按钮,对所有派生的窗体按钮进行修改

附:以下为官方对PrefabAssetType的解释:

    public enum PrefabAssetType{//// 摘要://     The object being queried is not part of a Prefab at all.NotAPrefab = 0, // 不是Prefab//// 摘要://     The object being queried is part of a regular Prefab.Regular = 1, // 常规的Prefab//// 摘要://     The object being queried is part of a Model Prefab.Model = 2, // 模型(例如:FBX)//// 摘要:// The object being queried is part of a Prefab Variant.// A Variant Prefab is a Prefab that is derived from another Prefab, // that be could be a Regular, Model or even Variant Prefab.Variant = 3, // Prefab变种//// 摘要://     The object being queried is part of a Prefab instance, but because the asset//     it missing the actual type of Prefab can’t be determined.MissingAsset = 4 // Prefab实例化出来的对象,但是Prefab被删了(红色)}

Unity 修改Prefab实例将Transform变为RectTransform相关推荐

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

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

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

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

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

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

  4. unity修改飞行数据_数据预测和文化,或者我如何在没有飞行汽车的情况下学会生活...

    unity修改飞行数据 Two and a half thousand years ago, the ancient Greeks used to visit a temple in Delphi t ...

  5. 认识Unity中Prefab

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

  6. RAC 修改 DB 实例名 步骤

    在我之前的2篇Blog 里提到了RAC ASM实例名和 DB实例名的问题. RAC 中 ASM 实例名 与 节点的对应关系 http://blog.csdn.net/tianlesoftware/ar ...

  7. wxss 点击样式_微信小程序点击控件修改样式实例详解

    微信小程序点击控件修改样式实例详解 现在要在微信小程序中实现点击控件修改样式,如下: 微信小程序中不支持直接操作dom,要实现这种效果,我们需要通过设置data,然后利用数据和界面的双向绑定来实现它. ...

  8. python3线程gil_python3爬虫GIL修改多线程实例讲解

    我们打开程序后,会发现电脑的内存和cpu发生了变化.在对于前者上面,自然是希望内容占用小,cpu的利用越高越好.那有没有什么方法可以让我们的cpu达到满状态的运行效果呢?这就得用到我们所学的多线程中的 ...

  9. 修改oracle实例名orcl为demo

    修改oracle实例名有六步: 1.sqlplus username/password as sysdba登陆,然后从spfile文件创建pfile文件 :create pfile from spfi ...

最新文章

  1. java 对象内存布局_Java--对象内存布局
  2. ES5-Array-push(),pop(),shift(),unshift()
  3. 蓦然回首,灯火阑珊的CIO之路(连载八)
  4. 判断dialog是否显示_如何成为一流的仪表维修工之液位测量仪表故障检查判断思路...
  5. Java类型转换工具类(十六进制—bytes互转、十进制—十六进制互转,String—Double互转)
  6. copy 浅复制 与深复制
  7. 8.Nginx 例子
  8. 理解分布函数(概率论)
  9. 高通X12平台XO信号干扰灵敏度的解决方案
  10. DIV+CSS 二级菜单实现
  11. 2022年天猫超市春节不打烊活动时间规定
  12. 黑群晖vmm专业版_在NAS上运行虚拟机:群晖虚拟化套件VMM正式发布
  13. vuepress-theme-reco评论管理
  14. acml会议级别_2020年国际学术会议参考列表
  15. php wps导入数据库,wps excel表格怎么导入数据库-如何把excel表格导入wps
  16. 01 hbuilder账号的注册
  17. 数据结构之链表(Studing Play with DataStruct)
  18. 服务器和交换机物理连接_Brocade博科交换机 SAN存储区域网络
  19. STM32F103C8T6脉冲宽度调制(PWM)
  20. 1018 锤子剪刀布python3无超时

热门文章

  1. 移动web中的常用技术选型
  2. Web技术,制作简易的登录界面
  3. MC开服教程一:简略版使用阿里云部署mc服务器(paper端)
  4. 大数据应用案例【创新需要大数据】
  5. 基于jsp+mysql+Spring+mybatis的SSM学生兼职项目网站
  6. web前端期末大作业:青岛旅游网页主题网站设计——青岛民俗4页 HTML+CSS 民俗网页设计与制作 web网页设计实例作业 html实训大作业
  7. 多线程十 JUC包下的常用工具类
  8. 阿里P6员工月薪24K,被女友嫌弃,晒出女友月薪,以为看错了
  9. python笑脸识别_OpenCV检测篇(二)——笑脸检测
  10. python 路径处理_python OSl路径处理