博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Unity Editor] 清理Prefab使用的特定组件
阅读量:6335 次
发布时间:2019-06-22

本文共 1299 字,大约阅读时间需要 4 分钟。

工具实现

修改Prefab有两种方式,1)实例化Prefab,修改GameObject的实例,然后再替换工程里的资源(SaveAsPrefabAsset)。2)通过SerializedObject直接修改Prefab资源。这里我采用了第2中方法。

方法1在实现上更常规化,和平时开发游戏逻辑的思路、方式完全一样,但是要创建、销毁实例并替换资源,感觉更像一种间接的方式。
方法2直接操作Prefab,不会有中间产物,但是操作习惯不那么常规。比如删除组件不能直接Destroy,而是要找到它在GameObject上挂载的位置,然后用DeleteArrayElementAtIndex来删除。

///

/// 移除GameObject下所有节点的指定组件
///
/// 要移除的组件
/// 清理的根节点
public static void TrimComponent(GameObject root) where T:Component
{
if(null == root) return;

T[] cmps = root.GetComponentsInChildren(true);

List modifiedGos = new List(cmps.Length);
foreach (var cmp in cmps)
{
SerializedObject obj = new SerializedObject(cmp.gameObject);
SerializedProperty prop = obj.FindProperty("m_Component");
// 这里再次找组件,只是为了找到目标组件在GameObject上挂载的位置
Component[] allCmps = cmp.gameObject.GetComponents();
for (int i = 0; i < allCmps.Length; ++i)
{
if (allCmps[i] == cmp)
{
prop.DeleteArrayElementAtIndex(i);
break;
}
}
modifiedGos.Add(obj);
}
foreach (SerializedObject so in modifiedGos)
{
// Apply之后cmps里的所有组件都会被销毁,导致后面的清理无法执行,
// 所以将SO对象缓存,最后一起清理。
so.ApplyModifiedProperties();
}
}
使用Demo,清理LanguageImage组件。

///

/// 清理不用的组件
///
[MenuItem("Assets/Tools/清理组件")]
public static void TrimComponent()
{
TrimComponent(Selection.activeGameObject);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
更多unity2018的功能介绍请到paws3d爪爪学院查找。

转载地址:http://sksoa.baihongyu.com/

你可能感兴趣的文章
汇编实验三zxt
查看>>
oracle dblink使用
查看>>
A1006
查看>>
算法第四章上机实践报告
查看>>
程序员常见的编码和转义
查看>>
DynamicCocoa:滴滴 iOS 动态化方案的诞生与起航
查看>>
LeetCode - 26. Remove Duplicates from Sorted Array
查看>>
坐在马桶上看算法:只有五行的Floyd最短路算法
查看>>
213. House Robber II 打家劫舍 IIJava
查看>>
后缀自动机多图详解(代码实现)
查看>>
java位移运算符 转
查看>>
转:strcpy实现的考察要点
查看>>
【转】Map/Reduce简介
查看>>
LOB
查看>>
js验证姓名和身份证号
查看>>
Solr空格默认值是AND还是OR
查看>>
(转)SQL SERVER 生成建表脚本
查看>>
关于js单线程的解释
查看>>
python 内置函数bytearray
查看>>
对 Java Integer.valueOf() 的一些了解
查看>>