125 lines
4.3 KiB
C#
125 lines
4.3 KiB
C#
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<CampToolAddKey>("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.");
|
|
}
|
|
|
|
}
|
|
|