Unity批处理预设解决办法

在工作中可能会遇到这个问题,哪一天突然要求,统一改预设中所有的Label的某个属性,并设置成一样的值。
一遇到这种问题,我们的第一反应就是,改呗,一个个改。小工程还没事,如果是大工程,label的数量何其多。这可是个体力活。我不太愿意做重复的事情。怎么办,充分利用Unity的特性,写插件来搞吧。
具体的解决办法:

在菜单上添加一个命令,用来操作
[MenuItem("LazerSelect/UI/Label_Attribute_Changed")]
public static void LabelReplace()
{
}
新建一个场景,将所有要改的label的预设全部拖到场景中
找到场景中所有的Label,
List<UILabel> labels = NGUIEditorTools.FindAll<UILabel>();//我用的是NGUI,用其他UI的,请查看其NGUI源码,写个类似的。
修改label的属性

我这里把所有的label的effectStyle属性等于UILabel.Effect.Outline8的label,同意修改成
label.effectDistance = Vector2.one * 2;

apply这个预设
 PrefabUtility.ReplacePrefab(SourcePrefab(label.gameObject)/*找到改预设的根物体*/,PrefabUtility.GetPrefabParent(label.gameObject));      
               PrefabUtility.RevertPrefabInstance(SourcePrefab(label.gameObject));
最后保存一下工程
AssetDatabase.Refresh();

这样分分钟就把问题解决了。是不是很有成就感。
完整代码请看下面:

[MenuItem("LazerSelect/UI/Label_Attribute_Changed")]
public static void LabelReplace()
{
    List<UILabel> labels = NGUIEditorTools.FindAll<UILabel>();
    foreach (UILabel label in labels)
    {
        if (PrefabUtility.GetPrefabParent(label) != null && label.effectStyle == UILabel.Effect.Outline8)
        {
            label.effectDistance = Vector2.one * 2;
            PrefabUtility.ReplacePrefab(SourcePrefab(label.gameObject), PrefabUtility.GetPrefabParent(label.gameObject));
            PrefabUtility.RevertPrefabInstance(SourcePrefab(label.gameObject));
        }
    }

}
private static GameObject SourcePrefab(GameObject obj)
{
    Transform target = obj.transform;
    while ((target.parent != null && PrefabUtility.GetPrefabParent(target.parent) != null))
    {
        if (target.parent.name == "prefab_item_grid_special")
        {
            break;
        }
        target = target.parent;
    }
    return target.gameObject;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值