using System; using UnityEditor; using UnityEngine; [Serializable] public class CampToolAddKeyData { public AnimationClip animationClip; public float addTime; } public class CampToolAddKey : EditorWindow { [MenuItem("Window/CampTool/Animation Clips Add Key")] public static void OpenCameraAddKeyaddKeyDataWindow() { GetWindow("Animation Add Key"); } public float defaultAddTime = 2; Vector2 scrollPosition; [SerializeField] private CampToolAddKeyData[] addKeyData = new CampToolAddKeyData[0]; private void OnGUI() { GUILayout.Label("Animation Add Key", EditorStyles.boldLabel); //显示 defaultAddTime defaultAddTime = EditorGUILayout.FloatField("defaultAddTime", defaultAddTime); if (GUILayout.Button("Add Key Data")) { Array.Resize(ref addKeyData, addKeyData.Length + 1); CampToolAddKeyData campToolAddKeyData = new CampToolAddKeyData(); campToolAddKeyData.addTime = defaultAddTime; addKeyData[addKeyData.Length - 1] = campToolAddKeyData; } //显示在一个滑动框中 scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); for (int i = 0; i < addKeyData.Length; i++) { EditorGUILayout.BeginVertical("box"); addKeyData[i].animationClip = (AnimationClip)EditorGUILayout.ObjectField("Animation Clip", addKeyData[i].animationClip, typeof(AnimationClip), false); addKeyData[i].addTime = EditorGUILayout.FloatField("Add Time", addKeyData[i].addTime); if (GUILayout.Button("Remove")) { RemoveAt(ref addKeyData, i); } EditorGUILayout.EndVertical(); } EditorGUILayout.EndScrollView(); // Button to scale animation clips if (GUILayout.Button("Add Key")) { AddKeyData(addKeyData); } } private void RemoveAt(ref CampToolAddKeyData[] array, int index) { for (int i = index; i < array.Length - 1; i++) { array[i] = array[i + 1]; } Array.Resize(ref array, array.Length - 1); } private void AddKeyData(CampToolAddKeyData[] data) { if (data == null || data.Length == 0) { Debug.LogWarning("No animation clips selected."); return; } foreach (var item in data) { AnimationClip newAni = item.animationClip; EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(newAni); for (int j = 0; j < bindings.Length; j++) { var binding = bindings[j]; AnimationCurve curve = AnimationUtility.GetEditorCurve(newAni, binding); // 获取关键帧的数量 int keyCount = curve.keys.Length; if (keyCount > 2) { AnimationCurve newCurve = new AnimationCurve(); newCurve.AddKey(curve[0]); for (int k = 1; k < keyCount - 1; k++) { newCurve.AddKey(curve[k]); float startTime = curve[k].time; float endTime = curve.keys[k + 1].time; float differenceTime = endTime - startTime; float startValue = curve[k].value; float endValue = curve.keys[k + 1].value; float differenceValue = endValue - startValue; float curTime = 0; float curValue; while (curTime < differenceTime) { curTime += item.addTime; curValue = startValue + curTime / differenceTime * differenceValue; Keyframe keyframe = new Keyframe(curTime + startTime, curValue, 0, 0); newCurve.AddKey(keyframe); } newCurve.AddKey(curve[k + 1]); } AnimationUtility.SetEditorCurve(newAni, binding, newCurve); } } EditorUtility.SetDirty(newAni); } AssetDatabase.SaveAssets(); Debug.Log("Animation successfully."); } }