ComponentViewEditor.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using UnityEditor;
  5. using UnityEngine;
  6. using WS;
  7. [CustomEditor(typeof(WSComponentView))]
  8. public class ComponentViewEditor : Editor
  9. {
  10. public override void OnInspectorGUI()
  11. {
  12. WSComponentView componentView = (WSComponentView)target;
  13. object component = componentView.Component;
  14. //if (component.GetType() == typeof (ILTypeInstance))
  15. //{
  16. // return;
  17. //}
  18. ComponentViewHelper.Draw(component);
  19. }
  20. private void OnDestroy()
  21. {
  22. ComponentViewHelper.TypeDrawerDestroy();
  23. }
  24. }
  25. public static class ComponentViewHelper
  26. {
  27. private static readonly List<ITypeDrawer> typeDrawers = new List<ITypeDrawer>();
  28. ///<summary>初始化</summary>
  29. static ComponentViewHelper()
  30. {
  31. Assembly assembly = typeof(ComponentViewHelper).Assembly;
  32. foreach (Type type in assembly.GetTypes())
  33. {
  34. if (!type.IsDefined(typeof(TypeDrawerAttribute)))
  35. {
  36. continue;
  37. }
  38. ITypeDrawer iTypeDrawer = (ITypeDrawer)Activator.CreateInstance(type);
  39. typeDrawers.Add(iTypeDrawer);
  40. }
  41. }
  42. ///<summary>销毁数据</summary>
  43. public static void TypeDrawerDestroy()
  44. {
  45. for (int i = 0; i < typeDrawers.Count; i++)
  46. {
  47. typeDrawers[i].Destroy();
  48. }
  49. }
  50. ///<summary>绘制窗口</summary>
  51. public static void Draw(object obj)
  52. {
  53. FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
  54. EditorGUILayout.BeginVertical();
  55. foreach (FieldInfo fieldInfo in fields)
  56. {
  57. Type type = fieldInfo.FieldType;
  58. if (type.IsDefined(typeof(HideInInspector), false))
  59. {
  60. continue;
  61. }
  62. if (fieldInfo.IsDefined(typeof(HideInInspector), false))
  63. {
  64. continue;
  65. }
  66. object value = fieldInfo.GetValue(obj);
  67. foreach (ITypeDrawer typeDrawer in typeDrawers)
  68. {
  69. if (!typeDrawer.HandlesType(type, value))
  70. {
  71. continue;
  72. }
  73. string fieldName = fieldInfo.Name;
  74. if (fieldName.Length > 17 && fieldName.Contains("k__BackingField"))
  75. {
  76. fieldName = fieldName.Substring(1, fieldName.Length - 17);
  77. }
  78. value = typeDrawer.DrawAndGetNewValue(type, fieldName, value, null);
  79. fieldInfo.SetValue(obj, value);
  80. break;
  81. }
  82. }
  83. EditorGUILayout.EndVertical();
  84. }
  85. }