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

相关文章

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据