Unity3D批处理工具自动化脚本总结

发布于:2025-05-01 ⋅ 阅读:(116) ⋅ 点赞:(0)

前言

Unity3D的批处理工具自动化脚本(Batch Processing Automation)可以通过编辑器扩展和命令行工具实现高效资源管理、批量操作和流程自动化。以下是关键技术与应用场景的总结:

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

一、 模型导入与尺寸校正

在3D模型导入时,常遇到Max导出的FBX模型尺寸与Unity场景不一致的问题(如Max中的1米在Unity中显示为0.01米)。可通过以下脚本自动调整全局缩放比例:

using UnityEditor;
using UnityEngine;

public class FBXSeting : AssetPostprocessor {
    void OnPreprocessModel() {
        ModelImporter modelImporter = (ModelImporter)assetImporter;
        if (assetImporter.assetPath.Contains(".fbx")) {
            modelImporter.globalScale = 1.0f; // 强制缩放为1
            modelImporter.generateMaterials = ModelImporterGenerateMaterials.None; // 禁用自动生成材质
        }
    }
}

此脚本通过AssetPostprocessor在导入模型前自动修改Scale Factor,避免手动调整1 2。

二、 材质批处理

Unity默认会为FBX模型自动生成材质,但批量修改材质需通过脚本控制。例如,将选中模型的材质颜色统一设置为红色:

[MenuItem("Actor/Generate Material")]
static void Execute() {
    foreach (Object o in Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets)) { 
        if (o is GameObject && !o.name.Contains("@")) {
            GameObject charFbx = (GameObject)o;
            foreach (SkinnedMeshRenderer smr in charFbx.GetComponentsInChildren<SkinnedMeshRenderer>(true)) {
                smr.material.color = Color.red; // 修改蒙皮网格材质
            }
        }
    }
}

注意事项

  • 推荐使用generateMaterials = ModelImporterGenerateMaterials.PerMaterial支持多材质12。
  • 避免删除现有材质后重新创建,以防止Unity重启时材质关联丢失12。

三、 Prefab与资源批处理

1. 批量生成Prefab

Object tempPrefab = EditorUtility.CreateEmptyPrefab("Assets/" + name + ".prefab");
tempPrefab = EditorUtility.ReplacePrefab(go, tempPrefab);

此代码通过脚本动态创建Prefab,适用于大量模型的快速预制体生成12。

2. AssetBundle打包自动化

结合命令行工具调用Unity的批处理模式,实现自动化打包:

@echo off
start /min Unity.exe -batchmode -projectPath D:\MyProject -executeMethod MyClass.BuildAssetBundles
Pause
taskkill /f /im unity.exe

对应编辑器代码需定义静态方法BuildAssetBundles,并通过BuildPipeline生成AssetBundle37。

四、 动画事件批量添加

为动画片段自动添加起始和结束回调事件:

[MenuItem("Animation/AnimationEvent Batch")]
static void Execute() {
    foreach (Object o in Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets)) {
        if (o is GameObject) {
            AnimationClip[] clips = AnimationUtility.GetAnimationClips((GameObject)o);
            foreach (AnimationClip clip in clips) {
                List<AnimationEvent> events = new List<AnimationEvent>(AnimationUtility.GetAnimationEvents(clip));
                if (!HasStartEvent(events)) {
                    events.Add(new AnimationEvent { time = 0.0005f, functionName = "StartCallBack" });
                }
                if (!HasEndEvent(events)) {
                    events.Add(new AnimationEvent { time = clip.length - 0.0005f, functionName = "EndCallBack" });
                }
                AnimationUtility.SetAnimationEvents(clip, events.ToArray());
            }
        }
    }
}

此脚本遍历选中模型的动画片段,添加标准化事件12。


五、 命令行与批处理模式

通过命令行参数调用Unity的静态方法,适用于持续集成和自动化测试:

  • 关键参数
    • -batchmode:后台运行Unity,不显示界面。
    • -projectPath:指定项目路径。
    • -executeMethod ClassName.MethodName:执行指定静态方法37。
  • 示例Unity.exe -batchmode -projectPath D:\Project -executeMethod BuildTool.ExportAssets

六、 编辑器扩展工具

创建自定义面板实现批量复制和修改对象:

public class BatchingLiteWindow : EditorWindow {
    [MenuItem("Tools/BatchingLite")]
    public static void ShowWindow() {
        GetWindow<BatchingLiteWindow>("Batching");
    }

    private Vector3 _position, _rotation, _scale;
    private int _number;

    void OnGUI() {
        _position = EditorGUILayout.Vector3Field("Position", _position);
        // ...其他参数输入
        if (GUILayout.Button("Generate")) {
            foreach (GameObject obj in Selection.gameObjects) {
                for (int j = 0; j < _number; j++) {
                    GameObject clone = Instantiate(obj);
                    clone.transform.localPosition += _position * j;
                    // ...应用旋转和缩放
                }
            }
        }
    }
}

此工具支持批量生成对象并调整位移、旋转和缩放参数5。

注意事项

  1. 脚本放置位置:编辑器扩展脚本需放在Assets/Editor目录下,以确保编译顺序正确68。
  2. 依赖管理:涉及资源引用的操作(如材质、Prefab)需使用AssetDatabase接口,避免运行时路径错误。
  3. 日志与调试:批处理模式下日志保存在Editor.log,需通过日志排查错误37。

应用场景案例

  1. 模型导入流水线:自动校正FBX缩放、禁用材质生成、统一材质命名。
  2. 美术资源验收:批量检查材质Shader合规性,自动替换非法参数。
  3. 版本发布流程:命令行触发AssetBundle打包、版本号递增、自动上传至服务器。

通过结合编辑器脚本与命令行工具,可显著减少重复劳动,提升开发效率。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125