Files
MinFt/Client/Assets/Editor/CampTool/CampToolAddKey.cs
Liubing\LB 3d8d4d18f3 first commit
先修复一下,错误的场景

删除不必要的钓场资产

修复into场景

update:更新meta文件,修复报错

update:修复资源

修复第一章节建造

修复建造第三章

update:删除多余内容

update:更新README.md

update:还原图标

update:更新README

update:更新配置
2026-04-28 02:17:22 +08:00

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.");
}
}