Unity 框架

LanguageInspector.cs 4.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System.Collections;
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. using UnityEditor;
  5. using UnityEditorInternal;
  6. using System;
  7. using System.Reflection;
  8. namespace TFramework
  9. {
  10. [CustomEditor(typeof(LanguageData))]
  11. public class LanguageDataInspector : TEditor
  12. {
  13. SerializedProperty m_languageType;
  14. SerializedProperty m_languages;
  15. ReorderableList languageList;
  16. List<string> languageTypes = new List<string>();
  17. int selectType = 0;
  18. Type currentType;
  19. LanguageData languageData;
  20. private void OnEnable()
  21. {
  22. m_languageType = serializedObject.FindProperty("m_languageType");
  23. m_languages = serializedObject.FindProperty("m_languages");
  24. languageData = target as LanguageData;
  25. currentType = GlobalTool.GetTypesInRunTimeAssemblies(type => type.FullName == m_languageType.stringValue)[0];
  26. languageList = new ReorderableList(languageData.m_languages, currentType, true, true, true, true);
  27. foreach (var item in GlobalTool.GetTypesInRunTimeAssemblies(type =>
  28. type==typeof(Language) || (type.IsSubclassOf(typeof(Language)) || (type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(Language)))
  29. && type.IsClass))
  30. {
  31. languageTypes.Add(item.FullName);
  32. }
  33. languageList.elementHeight = currentType.GetFields().Length * 23;
  34. languageList.drawElementCallback = (rect, index, isActive, isFocused) =>
  35. {
  36. serializedObject.Update();
  37. FieldInfo[] fields = (target as LanguageData).m_languages[index]?.GetType()?.GetFields();
  38. Rect rect1 = Rect.zero;
  39. if(fields!=null)
  40. for (int i = 0; i < fields.Length; i++)
  41. {
  42. LanguageAttribute attribute = fields[i].GetCustomAttribute<LanguageAttribute>();
  43. string label = attribute == null ? fields[i].Name : attribute.LanguageType;
  44. rect1.Set(rect.x, rect.y+i*23, 50, 20);
  45. GUI.Label(rect1, label);
  46. rect1.Set(rect.x + 50, rect.y + i * 23, rect.width - 53, 20);
  47. string value = fields[i].GetValue((target as LanguageData).m_languages[index])?.ToString();
  48. string newValue = EditorGUI.TextField(rect1, value);
  49. if(newValue!=value)
  50. {
  51. fields[i].SetValue((target as LanguageData).m_languages[index], newValue);
  52. }
  53. }
  54. serializedObject.ApplyModifiedProperties();
  55. };
  56. languageList.onAddCallback = list =>
  57. {
  58. serializedObject.Update();
  59. list.index = (target as LanguageData).m_languages.Count;
  60. (target as LanguageData).m_languages.Add(currentType.Assembly.CreateInstance(m_languageType.stringValue) as Language);
  61. serializedObject.ApplyModifiedProperties();
  62. };
  63. }
  64. public override void OnInspectorGUI()
  65. {
  66. //base.OnInspectorGUI();
  67. serializedObject.Update();
  68. using(new EditorGUILayout.HorizontalScope())
  69. {
  70. GUI.enabled = !(languageData.m_languages != null && languageData.m_languages.Count > 0);
  71. GUILayout.Label("语言数据类型:");
  72. selectType = languageTypes.IndexOf(m_languageType.stringValue);
  73. selectType = selectType == -1 ? 0 : selectType;
  74. selectType = EditorGUILayout.Popup(selectType, languageTypes.ToArray());
  75. if(m_languageType.stringValue!=languageTypes[selectType])
  76. {
  77. m_languageType.stringValue = languageTypes[selectType];
  78. }
  79. GUI.enabled=true;
  80. }
  81. languageList.DoLayoutList();
  82. serializedObject.ApplyModifiedProperties();
  83. }
  84. }
  85. }