prefab文本序列化的结构,如下图所示,看到!u!111了吗 111 是一组id .它是有意义的(它表示Animation)

本文主要是介绍prefab文本序列化的结构,如下图所示,看到!u!111了吗 111 是一组id .它是有意义的(它表示Animation),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

prefab文本序列化的结构,如下图所示,看到!u!111了吗  111 是一组id .它是有意义的(它表示Animation)

http://www.xuanyusong.com/archives/3727

感谢楼下的牛逼回复更正一下,我表示我也是才知道。。

其实不需要实例化也能查找,你依然直接用GetComponentsInChildren<>(true),对传true即可。。。这样搞还很麻烦。。。唯一关注是能否把Missing的脚本序列化找出来??

使用 GetComponentsInChildren<>(true) 可以直接把Project视图里的子对象找出来!!!!

return;

代码是这样的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

[MenuItem("Assets/Delete")]

static void delete ()

{

GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/GameObject.prefab");

 

//删除MeshCollider

MeshCollider [] meshColliders = prefab.GetComponentsInChildren<MeshCollider>(true);

foreach(MeshCollider meshCollider in meshColliders){

 

GameObject.DestroyImmediate(meshCollider,true);

}

 

//删除空的Animation组件

Animation [] animations = prefab.GetComponentsInChildren<Animation>(true);

foreach(Animation animation in animations){

if( animation.clip == null){

GameObject.DestroyImmediate(animation,true);

}

 

}

 

//删除missing的脚本组件

MonoBehaviour [] monoBehaviours = prefab.GetComponentsInChildren<MonoBehaviour>(true);

foreach(MonoBehaviour monoBehaviour in monoBehaviours){

 

 

if(monoBehaviour == null){

Debug.Log("有个missing的脚本");

//GameObject.DestroyImmediate(monoBehaviour,true);

 

}

}

 

//遍历Transform的名子, 并且给某个游戏对象添加一个脚本

Transform [] transforms = prefab.GetComponentsInChildren<Transform>(true);

foreach(Transform transfomr in transforms){

if(transfomr.name == "GameObject (1)"){

Debug.Log(transfomr.parent.name);

transfomr.gameObject.AddComponent<BoxCollider>();

return;

}

 

}

//遍历Transform的名子, 删除某个GameObject节点

foreach(Transform transfomr in transforms){

if(transfomr.name == "GameObject (2)"){

GameObject.DestroyImmediate(transfomr.gameObject,true);

return;

}

 

}

                EditorUtility.SetDirty(prefab);

}

 

今天有朋友说不能删除missing的脚本, 我试了一下确实不行。 随后查了一下, 可以用这个方法来删除,

http://answers.unity3d.com/questions/15225/how-do-i-remove-null-components-ie-missingmono-scr.html

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

[MenuItem("Edit/Cleanup Missing Scripts")]

static void CleanupMissingScripts ()

{

     for(int i = 0; i < Selection.gameObjects.Length; i++)

     {

         var gameObject = Selection.gameObjects[i];

        

         // We must use the GetComponents array to actually detect missing components

         var components = gameObject.GetComponents<Component>();

        

         // Create a serialized object so that we can edit the component list

         var serializedObject = new SerializedObject(gameObject);

         // Find the component list property

         var prop = serializedObject.FindProperty("m_Component");

        

         // Track how many components we've removed

         int r = 0;

        

         // Iterate over all components

         for(int j = 0; j < components.Length; j++)

         {

             // Check if the ref is null

             if(components[j] == null)

             {

                 // If so, remove from the serialized component array

                 prop.DeleteArrayElementAtIndex(j-r);

                 // Increment removed count

                 r++;

             }

         }

        

         // Apply our changes to the game object

         serializedObject.ApplyModifiedProperties();

         //这一行一定要加!!!

         EditorUtility.SetDirty(gameObject);

     }

}

 

昨天晚上睡觉的时候脑洞打开。因为做项目的时候我们可能要在编辑器上做很多检查工具一类的东西。 这里我说几个典型的例子,比如空的Animation组件、丢失的脚本、没用的meshCollider组件。这些东西我们是不需要的,但是美术可能不会不小心加到prefab里。

以前的做法是 先要把Prefab 实例化 Instance以后  然后  GetComponentsInChildren  把所有的组件都取出来。 在进行遍历删除。 然后还要DestroyImmediate 它。 。那么如果prefab数量比较多的话,那么检查一次时间是很漫长的。

如果你只是想找组件 空脚本 一类的。用如下代码就可以不实例化并且找出来。

 

如果你想不实例化并且修改数据的话,那么可以考虑用下面的方法。

1.先把prefab 序列化的方式改成text 用File就可以把prefab的文本信息读出来。

1

File.ReadAllText("xxx/xxx.prefab")

 

2.prefab文本序列化的结构,如下图所示,看到!u!111了吗  111 是一组id .它是有意义的(它表示Animation),标着着这个组件是个啥东西。 具体是什么含义大家可以去这里查 http://docs.unity3d.com/Manual/ClassIDReference.html

Snip20151104_2.pnguploading.4e448015.gif转存失败重新上传取消Unity3D研究院编辑器之不实例化Prefab获取删除更新组件(十五) - 雨松MOMO程序研究院 - 1

 

3.自定义脚本

如果我想查一下看看prefab有没有绑定我自己写的脚本怎么办呢?如下图所 ,guid这一栏 就写的是你的脚本的guid了。

Snip20151104_4.pnguploading.4e448015.gif转存失败重新上传取消Unity3D研究院编辑器之不实例化Prefab获取删除更新组件(十五) - 雨松MOMO程序研究院 - 2

 

然后在脚本对应的mate文件里就记录这这个脚本的guid ,如果这两个id匹配,那么就说明这个prefab里挂着这个脚本了。

Snip20151104_5.pnguploading.4e448015.gif转存失败重新上传取消Unity3D研究院编辑器之不实例化Prefab获取删除更新组件(十五) - 雨松MOMO程序研究院 - 3

 

最后就交给正则表达式做第一步的匹配吧。 这样的话第一步就可以筛选掉一大批prefab了。 如果还需要进行验证在进一步的Instance来检查吧。。

  • 本文固定链接: https://www.xuanyusong.com/archives/3727
  • 转载请注明: 雨松MOMO 2015年11月04日 于 雨松MOMO程序研究院 发

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

这篇关于prefab文本序列化的结构,如下图所示,看到!u!111了吗 111 是一组id .它是有意义的(它表示Animation)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277143

相关文章

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SQLServer中生成雪花ID(Snowflake ID)的实现方法

《SQLServer中生成雪花ID(SnowflakeID)的实现方法》:本文主要介绍在SQLServer中生成雪花ID(SnowflakeID)的实现方法,文中通过示例代码介绍的非常详细,... 目录前言认识雪花ID雪花ID的核心特点雪花ID的结构(64位)雪花ID的优势雪花ID的局限性雪花ID的应用场景