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