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;
}
}
}
}