using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Sirenix.OdinInspector;
using System;
using System.Linq;
namespace ChivaXR
{
///
/// 动画数据管理器
///
public class AnimationManager : SerializedMonoSingleton
{
private GameObject animationActiveObj;
public GameObject AnimationActiveObj { get; set; }
[TableList(AlwaysExpanded = true, MaxScrollViewHeight = 300)]
public List animationDatas = new List();
[HideInInspector]
public Dictionary aniDatasDic = new Dictionary();
public void AniDataReName(AniDataContainer aniDataContainer, string reName)
{
aniDataContainer.aniData.aniName = reName;
aniDataContainer.AniDataName = reName; ;
RefreshDataInfo();
}
public void DeletaAniData(AniDataContainer aniDataContainer, string reName)
{
if (aniDataContainer.aniData != null)
{
DestroyImmediate(aniDataContainer.aniData.gameObject);
}
if(animationDatas.Contains(aniDataContainer))
{
animationDatas.Remove(aniDataContainer);
}
RefreshDataInfo();
}
///
/// 播放动画片段
///
///
public void PlayAniData(string aniDataName, Action finishedCallBack = null)
{
if (animationDatas.Where(s => s.AniDataName.Equals(aniDataName)).Count() > 0)
{
AniDataContainer tempAniData = animationDatas.Where(s => s.AniDataName.Equals(aniDataName)).First();
tempAniData.aniData.PlayData(finishedCallBack);
}
else
{
Debug.LogError("无该动画片段--->" + aniDataName);
finishedCallBack?.Invoke();
}
}
///
/// 添加动画数据
///
///
public bool RegisterAniData(AniData data)
{
if (animationDatas.Where(s => s.aniData == data).Count() == 0)
{
animationDatas.Add(new AniDataContainer(data));
RefreshDataInfo();
return true;
}
return false;
}
///
/// 移除动画数据
///
///
public bool RemoveAniData(AniData data)
{
if (animationDatas.Where(s => s.aniData == data).Count() > 0)
{
AniDataContainer tempContainer = animationDatas.Where(s => s.aniData == data).First();
animationDatas.Remove(tempContainer);
RefreshDataInfo();
return true;
}
return false;
}
[Button("刷新动画信息")]
public void RefreshDataInfo()
{
aniDatasDic.Clear();
RefreshDefaultNoAni();
for (int i = 0; i < animationDatas.Count; i++)
{
animationDatas[i].Refresh();
if (animationDatas[i].aniData == null)
{
Debug.LogError(animationDatas[i].AniDataName + "该动画引用丢失,移除AnimationManager");
animationDatas.Remove(animationDatas[i]);
i--;
}
if (aniDatasDic.ContainsKey(animationDatas[i].AniDataName))
{
Debug.LogError(animationDatas[i].AniDataName + "当前操作名称重复");
}
else
{
aniDatasDic.Add(animationDatas[i].AniDataName, animationDatas[i].aniData);
}
}
}
public void RefreshDefaultNoAni()
{
if (animationDatas.Where(s => s.AniDataName == "defalut/无动画").Count() == 0)
{
AniData defalutAni = new GameObject("defalut/无动画").AddComponent();
defalutAni.aniName = "defalut/无动画";
defalutAni.transform.parent = this.transform;
animationDatas.Insert(0, new AniDataContainer(defalutAni));
}
}
private AniData GetAniDataByName(string name)
{
if (animationDatas.Where(s => s.AniDataName == name).Count() > 0)
{
return animationDatas.Where(s => s.AniDataName == name).First().aniData;
}
return null;
}
public AniData GetAniData(string aniName)
{
if (aniDatasDic.ContainsKey(aniName))
{
return aniDatasDic[aniName];
}
AniData tempOp = GetAniDataByName(aniName);
if (tempOp != null)
{
aniDatasDic.Add(aniName, tempOp);
return tempOp;
}
Debug.LogError(aniName + "当前动画名未注册");
return null;
}
[ContextMenu("设置MoveByPath移动时间")]
public void SetAniSpeed()
{
foreach (var item in animationDatas)
{
foreach (var aniDriver in item.aniData.AnimationDriverDatas)
{
if ((aniDriver as AniDriver_MoveByPath) != null)
{
(aniDriver as AniDriver_MoveByPath).duration =2f;
Debug.Log(item.AniDataName + "设置成功");
}else
{
Debug.Log(item.AniDataName +"转换为空");
}
}
}
}
}
[Serializable]
public class AniDataContainer
{
[ReadOnly]
[HideLabel]
[HorizontalGroup("动画信息")]
public string AniDataName;
[ReadOnly]
[HideInInspector]
public string Description;
[HideLabel]
[HorizontalGroup("动画信息")]
public AniData aniData;
public AniDataContainer(AniData data)
{
aniData = data;
AniDataName = data.aniName;
Description = data.aniDescriptioin;
}
public void Refresh()
{
AniDataName = aniData.aniName;
Description = aniData.aniDescriptioin;
}
[TableColumnWidth(60)]
[HorizontalGroup("动画状态")]
[Button("初始状态")]
[GUIColor("InitStateColor")]
public void SetInitState()
{
if (aniData)
{
aniData.SetInitState();
}
}
[TableColumnWidth(60)]
[HorizontalGroup("动画状态")]
[Button("结束状态")]
[GUIColor("FinishedStateColor")]
public void SetFinishedState()
{
if (aniData)
{
aniData.SetFinishedState();
}
}
private Color FinishedStateColor()
{
switch (aniData.currentAniState)
{
case Animation_State.finishedState:
return new Color(0.7f, 1f, 0.7f);
}
return GUI.color;
}
private Color InitStateColor()
{
if (aniData != null)
{
switch (aniData.currentAniState)
{
case Animation_State.initState:
return new Color(0.7f, 1f, 0.7f);
}
}
return GUI.color;
}
}
}