using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System; using UnityEngine.UI; namespace AX.GeneralTools { public enum RenameType { 重命名, 添加前缀, 添加后缀, 查找替换, } public enum RenderingMode { Opaque = 0, Cutout = 1, Fade = 2, Transparent = 3 } public enum ObjectMode { 所有物体, 选择的物体, } public enum CommonMaterial { 基础材质, 金属材质, 透明文字, 主体透明, 周边配楼, 玻璃门窗, } public enum ShadowType { On = 0, Off = 1, TwoSided = 2, ShadowsOnly = 3, } public enum CompentType { 添加, 删除, } public enum ComponentMode { BoxCollider, MeshCollider, CapsuleCollider, CharacterControler, LineRenderer, TrailRenderer, NavMeshAgent, Animator, AudioSource, VideoPlayer, } public enum DefualtCollider { None, MeshCollider, BoxCollider, } public enum PowerMode { None, NameAndTask, } public class GeneralTools:Editor { // 重命名 public static RenameType renameType; public static bool isRenameTools = true; public static string BaseName = "Object"; public static int BaseCount = 0; public static int Increment = 1; public static string Prefix = "Prefix_"; public static string Suffix = "_Suffix"; public static string FindName = ""; public static string ReplaceName = ""; //常用材质 public static CommonMaterial commonMaterial; public static bool isCommonMaterial = true; ////切换标准材质为通用渲染管线材质 //public static bool isConvertShander = true; ////public static Color m_BaseColor = Color.gray; ////public static Texture2D m_BaseMap; ////public static float m_Metallic; ////public static Texture2D m_MetallicGlossMap; ////public static float m_Smothness; ////public static Texture2D m_BumpMap; ////public static Material m_Material; //public static Material[] m_Materials = new Material[0]; //转换RenderingMode public static ObjectMode objectMode; public static RenderingMode defaultMode = RenderingMode.Transparent; public static RenderingMode targetMode = RenderingMode.Fade; public static bool isRenderingMode = true; //转换材质颜色 public static bool isMainColor = true; public static ObjectMode SelectMode = ObjectMode.选择的物体; public static Color defaultColor = new Color(0.588f, 0.588f, 0.588f, 1f); public static Color targetColor = Color.white; //设置标准材质属性 public static bool isSetMaterialAttiure = true; public static float metallic = 0; public static float smoothness = 0; public static Color emissionColor = Color.black; public static ShadowType shadowType; //添加常用组件 public static bool isCompent = true; public static CompentType compentType; //public static ComponentMode componentMode; //设置物体属性 public static bool isAttribut = true; public static string NormalTag = "Untagged"; public static int NormalLayer = 0; public static DefualtCollider defualtCollider; public static bool isAddInstantiateObjectInfo; public static int FloorNum = 0; //替换prefab public static bool isReplacePrefab = true; public static GameObject OriginalPrefab; public static bool isName=true; public static bool isParent=true; public static bool isPosition = true; public static bool isRotation = true; public static bool isScale = true; public static bool isDestroyOriginalPrefab = false; //设置物体父物体 public static bool isSetParent = true; public static Transform Parent; //反转法线 public static bool isFlip=true; //显示选择物体路径 public static bool isShowSelectedName=true; //Power public static bool ispowerSet = true; public static PowerMode powerMode; public static GameObject Body; public static Font font; private static Vector3 size; public static void FlipNormal() { GameObject obj = Selection.activeGameObject; Vector3[] normals = obj.GetComponent().sharedMesh.normals; for (int i = 0; i < normals.Length; i++) { normals[i] = -normals[i]; } obj.GetComponent().sharedMesh.normals = normals; int[] triangles = obj.GetComponent().sharedMesh.triangles; for (int i = 0; i < triangles.Length; i += 3) { int t = triangles[i]; triangles[i] = triangles[i + 2]; triangles[i + 2] = t; } obj.GetComponent().sharedMesh.triangles = triangles; } public static void SetParent() { foreach(GameObject go in Selection.gameObjects) { go.transform.parent = Parent; } } //重命名 public static void OnRename() { if (Selection.objects == null) return; int PostFix = BaseCount; List mySelection = new List(Selection.gameObjects); mySelection.Sort((go1, go2) => go1.transform.GetSiblingIndex().CompareTo(go2.transform.GetSiblingIndex())); foreach (GameObject obj in mySelection) { obj.name = BaseName + PostFix; PostFix += Increment; BaseCount = PostFix; } } //添加前缀 public static void OnAddPrefix() { foreach (GameObject obj in Selection.gameObjects) { obj.name = Prefix + obj.name; } } //添加后缀 public static void OnAddSuffix() { foreach (GameObject obj in Selection.gameObjects) { obj.name = obj.name + Suffix; } } //查找替换 public static void OnReplace() { foreach (GameObject obj in Selection.gameObjects) { string newName = obj.name.Replace(FindName, ReplaceName); obj.name = newName; } } //常用材质 public static void OnCommomMaterial(CommonMaterial _commonMaterial) { foreach (GameObject obj in Selection.gameObjects) { if (obj.GetComponent() != null) { foreach (Material m in obj.GetComponent().sharedMaterials) { switch (_commonMaterial) { case CommonMaterial.基础材质: m.shader = Shader.Find("Universal Render Pipeline/Lit"); m.SetInt("_Surface", 0); m.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); m.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); m.SetInt("_ZWrite", 1); m.DisableKeyword("_ALPHATEST_ON"); m.DisableKeyword("_ALPHABLEND_ON"); m.DisableKeyword("_ALPHAPREMULTIPLY_ON"); m.renderQueue = -1; obj.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; m.SetFloat("_Metallic", 0); m.SetFloat("_Smoothness", 0); break; case CommonMaterial.金属材质: m.shader = Shader.Find("Universal Render Pipeline/Lit"); m.SetInt("_Surface", 0); m.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); m.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); m.SetInt("_ZWrite", 1); m.DisableKeyword("_ALPHATEST_ON"); m.DisableKeyword("_ALPHABLEND_ON"); m.DisableKeyword("_ALPHAPREMULTIPLY_ON"); m.renderQueue = -1; obj.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; m.SetFloat("_Metallic", 1); m.SetFloat("_Smoothness", 1); break; case CommonMaterial.透明文字: m.shader = Shader.Find("Universal Render Pipeline/Lit"); m.SetInt("_Surface", 1); m.SetColor("_BaseColor", Color.white); //m.SetFloat("_Mode", 2); m.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); m.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); m.SetInt("_ZWrite", 0); m.DisableKeyword("_ALPHATEST_ON"); m.EnableKeyword("_ALPHABLEND_ON"); m.DisableKeyword("_ALPHAPREMULTIPLY_ON"); m.renderQueue = 3000; obj.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; m.SetFloat("_Metallic", 0); m.SetFloat("_Smoothness", 0); break; case CommonMaterial.主体透明: m.shader = Shader.Find("Standard"); m.SetInt("_Surface", 1); m.SetColor("_BaseColor", new Color(0.588f, 0.784f, 0.843f, 0.47f)); m.SetFloat("_Mode", 3); m.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); m.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); m.SetInt("_ZWrite", 0); m.DisableKeyword("_ALPHATEST_ON"); m.DisableKeyword("_ALPHABLEND_ON"); m.EnableKeyword("_ALPHAPREMULTIPLY_ON"); m.renderQueue = 3000; obj.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; m.SetFloat("_Metallic", 0); m.SetFloat("_Smoothness", 0); m.SetFloat("_SpecularHighlights", 0); break; case CommonMaterial.周边配楼: m.shader = Shader.Find("Standard"); m.SetInt("_Surface", 1); m.SetColor("_BaseColor", new Color(0.55f, 0.63f, 0.71f, 0.7843f)); m.SetFloat("_Mode", 3); m.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); m.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); m.SetInt("_ZWrite", 0); m.DisableKeyword("_ALPHATEST_ON"); m.DisableKeyword("_ALPHABLEND_ON"); m.EnableKeyword("_ALPHAPREMULTIPLY_ON"); m.renderQueue = 3000; obj.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; m.SetFloat("_Metallic", 0); m.SetFloat("_Smoothness", 0); m.SetFloat("_SpecularHighlights", 0); break; case CommonMaterial.玻璃门窗: m.shader = Shader.Find("Universal Render Pipeline/Lit"); m.SetInt("_Surface", 0); m.SetColor("_BaseColor", Color.white); //m.SetFloat("_Mode", 0); m.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); m.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); m.SetInt("_ZWrite", 1); m.DisableKeyword("_ALPHATEST_ON"); m.DisableKeyword("_ALPHABLEND_ON"); m.DisableKeyword("_ALPHAPREMULTIPLY_ON"); m.renderQueue = -1; obj.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; m.SetFloat("_Metallic", 0); m.SetFloat("_Smoothness", 0.95f); break; } } } } } //public static void CovertShaderAttrube() //{ // m_Materials = Selection.activeGameObject.GetComponent().sharedMaterials; // for(int i = 0; i < m_Materials.Length; i++) // { // if(m_Materials[i].shader== Shader.Find("Standard")) // { // var _BaseColor = m_Materials[i].GetColor("_Color"); // var _BaseMap = m_Materials[i].GetTexture("_MainTex"); // var _Metallic = m_Materials[i].GetFloat("_Metallic"); // var _MetallicGlossMap = m_Materials[i].GetTexture("_MetallicGlossMap"); // var _Smoothness = m_Materials[i].GetFloat("_Glossiness"); // var _BumpMap = m_Materials[i].GetTexture("_BumpMap"); // m_Materials[i].shader = Shader.Find("Universal Render Pipeline/Lit"); // m_Materials[i].SetColor("_BaseColor", _BaseColor); // m_Materials[i].SetTexture("_BaseMap", _BaseMap); // m_Materials[i].SetFloat("_Metallic", _Metallic); // m_Materials[i].SetTexture("_MetallicGlossMap", _MetallicGlossMap); // m_Materials[i].SetFloat("_Smoothness", _Smoothness); // m_Materials[i].SetTexture("_BumpMap", _BumpMap); // } // } //if (m_Material != null&&m_Material.shader==Shader.Find("Standard")) //{ // m_BaseColor = m_Material.GetColor("_Color"); // m_BaseMap = (Texture2D)m_Material.GetTexture("_MainTex"); // m_Metallic = m_Material.GetFloat("_Metallic"); // m_MetallicGlossMap = m_Material.GetTexture("_MetallicGlossMap") as Texture2D; // m_Smothness = m_Material.GetFloat("_Glossiness"); // m_BumpMap = m_Material.GetTexture("_BumpMap") as Texture2D; //} //} //public static void SetShaderAttrube() //{ // //if (m_Material != null && m_Material.shader == Shader.Find("Standard")) // //{ // // m_Material.shader = Shader.Find("Universal Render Pipeline/Lit"); // // m_Material.SetColor("_BaseColor", m_BaseColor); // // m_Material.SetTexture("_BaseMap", m_BaseMap); // // m_Material.SetFloat("_Metallic", m_Metallic); // // m_Material.SetTexture("_MetallicGlossMap", m_MetallicGlossMap); // // m_Material.SetFloat("_Smoothness", m_Smothness); // // m_Material.SetTexture("_BumpMap", m_BumpMap); // //} //} //切换颜色 public static void OnMainColor() { switch (SelectMode) { case ObjectMode.所有物体: foreach (GameObject obj in GameObject.FindObjectsOfType(typeof(GameObject))) { if (obj.GetComponent() != null) { foreach (Material m in obj.GetComponent().sharedMaterials) { if (m.shader == Shader.Find("Universal Render Pipeline/Lit")) { if (m.GetColor("_BaseColor") == defaultColor) { m.SetColor("_BaseColor", targetColor); } } } } } break; case ObjectMode.选择的物体: foreach (GameObject o in Selection.gameObjects) { if (o.GetComponent() != null) { foreach (Material m in o.GetComponent().sharedMaterials) { if (m.shader == Shader.Find("Universal Render Pipeline/Lit") ) { m.SetColor("_BaseColor", targetColor); } } } } break; } } //添加或删除组建 public static void Compents(ComponentMode componentMode) { bool isAdd = true; switch (compentType) { case CompentType.添加: isAdd = true; break; case CompentType.删除: isAdd = false; break; } if (Selection.activeGameObject) { foreach(GameObject obj in Selection.gameObjects) { switch (componentMode) { case ComponentMode.BoxCollider: if (isAdd) { if (obj.GetComponent() != null || obj.GetComponent() != null) { if (!obj.GetComponent()) { obj.AddComponent(); } else { Debug.LogWarning("BoxCollider" + "组件已存在"); } } } else { if (obj.GetComponent()) { DestroyImmediate(obj.GetComponent()); } else { Debug.LogWarning("BoxCollider组件不存在!"); } } break; case ComponentMode.MeshCollider: if (isAdd) { if (obj.GetComponent() != null || obj.GetComponent() != null) { if (!obj.GetComponent()) { obj.AddComponent(); } else { Debug.LogWarning("MeshCollider" + "组件已存在"); } } } else { if (obj.GetComponent()) { DestroyImmediate(obj.GetComponent()); } else { Debug.LogWarning("MeshCollider组件不存在!"); } } break; } } } } //设置物体属性 public static void SetObjectAttribute() { foreach (GameObject obj in Selection.gameObjects) { obj.tag = NormalTag; obj.layer = NormalLayer; if (obj.GetComponent() ||obj.GetComponent()) { switch (defualtCollider) { case DefualtCollider.None: return; case DefualtCollider.BoxCollider: if (!obj.GetComponent()) obj.AddComponent(); else Debug.LogWarning("BoxCollider已存在"); break; case DefualtCollider.MeshCollider: if (!obj.GetComponent()) obj.AddComponent(); else Debug.LogWarning("MeshCollider"); break; } } //if (isAddInstantiateObjectInfo) //{ // obj.AddComponent(); // obj.GetComponent().FloorNum = FloorNum; //} } } public static void OnReplacePrefab() { //foreach(GameObject obj in Selection.gameObjects) //{ // GameObject op = PrefabUtility.InstantiatePrefab(OriginalPrefab) as GameObject; // if (isName) op.name = obj.name; // if (isParent) op.transform.parent = obj.transform.parent; // if (isPosition) op.transform.localPosition = obj.transform.localPosition; // if (isRotation) op.transform.localRotation = obj.transform.localRotation; // if (isScale) op.transform.localScale = obj.transform.localScale; // if(isDestroyOriginalPrefab) DestroyImmediate(obj); //} foreach (GameObject go in Selection.gameObjects) { GameObject op = PrefabUtility.InstantiatePrefab(OriginalPrefab) as GameObject; op.GetComponent().pivot = go.GetComponent().pivot; op.GetComponent().anchorMin = go.GetComponent().anchorMin; op.GetComponent().anchorMax = go.GetComponent().anchorMax; op.GetComponent().anchoredPosition = go.GetComponent().anchoredPosition; op.GetComponent().sizeDelta = go.GetComponent().sizeDelta; //op.GetComponent().text = go.GetComponent().text; //op.GetComponent().fontSize = (int)go.GetComponent().fontSize; //if(go.GetComponent().alignment == ) //op.GetComponent().alignment = (TextAnchor)go.GetComponent().alignment; op.name = go.name; op.transform.SetParent(go.transform.parent, false); } //var go = Selection.activeGameObject; } public static string GetName(Transform parent, string myName) { if (parent != null) { string tempName = $"{parent.name}/{myName}"; return GetName(parent.parent, tempName); } else { int index = myName.IndexOf($"/"); myName = myName.Substring(index + 1); index = myName.IndexOf($"/"); myName = myName.Substring(index + 1); Debug.Log(myName); return myName; } } } }