ValueBase.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using UnityEngine;
  5. namespace Model
  6. {
  7. [Serializable]
  8. public class ValueBase
  9. {
  10. public IConvertible Convertivle;
  11. public string enumValue;
  12. public string StringValue;
  13. public bool BooleanValue;
  14. public int Int32Value;
  15. public long Int64Value;
  16. public float SingleValue;
  17. public double DoubleValue;
  18. public int[] Int32Array;
  19. public long[] Int64Array;
  20. public string[] StringArray;
  21. public float[] SingleArray;
  22. public double[] DoubleArray;
  23. public GameObject GameObjectValue;
  24. public AudioClip AudioClipValue;
  25. public Material MaterialValue;
  26. public Shader ShaderValue;
  27. public Texture TextureValue;
  28. public Texture2D Texture2DValue;
  29. public Texture3D Texture3DValue;
  30. public Sprite SpriteValue;
  31. public GameObject[] GameObjectArray;
  32. public AudioClip[] AudioClipArray;
  33. public Material[] MaterialArray;
  34. public Shader[] ShaderArray;
  35. public Texture [] TextureArray;
  36. public Texture2D [] Texture2DArray;
  37. public Texture3D [] Texture3DArray;
  38. public Sprite [] SpriteArray;
  39. public ValueBase()
  40. {
  41. }
  42. public static ValueBase Clone(ValueBase source)
  43. {
  44. ValueBase v = new ValueBase();
  45. FieldInfo[] infos = source.GetType().GetFields();
  46. foreach (FieldInfo info in infos)
  47. {
  48. object value;
  49. if (info.FieldType.IsSubclassOf(typeof(Array)))
  50. {
  51. Array sourceArray = (Array)info.GetValue(source);
  52. if (sourceArray == null)
  53. {
  54. continue;
  55. }
  56. Array dest = Array.CreateInstance(info.FieldType.GetElementType(), sourceArray.Length);
  57. Array.Copy(sourceArray, dest, dest.Length);
  58. value = dest;
  59. }
  60. else
  61. {
  62. value = info.GetValue(source);
  63. }
  64. info.SetValue(v, value);
  65. }
  66. return v;
  67. }
  68. public object GetValueByType(Type type)
  69. {
  70. try
  71. {
  72. FieldInfo fieldInfo = GetFieldInfo(type);
  73. if (BehaviorTreeArgsDict.IsEnumType(type))
  74. {
  75. Enum value;
  76. if (string.IsNullOrEmpty(enumValue))
  77. {
  78. value = GetDefaultEnumValue(type);
  79. }
  80. else
  81. {
  82. value = (Enum)Enum.Parse(type, enumValue);
  83. }
  84. return value;
  85. }
  86. else if (BehaviorTreeArgsDict.IsStringType(type))
  87. {
  88. if (string.IsNullOrEmpty(StringValue))
  89. {
  90. StringValue = enumValue;
  91. return StringValue;
  92. }
  93. }
  94. return fieldInfo.GetValue(this);
  95. }
  96. catch (Exception err)
  97. {
  98. throw new GameException($"行为树报错:{err}");
  99. }
  100. }
  101. private Enum GetDefaultEnumValue(Type type)
  102. {
  103. Array array = Enum.GetValues(type);
  104. Enum value = (Enum)array.GetValue(0);
  105. return value;
  106. }
  107. public void SetValueByType(Type type,object value)
  108. {
  109. if (type == null)
  110. {
  111. return;
  112. }
  113. FieldInfo field = GetFieldInfo(type);
  114. if (BehaviorTreeArgsDict.IsMaterialArrayType(field.FieldType))
  115. {
  116. field.SetValue(this, BehaviorTreeArgsDict.ConvertToMaterialArray((UnityEngine.Object [])value));
  117. }
  118. else if (BehaviorTreeArgsDict.IsGameObjectArrayType(field.FieldType))
  119. {
  120. field.SetValue(this, BehaviorTreeArgsDict.ConvertToGameObjectArray((UnityEngine.Object[])value));
  121. }
  122. else if (BehaviorTreeArgsDict.IsTextureArrayType(field.FieldType))
  123. {
  124. field.SetValue(this, BehaviorTreeArgsDict.ConvertToTextureArray((UnityEngine.Object[])value));
  125. }
  126. else if (BehaviorTreeArgsDict.IsTexture2DArrayType(field.FieldType))
  127. {
  128. field.SetValue(this, BehaviorTreeArgsDict.ConvertToTexture2DArray((UnityEngine.Object[])value));
  129. }
  130. else if (BehaviorTreeArgsDict.IsTexture3DArrayType(field.FieldType))
  131. {
  132. field.SetValue(this, BehaviorTreeArgsDict.ConvertToTexture3DArray((UnityEngine.Object[])value));
  133. }
  134. else if (BehaviorTreeArgsDict.IsShaderArrayType(field.FieldType))
  135. {
  136. field.SetValue(this, BehaviorTreeArgsDict.ConvertToShaderArray((UnityEngine.Object[])value));
  137. }
  138. else if (BehaviorTreeArgsDict.IsAudioClipArrayType(field.FieldType))
  139. {
  140. field.SetValue(this, BehaviorTreeArgsDict.ConvertToAudioClipArray((UnityEngine.Object[])value));
  141. }
  142. else if (BehaviorTreeArgsDict.IsSpriteArrayType(field.FieldType))
  143. {
  144. field.SetValue(this, BehaviorTreeArgsDict.ConvertToSpriteArray((UnityEngine.Object[])value));
  145. }
  146. else
  147. {
  148. field.SetValue(this, value);
  149. }
  150. }
  151. private FieldInfo GetFieldInfo(Type type)
  152. {
  153. string fieldName;
  154. if (BehaviorTreeArgsDict.IsEnumType(type))
  155. {
  156. fieldName = "enumValue";
  157. }
  158. else if (type.IsArray)
  159. {
  160. fieldName = type.GetElementType() + "Array";
  161. }
  162. else
  163. {
  164. fieldName = type.Name + "Value";
  165. }
  166. fieldName = RemovePrefix(fieldName);
  167. FieldInfo fieldInfo = GetType().GetField(fieldName);
  168. return fieldInfo;
  169. }
  170. private string RemovePrefix(string fieldName)
  171. {
  172. string enginePrefix = "UnityEngine.";
  173. int engineIndex = fieldName.IndexOf(enginePrefix);
  174. if (engineIndex != -1)
  175. {
  176. fieldName = fieldName.Remove(engineIndex, enginePrefix.Length);
  177. }
  178. string systemPrefix = "System.";
  179. int systemIndex = fieldName.IndexOf(systemPrefix);
  180. if (systemIndex != -1)
  181. {
  182. fieldName = fieldName.Remove(systemIndex, systemPrefix.Length);
  183. }
  184. return fieldName;
  185. }
  186. }
  187. }