using UnityEngine; using System.Collections; using UnityEditor; using System.IO; using Coolape; using System.Collections.Generic; using UnityEditorInternal; public static class ECLEditorUtl { public static GUILayoutOption width30 = GUILayout.Width (30); public static GUILayoutOption width50 = GUILayout.Width (50); public static GUILayoutOption width80 = GUILayout.Width (80); public static GUILayoutOption width100 = GUILayout.Width (100); public static GUILayoutOption width120 = GUILayout.Width (120); public static GUILayoutOption width150 = GUILayout.Width (150); public static GUILayoutOption width200 = GUILayout.Width (200); public static GUILayoutOption width250 = GUILayout.Width (250); public static GUILayoutOption width300 = GUILayout.Width (300); public static GUILayoutOption width400 = GUILayout.Width (400); public static GUILayoutOption width500 = GUILayout.Width (500); /// /// Gets the path by object.取得工程对象的路径,但不包含Assets; /// /// The path by object. /// Object. public static string getPathByObject (Object obj) { if (obj == null) return ""; string tmpPath = AssetDatabase.GetAssetPath (obj.GetInstanceID ()); if (string.IsNullOrEmpty (tmpPath)) { Debug.LogError ("Cannot get path! [obj name]==" + obj.name); return ""; } int startPos = 0; startPos = tmpPath.IndexOf ("Assets/"); startPos += 7; tmpPath = tmpPath.Substring (startPos, tmpPath.Length - startPos); return tmpPath; } /// /// Gets the object by path. /// /// The object by path. /// Path. public static Object getObjectByPath (string path) { string tmpPath = path; if (!tmpPath.StartsWith ("Assets/")) { tmpPath = PStr.b ().a ("Assets/").a (tmpPath).e (); } return AssetDatabase.LoadAssetAtPath ( tmpPath, typeof(UnityEngine.Object)); } static public void BeginContents () { GUILayout.BeginHorizontal (); EditorGUILayout.BeginHorizontal (NGUIEditorTools.textArea, GUILayout.MinHeight (10f)); GUILayout.BeginVertical (); GUILayout.Space (2f); } /// /// End drawing the content area. /// static public void EndContents () { GUILayout.Space (3f); GUILayout.EndVertical (); EditorGUILayout.EndHorizontal (); GUILayout.Space (3f); GUILayout.EndHorizontal (); GUILayout.Space (3f); } /// /// Ises the ignore file.是否需要忽略的文件 /// /// true, if ignore file was ised, false otherwise. /// File path. static public bool isIgnoreFile (string filePath) { if (ECLProjectManager.data == null || string.IsNullOrEmpty (filePath) || string.IsNullOrEmpty (ECLProjectManager.data.ingoreResWithExtensionNames)) { return false; } string extension = Path.GetExtension (filePath).ToLower (); string extensionList = ECLProjectManager.data.ingoreResWithExtensionNames.ToLower (); if (!string.IsNullOrEmpty (extension) && extensionList.Contains (extension)) { return true; } return false; } /// /// Moves the asset4 upgrade.把想关引用的asset移动对应的目录,以便可以支持热更新 /// /// Object. static public bool moveAsset4Upgrade (Object obj) { string objPath = getPathByObject (obj); objPath = objPath.Replace("\\", "/"); if (objPath.Contains ("/upgradeRes4Dev/")) { return false; } string toPathBase = CLPathCfg.self.basePath + "/upgradeRes4Dev/other/"; if (obj is Material) { toPathBase = toPathBase + "Materials/"; } else if (obj is Texture) { toPathBase = toPathBase + "Textures/"; } else if (obj is CLUnit) { toPathBase = toPathBase + "roles/"; } else if (obj is CLBulletBase) { toPathBase = toPathBase + "bullet/"; } else if (obj is CLEffect) { toPathBase = toPathBase + "effect/"; } else if (obj is AudioClip) { toPathBase = toPathBase + "sound/"; } else if (obj is Mesh || obj is Avatar) { toPathBase = toPathBase + "model/"; } else { toPathBase = toPathBase + "things/"; } string toPath = ""; if (objPath.StartsWith (CLPathCfg.self.basePath + "/xRes/")) { toPath = toPathBase + objPath.Replace (CLPathCfg.self.basePath + "/xRes/", ""); } else if (objPath.StartsWith (CLPathCfg.self.basePath + "/")) { toPath = toPathBase + objPath.Replace (CLPathCfg.self.basePath + "/", ""); } else if (objPath.Contains ("/Resources/")) { toPath = toPathBase + objPath.Replace ("/Resources/", "/Res/"); } else { toPath = toPathBase + objPath; } // Debug.Log ("111=======Assets/" + objPath); // Debug.Log ("222=======Assets/" + toPath); Directory.CreateDirectory (Path.GetDirectoryName (Application.dataPath + "/" + toPath)); AssetDatabase.Refresh (); string ret = AssetDatabase.MoveAsset ("Assets/" + objPath, "Assets/" + toPath); if (!string.IsNullOrEmpty (ret)) { Debug.LogError (ret); return false; } else { AssetDatabase.Refresh (); } return true; } /// /// Gets the file name4 upgrade.取得asset的名字,给资源管理用 /// /// The file name4 upgrade. /// Object. static public string getAssetName4Upgrade (Object obj) { string objPath = getPathByObject (obj); // Debug.Log ("objPath===" + objPath); string objName = Path.GetFileNameWithoutExtension (objPath); string basePath = Path.GetDirectoryName (objPath) + "/"; basePath = basePath.Replace("\\", "/"); // Debug.Log (objName); // Debug.Log (basePath); string replacePath = CLPathCfg.self.basePath + "/upgradeRes4Dev/other/"; if (obj is Material) { replacePath = replacePath + "Materials/"; } else if (obj is Texture) { replacePath = replacePath + "Textures/"; } else if (obj is CLUnit) { replacePath = replacePath + "roles/"; } else if (obj is CLBulletBase) { replacePath = replacePath + "bullet/"; } else if (obj is CLEffect) { replacePath = replacePath + "effect/"; } else if (obj is AudioClip) { replacePath = replacePath + "sound/"; } else if (obj is Mesh || obj is Avatar) { replacePath = replacePath + "model/"; } else { replacePath = replacePath + "things/"; } // Debug.Log ("replacePath===" + replacePath); objName = basePath.Replace (replacePath, ""); if (objName != "") { objName = Path.Combine (objName, Path.GetFileNameWithoutExtension (objPath)); } else { objName = Path.GetFileNameWithoutExtension (objPath); } objName = objName.Replace("\\", "/"); objName = objName.Replace ("/", "."); // Debug.Log ("objName===" + objName); return objName; } /// /// Get all textures from a material /// /// The textures from material. /// Mat. public static bool getTexturesFromMaterial (Material mat, ref ArrayList propNames, ref ArrayList texNames, ref ArrayList texPaths) { bool ret = false; if (mat == null) { Debug.LogWarning ("The mat is null"); return ret; } Shader shader = mat.shader; string propName = ""; for (int i = 0; i < ShaderUtil.GetPropertyCount (shader); i++) { if (ShaderUtil.GetPropertyType (shader, i) == ShaderUtil.ShaderPropertyType.TexEnv) { propName = ShaderUtil.GetPropertyName (shader, i); Texture texture = mat.GetTexture (propName); if (texture != null) { ret = ECLEditorUtl.moveAsset4Upgrade (texture) || ret ? true : false; propNames.Add (propName); texNames.Add (ECLEditorUtl.getAssetName4Upgrade (texture)); texPaths.Add (ECLEditorUtl.getPathByObject (texture)); } } } return ret; } /// /// Gets the dir list.取得目录列表 /// /// Dir. /// Left. /// Result. static public void getDirList (string dir, string left, ref string result) { result = string.IsNullOrEmpty (result) ? "" : result; /* ─━│┃┄┅┆┇┈┉┊┋┌ ┍┎┏┐┑┒┓└┕┖ ┗┘┙┚┛├┝┞┟ ┠┡┢┣┤┥┦┧┨ ┩┪┫┬┭┮┯┰ ┱┲┳┴┵┶┷┸┹ ┺┻┼┽┾┿╀╁╂ ╃╄╅╆╇╈╉╊╋═║ ╒╓╔╕╖╗╘╙ ╚╛╜╝╞╟╠╡ ╢╣╤╥╦╧╨╩ ╪╫╬╳╔ ╗╝╚ ╬ ═ ╓ ╩ ┠ ┨┯ ┷┏ ┓┗ ┛┳⊥﹃﹄┌╭╮╯╰ */ result = result + left + dir.Replace (Application.dataPath + "/", " ") + " \n"; string[] dirs = Directory.GetDirectories (dir); string left2 = ""; if (dirs.Length > 0 && left.Length > 0) { char[] chars = left.ToCharArray (); if (chars [chars.Length - 1] == '┖') { chars [chars.Length - 1] = ' '; } else { chars [chars.Length - 1] = '┃'; } left2 = new string (chars); } if (dirs.Length > 0) { for (int i = 0; i < dirs.Length; i++) { if (i == dirs.Length - 1) { getDirList (dirs [i], left2 + "┖", ref result); } else { getDirList (dirs [i], left2 + "┠", ref result); } } } } public static bool SaveRenderTextureToPNG (Texture inputTex, Shader outputShader, string contents, string pngName) { RenderTexture temp = RenderTexture.GetTemporary (inputTex.width, inputTex.height, 0, RenderTextureFormat.ARGB32); Material mat = new Material (outputShader); Graphics.Blit (inputTex, temp, mat); bool ret = SaveRenderTextureToPNG (temp, contents, pngName); RenderTexture.ReleaseTemporary (temp); return ret; } //将RenderTexture保存成一张png图片 public static bool SaveRenderTextureToPNG (RenderTexture rt, string contents, string pngName) { RenderTexture prev = RenderTexture.active; RenderTexture.active = rt; Texture2D png = new Texture2D (rt.width, rt.height, TextureFormat.ARGB32, false); png.ReadPixels (new Rect (0, 0, rt.width, rt.height), 0, 0); byte[] bytes = png.EncodeToPNG (); if (!Directory.Exists (contents)) Directory.CreateDirectory (contents); FileStream file = File.Open (contents + "/" + pngName + ".png", FileMode.Create); BinaryWriter writer = new BinaryWriter (file); writer.Write (bytes); file.Close (); Texture2D.DestroyImmediate (png); png = null; RenderTexture.active = prev; return true; } public static void setModelProp (ModelImporter mi, bool isReadable, ModelImporterNormals modelNormals, ModelImporterTangents modelTangents) { if (mi != null) { mi.importMaterials = false; mi.isReadable = isReadable; mi.importNormals = modelNormals; mi.importTangents = modelTangents; AssetDatabase.Refresh (); } } public static void setModelProp (string modelName, bool isReadable, ModelImporterNormals modelNormals, ModelImporterTangents modelTangents) { string matPath = PStr.b ().a ("Assets/").a (CLPathCfg.self.basePath).a ("/") .a ("upgradeRes4Dev").a ("/other/model/").a (modelName.Replace (".", "/")).a (".FBX").e (); ModelImporter mi = ModelImporter.GetAtPath (matPath) as ModelImporter; setModelProp (mi, isReadable, modelNormals, modelTangents); doCleanModelMaterials (matPath); } public static void cleanModleMaterials (ModelImporter mi) { if (mi != null) { mi.importMaterials = false; AssetDatabase.Refresh (); } } public static void cleanModleMaterials (string modelName) { string matPath = PStr.b ().a ("Assets/").a (CLPathCfg.self.basePath).a ("/") .a ("upgradeRes4Dev").a ("/other/model/").a (modelName.Replace (".", "/")).a (".FBX").e (); doCleanModelMaterials (matPath); } public static void doCleanModelMaterials (string matPath) { checkModleSetting (matPath); ModelImporter mi = ModelImporter.GetAtPath (matPath) as ModelImporter; if (mi != null) { cleanModleMaterials (mi); AssetDatabase.ImportAsset (matPath); } GameObject go = ECLEditorUtl.getObjectByPath (matPath) as GameObject; if (go != null) { MeshRenderer mf = go.GetComponentInChildren (); if (mf != null) { mf.sharedMaterial = null; Material[] mats = mf.sharedMaterials; for (int i = 0; i < mats.Length; i++) { mats [i] = null; } mf.sharedMaterials = mats; } SkinnedMeshRenderer smr = go.GetComponentInChildren (); if (smr != null) { smr.sharedMaterial = null; Material[] mats = smr.sharedMaterials; for (int i = 0; i < mats.Length; i++) { mats [i] = null; } smr.sharedMaterials = mats; } EditorUtility.SetDirty (go); AssetDatabase.WriteImportSettingsIfDirty (matPath); AssetDatabase.Refresh (); } } public static string checkModleSetting (string path) { string ret = ""; ModelImporter mi = ModelImporter.GetAtPath (path) as ModelImporter; if (mi != null) { if (mi.isReadable) { ret = PStr.b ().a (ret).a ("can reade write! ").e (); } if (mi.importMaterials) { ret = PStr.b ().a (ret).a ("import Materials! ").e (); } if (mi.importNormals != ModelImporterNormals.None) { ret = PStr.b ().a (ret).a ("import Normals! ").e (); } } Debug.LogError (ret); return ret; } public static LayerMask drawMaskField(string text, LayerMask mask) { return drawMaskField(new GUIContent(text, ""), mask); } public static LayerMask drawMaskField(GUIContent uIContent, LayerMask mask) { int tempMask = EditorGUILayout.MaskField(uIContent, InternalEditorUtility.LayerMaskToConcatenatedLayersMask(mask), InternalEditorUtility.layers); return InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(tempMask); } }