SRMonoBehaviourEx.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using SRF.Helpers;
  5. using SRF.Service;
  6. using UnityEngine;
  7. namespace SRF
  8. {
  9. public abstract class SRMonoBehaviourEx : SRMonoBehaviour
  10. {
  11. private static void CheckFields(SRMonoBehaviourEx instance, bool justSet = false)
  12. {
  13. if (SRMonoBehaviourEx._checkedFields == null)
  14. {
  15. SRMonoBehaviourEx._checkedFields = new Dictionary<Type, IList<SRMonoBehaviourEx.FieldInfo>>();
  16. }
  17. Type type = instance.GetType();
  18. IList<SRMonoBehaviourEx.FieldInfo> list;
  19. if (!SRMonoBehaviourEx._checkedFields.TryGetValue(instance.GetType(), out list))
  20. {
  21. list = SRMonoBehaviourEx.ScanType(type);
  22. SRMonoBehaviourEx._checkedFields.Add(type, list);
  23. }
  24. SRMonoBehaviourEx.PopulateObject(list, instance, justSet);
  25. }
  26. private static void PopulateObject(IList<SRMonoBehaviourEx.FieldInfo> cache, SRMonoBehaviourEx instance, bool justSet)
  27. {
  28. for (int i = 0; i < cache.Count; i++)
  29. {
  30. SRMonoBehaviourEx.FieldInfo fieldInfo = cache[i];
  31. if (EqualityComparer<object>.Default.Equals(fieldInfo.Field.GetValue(instance), null))
  32. {
  33. if (fieldInfo.Import)
  34. {
  35. Type type = fieldInfo.ImportType ?? fieldInfo.Field.FieldType;
  36. object service = SRServiceManager.GetService(type);
  37. if (service == null)
  38. {
  39. UnityEngine.Debug.LogWarning("Field {0} import failed (Type {1})".Fmt(new object[]
  40. {
  41. fieldInfo.Field.Name,
  42. type
  43. }));
  44. }
  45. else
  46. {
  47. fieldInfo.Field.SetValue(instance, service);
  48. }
  49. }
  50. else
  51. {
  52. if (fieldInfo.AutoSet)
  53. {
  54. Component component = instance.GetComponent(fieldInfo.Field.FieldType);
  55. if (!EqualityComparer<object>.Default.Equals(component, null))
  56. {
  57. fieldInfo.Field.SetValue(instance, component);
  58. goto IL_14F;
  59. }
  60. }
  61. if (!justSet)
  62. {
  63. if (fieldInfo.AutoCreate)
  64. {
  65. Component value = instance.CachedGameObject.AddComponent(fieldInfo.Field.FieldType);
  66. fieldInfo.Field.SetValue(instance, value);
  67. }
  68. throw new UnassignedReferenceException("Field {0} is unassigned, but marked with RequiredFieldAttribute".Fmt(new object[]
  69. {
  70. fieldInfo.Field.Name
  71. }));
  72. }
  73. }
  74. }
  75. IL_14F:;
  76. }
  77. }
  78. private static List<SRMonoBehaviourEx.FieldInfo> ScanType(Type t)
  79. {
  80. List<SRMonoBehaviourEx.FieldInfo> list = new List<SRMonoBehaviourEx.FieldInfo>();
  81. RequiredFieldAttribute attribute = SRReflection.GetAttribute<RequiredFieldAttribute>(t);
  82. System.Reflection.FieldInfo[] fields = t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
  83. foreach (System.Reflection.FieldInfo fieldInfo in fields)
  84. {
  85. RequiredFieldAttribute attribute2 = SRReflection.GetAttribute<RequiredFieldAttribute>(fieldInfo);
  86. ImportAttribute attribute3 = SRReflection.GetAttribute<ImportAttribute>(fieldInfo);
  87. if (attribute != null || attribute2 != null || attribute3 != null)
  88. {
  89. SRMonoBehaviourEx.FieldInfo item = default(SRMonoBehaviourEx.FieldInfo);
  90. item.Field = fieldInfo;
  91. if (attribute3 != null)
  92. {
  93. item.Import = true;
  94. item.ImportType = attribute3.Service;
  95. }
  96. else if (attribute2 != null)
  97. {
  98. item.AutoSet = attribute2.AutoSearch;
  99. item.AutoCreate = attribute2.AutoCreate;
  100. }
  101. else
  102. {
  103. item.AutoSet = attribute.AutoSearch;
  104. item.AutoCreate = attribute.AutoCreate;
  105. }
  106. list.Add(item);
  107. }
  108. }
  109. return list;
  110. }
  111. protected virtual void Awake()
  112. {
  113. SRMonoBehaviourEx.CheckFields(this, false);
  114. }
  115. protected virtual void Start()
  116. {
  117. }
  118. protected virtual void Update()
  119. {
  120. }
  121. protected virtual void FixedUpdate()
  122. {
  123. }
  124. protected virtual void OnEnable()
  125. {
  126. }
  127. protected virtual void OnDisable()
  128. {
  129. }
  130. protected virtual void OnDestroy()
  131. {
  132. }
  133. private static Dictionary<Type, IList<SRMonoBehaviourEx.FieldInfo>> _checkedFields;
  134. private struct FieldInfo
  135. {
  136. public bool AutoCreate;
  137. public bool AutoSet;
  138. public System.Reflection.FieldInfo Field;
  139. public bool Import;
  140. public Type ImportType;
  141. }
  142. }
  143. }