using UnityEditor; using UnityEngine; /// /// Unity编辑器类帮助类。 /// public static class ClassHelper { /// /// 获取MonoBehaviour的脚本Id。 /// /// 脚本类型。 /// 脚本Id。 public static int GetClassID(System.Type type) { GameObject gameObject = EditorUtility.CreateGameObjectWithHideFlags("Temp", HideFlags.HideAndDontSave); Component component = gameObject.AddComponent(type); SerializedObject @class = new SerializedObject(component); int classID = @class.FindProperty("m_Script").objectReferenceInstanceIDValue; Object.DestroyImmediate(gameObject); return classID; } /// /// 获取MonoBehaviour的脚本Id。 /// /// 脚本类型。 /// 脚本Id。 public static int GetClassID() where T : MonoBehaviour { return GetClassID(typeof(T)); } #region Method Documentation /************************************************************************************************************ Example: [MenuItem("GameObject/UI/转化成CustomText", false, 1999)] public static void ConvertToCustomText(MenuCommand menuCommand) { GameObject go = menuCommand.context as GameObject; if (go != null) { Text text = go.GetComponent(); if (text != null) { var ob = ClassHelper.ReplaceClass(text, typeof(CustomText)); ob.ApplyModifiedProperties(); } } } ************************************************************************************************************/ #endregion /// /// 替换MonoBehaviour脚本。 /// /// /// /// public static SerializedObject ReplaceClass(MonoBehaviour monoBehaviour, System.Type type) { int classID = GetClassID(type); SerializedObject @class = new SerializedObject(monoBehaviour); @class.Update(); @class.FindProperty("m_Script").objectReferenceInstanceIDValue = classID; @class.ApplyModifiedProperties(); @class.Update(); return @class; } }