123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- namespace ChivaXR.Op
- {
- using Sirenix.OdinInspector;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- /// <summary>
- /// 操作点管理器
- /// </summary>
- public class OperationManager : SerializedMonoSingleton<OperationManager>
- {
- [TableList(AlwaysExpanded = true, MaxScrollViewHeight = 300)]
- public List<OpDataContainer> operationDataContainers = new List<OpDataContainer>();
- [HideInInspector]
- public Dictionary<string, OperationDataBase> operationDatasDic = new Dictionary<string, OperationDataBase>();
- 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;
- }
- }
- /// <summary>
- /// 添加动画数据
- /// </summary>
- /// <param name="data"></param>
- public bool RegisterOpData(OperationDataBase data)
- {
- if (operationDataContainers.Where(s => s.opData == data).Count() == 0)
- {
- operationDataContainers.Add(new OpDataContainer(data));
- return true;
- }
- return false;
- }
- /// <summary>
- /// 移除动画数据
- /// </summary>
- /// <param name="data"></param>
- 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;
- }
- }
- }
- }
|