using ChivaXR; using Newtonsoft.Json; using Sirenix.OdinInspector; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using UnityEngine; public class AnimationBackFill : MonoBehaviour { #if UNITY_EDITOR [HideInInspector] public string targetOperationDataName; [HideInInspector] public string sourceOperationDataName; [LabelText("倒序动画")] [ShowInInspector] public bool ReverseAnidataBtn = true; [LabelText("动画源")] [ShowInInspector] [ValueDropdown("GetAllOperationDataNames", IsUniqueList = true)] public string OperationDataNameSource { get { return sourceOperationDataName; } set { if (sourceOperationDataName != value) { sourceOperationDataName = value; } } } [LabelText("回装动画")] [ShowInInspector, HideIf("ReverseAnidataBtn")] [ValueDropdown("GetAllOperationDataNames", IsUniqueList = true)] public string OperationDataNameTarget { get { return targetOperationDataName; } set { if (targetOperationDataName != value) { targetOperationDataName = value; } } } private static IEnumerable GetAllOperationDataNames() { return AnimationManager.Instance.animationDatas.Select(s => new ValueDropdownItem(s.AniDataName, s.AniDataName)); } [Button("导入")] [PropertySpace(SpaceBefore=80),HideIf("ReverseAnidataBtn")] public void AddSelectAniData() { if (sourceOperationDataName == "" || targetOperationDataName == "") { return; } AniDataContainer sourceTmpAniDataContainer = AnimationManager.Instance.animationDatas.Where(s => s.AniDataName == sourceOperationDataName).First(); AniDataContainer targeTmpAniDataContainer = AnimationManager.Instance.animationDatas.Where(s => s.AniDataName == targetOperationDataName).First(); if (sourceTmpAniDataContainer != null || targeTmpAniDataContainer != null) { targeTmpAniDataContainer.aniData.AnimationDriverDatas = DeepCopy(sourceTmpAniDataContainer.aniData.AnimationDriverDatas); targeTmpAniDataContainer.aniData.AnimationDriverDatas.Reverse(); try { /* AniDataEditorContainer sourceAnimationEditorDatas = AnimationDataEditor.Instance.animationEditorDatas.Where(s => s.AniName == sourceOperationDataName).First(); AniDataEditorContainer targetAnimationEditorDatas = AnimationDataEditor.Instance.animationEditorDatas.Where(s => s.AniName == targetOperationDataName).First(); targetAnimationEditorDatas.relatGameObjects = sourceAnimationEditorDatas.relatGameObjects;*/ } catch (System.Exception) { } } } [Button("倒序")] [PropertySpace(SpaceBefore = 80), ShowIf("ReverseAnidataBtn")] public void ReverseSelectAniData() { AniDataContainer sourceTmpAniDataContainer = AnimationManager.Instance.animationDatas.Where(s => s.AniDataName == sourceOperationDataName).First(); sourceTmpAniDataContainer.aniData.AnimationDriverDatas.Reverse(); } public List DeepCopy(List original) { if (original == null) return null; var copy = new List(); foreach (var item in original) { if (item != null) { // 使用 JsonUtility 复制每个对象 var json = JsonUtility.ToJson(item); var copiedItem = (AnimationDriverBase)Activator.CreateInstance(item.GetType()); JsonUtility.FromJsonOverwrite(json, copiedItem); copy.Add(copiedItem); } else { copy.Add(null); } } return copy; } #endif }