using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEngine.UI; using System.IO; public class BatchModify { //要处理的目录 private static string modify_path = "D:/_mrzj/develop/code/u3d/Assets/LuaFramework/AssetBundleRes/scene/terrain/map"; static bool isChange = false; [MenuItem("MixTool/BatchModifyPrefab")] static void BatchModifyPrefab() { string[] cacheLog = { "已经处理的按钮记录:" }; string[] curPrefabs = { "", "", "" }; int startIndex = 0; string[] files = Directory.GetFiles(modify_path, "*.prefab", SearchOption.AllDirectories); EditorApplication.update = delegate () { string filePath = GetRelativeAssetsPath(files[startIndex]); GameObject _prefab = AssetDatabase.LoadAssetAtPath(filePath, typeof(GameObject)) as GameObject; if (_prefab == null) { Debug.Log("该路径不能正常加载预制体 = >>> " + filePath); return; } GameObject find_obj = PrefabUtility.InstantiatePrefab(_prefab) as GameObject; if (find_obj == null) { Debug.Log("该路径不实例化预制体 = >>> " + filePath); return; } isChange = false; bool isCancel = EditorUtility.DisplayCancelableProgressBar(string.Format("资源处理中({0}/{1})", startIndex, files.Length), find_obj.name, (float)startIndex / (float)files.Length); CloseLightData(find_obj); //这里是修改带Text的RecTransform大小 // ChangeTransformDeltaSize(find_obj.transform); if (isChange) { PrefabUtility.ReplacePrefab(find_obj, _prefab, ReplacePrefabOptions.Default); cacheLog[0] = CacheLog(cacheLog[0], "已经处理" + find_obj.gameObject.name, curPrefabs[0], find_obj.gameObject.name); } MonoBehaviour.DestroyImmediate(find_obj); startIndex++; if (isCancel || startIndex >= files.Length) { AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); EditorUtility.ClearProgressBar(); EditorApplication.update = null; startIndex = 0; Debug.Log("处理完成"); foreach (var item in cacheLog) { Debug.Log(item); } } }; } static private string CacheLog(string cacheLog, string log, string lastPrefab, string curPrefab) { string str = ""; if (lastPrefab != curPrefab) { str = "\n\n[" + curPrefab + "]\n" + log; } else str = "\n" + log; str = cacheLog + str; return str; } static private string GetRelativeAssetsPath(string path) { return "Assets" + Path.GetFullPath(path).Replace(Path.GetFullPath(Application.dataPath), "").Replace('\\', '/'); } static private void ChangeTransformDeltaSize(Transform transform) { Text tx = transform.GetComponent(); if (tx != null) { RectTransform rt = transform.GetComponent(); if (rt != null) { if (rt.sizeDelta.y > 20 && rt.sizeDelta.y < 30) { rt.sizeDelta = new Vector2(rt.sizeDelta.x, 30); isChange = true; Debug.Log("==>" + transform.name + " delta y = " + rt.sizeDelta); } } } int child_num = transform.childCount; if (child_num > 0) { for(int i = 0; i< child_num; ++i) { Transform temp_tf = transform.GetChild(i); if (temp_tf != null) { ChangeTransformDeltaSize(temp_tf); } } } } static private void CloseLightData(GameObject go) { MeshRenderer img2 = go.GetComponent(); if (img2 != null) { img2.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off; isChange = true; // if (img2.receiveShadows || img2.lightProbeUsage != UnityEngine.Rendering.LightProbeUsage.Off || img2.reflectionProbeUsage != UnityEngine.Rendering.ReflectionProbeUsage.Off || img2.shadowCastingMode != UnityEngine.Rendering.ShadowCastingMode.Off || img2.motionVectorGenerationMode != MotionVectorGenerationMode.ForceNoMotion) // { // img2.receiveShadows = false; // img2.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off; // img2.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off; // img2.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; // img2.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion; // isChange = true; // } } } }