namespace ChivaXR.Op { using Sirenix.OdinInspector; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; /// /// 操作点管理器 /// public class OperationManager : SerializedMonoSingleton { [TableList(AlwaysExpanded = true, MaxScrollViewHeight = 300)] public List operationDataContainers = new List(); [HideInInspector] public Dictionary operationDatasDic = new Dictionary(); public event OperationDataEventHandle OperationDataChanged; public event OperationDataEventHandle OperationDataValueChanged; public event OperationDataEventHandle OperationDataToggleChanged; public event OperationDataEventHandle OperationDataPlayActive; public event OperationDataEventHandle OperationDataTrigger; private void Awake() { InitOperationEvent(); } private void InitOperationEvent() { for (int i = 0; i < operationDataContainers.Count; i++) { operationDataContainers[i].opData.OperationValueChanged += OnOpDataValueChanged; } } protected void OnOpDataValueChanged(object sender, OperationEventArgs e) { OperationDataChanged?.Invoke(sender, e); switch (e.opData.OperationType) { case OperationDataType.Play: OperationDataPlayActive?.Invoke(sender, e); break; case OperationDataType.Trigger: OperationDataTrigger?.Invoke(sender, e); break; case OperationDataType.Toggle: OperationDataToggleChanged?.Invoke(sender, e); break; case OperationDataType.Value: OperationDataValueChanged?.Invoke(sender, e); break; } } /// /// 添加动画数据 /// /// public bool RegisterOpData(OperationDataBase data) { if (operationDataContainers.Where(s => s.opData == data).Count() == 0) { operationDataContainers.Add(new OpDataContainer(data)); return true; } return false; } /// /// 移除动画数据 /// /// public bool RemoveOpData(OperationDataBase data) { if (operationDataContainers.Where(s => s.opData == data).Count() > 0) { OpDataContainer tempContainer = operationDataContainers.Where(s => s.opData == data).First(); operationDataContainers.Remove(tempContainer); return true; } return false; } private OperationDataBase GetOpDataByName(string name) { if (operationDataContainers.Where(s => s.OpDataName == name).Count() > 0) { return operationDataContainers.Where(s => s.OpDataName == name).First().opData; } return null; } [Button("刷新操作点信息")] public void RefreshDataInfo() { operationDatasDic.Clear(); for (int i = 0; i < operationDataContainers.Count; i++) { operationDataContainers[i].Refresh(); if (operationDatasDic.ContainsKey(operationDataContainers[i].OpDataName)) { Debug.LogError(operationDataContainers[i].OpDataName + "当前操作名称重复"); } else { operationDatasDic.Add(operationDataContainers[i].OpDataName, operationDataContainers[i].opData); } } } public OperationDataBase GetOpData(string opName) { if (operationDatasDic.ContainsKey(opName)) { return operationDatasDic[opName]; } OperationDataBase tempOp = GetOpDataByName(opName); if (tempOp != null) { operationDatasDic.Add(opName, tempOp); return tempOp; } Debug.LogError(opName + "当前操作点未注册"); return null; } } [Serializable] public class OpDataContainer { [ReadOnly] public string OpDataName; [ReadOnly] public string Description; [ReadOnly] public string guid; public OperationDataBase opData; [HideIf("IsToggleData")] public float opValue = 0; [HideInInspector] public string toggleType; [ShowInInspector] [ShowIf("IsToggleData")] [ValueDropdown("GetOpDataToggleTypes")] [GUIColor("ToggleChangedColor")] public string ToggleType { get { return toggleType; } set { if (value != toggleType) { toggleType = value; OperationData_ToggleMode toggleData = opData as OperationData_ToggleMode; opValue = toggleData.toggleGroup.IndexOf(ToggleType); } } } private Color ToggleChangedColor() { if (opData != null && opData.OpValue != opValue) { return new Color(1, 0.7f, 0); } else { return GUI.color; } } private IEnumerable GetOpDataToggleTypes() { if (opData != null && opData.OperationType == OperationDataType.Toggle) { OperationData_ToggleMode toggleData = opData as OperationData_ToggleMode; return toggleData.GetToggleListName(); } return null; } public bool IsToggleData() { return opData.OperationType == OperationDataType.Toggle; } public OpDataContainer(OperationDataBase data) { opData = data; OpDataName = data.operationName; Description = data.operationDescription; guid = data.guid; } public void Refresh() { OpDataName = opData.operationName; Description = opData.operationDescription; opValue = opData.OpValue; if (IsToggleData()) { OperationData_ToggleMode toggleData = opData as OperationData_ToggleMode; toggleType = toggleData.toggleGroup[toggleData.ToggleIndex]; } } [HorizontalGroup("OpState")] [Button("设置状态")] [TableColumnWidth(60)] [GUIColor(0.7f, 1f, 0.7f)] public void SetDataStateValue() { if (opData) { opData.OpValue = opValue; } } } }