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

相关文章

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Django序列化中SerializerMethodField的使用详解

《Django序列化中SerializerMethodField的使用详解》:本文主要介绍Django序列化中SerializerMethodField的使用,具有很好的参考价值,希望对大家有所帮... 目录SerializerMethodField的基本概念使用SerializerMethodField的

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.