OperationManager.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. namespace ChivaXR.Op
  2. {
  3. using Sirenix.OdinInspector;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using UnityEngine;
  9. /// <summary>
  10. /// 操作点管理器
  11. /// </summary>
  12. public class OperationManager : SerializedMonoSingleton<OperationManager>
  13. {
  14. [TableList(AlwaysExpanded = true, MaxScrollViewHeight = 300)]
  15. public List<OpDataContainer> operationDataContainers = new List<OpDataContainer>();
  16. [HideInInspector]
  17. public Dictionary<string, OperationDataBase> operationDatasDic = new Dictionary<string, OperationDataBase>();
  18. public event OperationDataEventHandle OperationDataChanged;
  19. public event OperationDataEventHandle OperationDataValueChanged;
  20. public event OperationDataEventHandle OperationDataToggleChanged;
  21. public event OperationDataEventHandle OperationDataPlayActive;
  22. public event OperationDataEventHandle OperationDataTrigger;
  23. private void Awake()
  24. {
  25. InitOperationEvent();
  26. }
  27. private void InitOperationEvent()
  28. {
  29. for (int i = 0; i < operationDataContainers.Count; i++)
  30. {
  31. operationDataContainers[i].opData.OperationValueChanged += OnOpDataValueChanged;
  32. }
  33. }
  34. protected void OnOpDataValueChanged(object sender, OperationEventArgs e)
  35. {
  36. OperationDataChanged?.Invoke(sender, e);
  37. switch (e.opData.OperationType)
  38. {
  39. case OperationDataType.Play:
  40. OperationDataPlayActive?.Invoke(sender, e);
  41. break;
  42. case OperationDataType.Trigger:
  43. OperationDataTrigger?.Invoke(sender, e);
  44. break;
  45. case OperationDataType.Toggle:
  46. OperationDataToggleChanged?.Invoke(sender, e);
  47. break;
  48. case OperationDataType.Value:
  49. OperationDataValueChanged?.Invoke(sender, e);
  50. break;
  51. }
  52. }
  53. /// <summary>
  54. /// 添加动画数据
  55. /// </summary>
  56. /// <param name="data"></param>
  57. public bool RegisterOpData(OperationDataBase data)
  58. {
  59. if (operationDataContainers.Where(s => s.opData == data).Count() == 0)
  60. {
  61. operationDataContainers.Add(new OpDataContainer(data));
  62. return true;
  63. }
  64. return false;
  65. }
  66. /// <summary>
  67. /// 移除动画数据
  68. /// </summary>
  69. /// <param name="data"></param>
  70. public bool RemoveOpData(OperationDataBase data)
  71. {
  72. if (operationDataContainers.Where(s => s.opData == data).Count() > 0)
  73. {
  74. OpDataContainer tempContainer = operationDataContainers.Where(s => s.opData == data).First();
  75. operationDataContainers.Remove(tempContainer);
  76. return true;
  77. }
  78. return false;
  79. }
  80. private OperationDataBase GetOpDataByName(string name)
  81. {
  82. if (operationDataContainers.Where(s => s.OpDataName == name).Count() > 0)
  83. {
  84. return operationDataContainers.Where(s => s.OpDataName == name).First().opData;
  85. }
  86. return null;
  87. }
  88. [Button("刷新操作点信息")]
  89. public void RefreshDataInfo()
  90. {
  91. operationDatasDic.Clear();
  92. for (int i = 0; i < operationDataContainers.Count; i++)
  93. {
  94. operationDataContainers[i].Refresh();
  95. if (operationDatasDic.ContainsKey(operationDataContainers[i].OpDataName))
  96. {
  97. Debug.LogError(operationDataContainers[i].OpDataName + "当前操作名称重复");
  98. }
  99. else
  100. {
  101. operationDatasDic.Add(operationDataContainers[i].OpDataName, operationDataContainers[i].opData);
  102. }
  103. }
  104. }
  105. public OperationDataBase GetOpData(string opName)
  106. {
  107. if (operationDatasDic.ContainsKey(opName))
  108. {
  109. return operationDatasDic[opName];
  110. }
  111. OperationDataBase tempOp = GetOpDataByName(opName);
  112. if (tempOp != null)
  113. {
  114. operationDatasDic.Add(opName, tempOp);
  115. return tempOp;
  116. }
  117. Debug.LogError(opName + "当前操作点未注册");
  118. return null;
  119. }
  120. }
  121. [Serializable]
  122. public class OpDataContainer
  123. {
  124. [ReadOnly]
  125. public string OpDataName;
  126. [ReadOnly]
  127. public string Description;
  128. [ReadOnly]
  129. public string guid;
  130. public OperationDataBase opData;
  131. [HideIf("IsToggleData")]
  132. public float opValue = 0;
  133. [HideInInspector]
  134. public string toggleType;
  135. [ShowInInspector]
  136. [ShowIf("IsToggleData")]
  137. [ValueDropdown("GetOpDataToggleTypes")]
  138. [GUIColor("ToggleChangedColor")]
  139. public string ToggleType
  140. {
  141. get { return toggleType; }
  142. set
  143. {
  144. if (value != toggleType)
  145. {
  146. toggleType = value;
  147. OperationData_ToggleMode toggleData = opData as OperationData_ToggleMode;
  148. opValue = toggleData.toggleGroup.IndexOf(ToggleType);
  149. }
  150. }
  151. }
  152. private Color ToggleChangedColor()
  153. {
  154. if (opData != null && opData.OpValue != opValue)
  155. {
  156. return new Color(1, 0.7f, 0);
  157. }
  158. else
  159. {
  160. return GUI.color;
  161. }
  162. }
  163. private IEnumerable GetOpDataToggleTypes()
  164. {
  165. if (opData != null && opData.OperationType == OperationDataType.Toggle)
  166. {
  167. OperationData_ToggleMode toggleData = opData as OperationData_ToggleMode;
  168. return toggleData.GetToggleListName();
  169. }
  170. return null;
  171. }
  172. public bool IsToggleData()
  173. {
  174. return opData.OperationType == OperationDataType.Toggle;
  175. }
  176. public OpDataContainer(OperationDataBase data)
  177. {
  178. opData = data;
  179. OpDataName = data.operationName;
  180. Description = data.operationDescription;
  181. guid = data.guid;
  182. }
  183. public void Refresh()
  184. {
  185. OpDataName = opData.operationName;
  186. Description = opData.operationDescription;
  187. opValue = opData.OpValue;
  188. if (IsToggleData())
  189. {
  190. OperationData_ToggleMode toggleData = opData as OperationData_ToggleMode;
  191. toggleType = toggleData.toggleGroup[toggleData.ToggleIndex];
  192. }
  193. }
  194. [HorizontalGroup("OpState")]
  195. [Button("设置状态")]
  196. [TableColumnWidth(60)]
  197. [GUIColor(0.7f, 1f, 0.7f)]
  198. public void SetDataStateValue()
  199. {
  200. if (opData)
  201. {
  202. opData.OpValue = opValue;
  203. }
  204. }
  205. }
  206. }