using System;
|
using System.Reflection;
|
using UnityEngine;
|
using UnityEditor;
|
using UnityEditorInternal;
|
|
public class AnimationCurvePopupMenu
|
{
|
private static AnimationCurve s_ClipBoardAnimationCurve;
|
|
public static void Show(Rect popupRect, AnimationCurve animationCurve, SerializedProperty property)
|
{
|
if (GUI.Button(popupRect, GUIContent.none, "ShurikenDropdown"))
|
{
|
GUIContent content = new GUIContent("Copy");
|
GUIContent content2 = new GUIContent("Paste");
|
GUIContent content3 = new GUIContent("Clear");
|
GenericMenu genericMenu = new GenericMenu();
|
|
if (property != null)
|
{
|
genericMenu.AddItem(content, false, AnimationCurveCallbackCopy, property);
|
genericMenu.AddItem(content2, false, AnimationCurveCallbackPaste, property);
|
genericMenu.AddItem(content3, false, AnimationCurveCallbackClear, property);
|
}
|
else
|
{
|
genericMenu.AddItem(content, false, AnimationCurveCallback2Copy, animationCurve);
|
genericMenu.AddItem(content2, false, AnimationCurveCallback2Paste, animationCurve);
|
genericMenu.AddItem(content3, false, AnimationCurveCallback2Clear, animationCurve);
|
}
|
|
if (!HasClipBoardAnimationCurve())
|
{
|
genericMenu.AddDisabledItem(content2);
|
}
|
genericMenu.DropDown(popupRect);
|
Event.current.Use();
|
}
|
}
|
|
/// <summary>
|
/// 清除检视器界面的曲线缓存,才能刷新新的值
|
/// </summary>
|
public static void AnimationCurvePreviewCacheClearCache()
|
{
|
Assembly assembly = Assembly.GetAssembly(typeof(ReorderableList));
|
Type type = assembly.GetType("UnityEditorInternal.AnimationCurvePreviewCache");
|
MethodInfo clearCache = type.GetMethod("ClearCache", BindingFlags.Static | BindingFlags.Public);
|
if (clearCache != null)
|
{
|
clearCache.Invoke(null, null);
|
}
|
}
|
|
private static bool HasClipBoardAnimationCurve()
|
{
|
return s_ClipBoardAnimationCurve != null;
|
}
|
|
private static void AnimationCurveCallbackCopy(object obj)
|
{
|
SerializedProperty property = (SerializedProperty)obj;
|
s_ClipBoardAnimationCurve = property.animationCurveValue;
|
}
|
|
private static void AnimationCurveCallbackPaste(object obj)
|
{
|
if (s_ClipBoardAnimationCurve == null)
|
{
|
return;
|
}
|
SerializedProperty property = (SerializedProperty)obj;
|
property.serializedObject.Update();
|
property.animationCurveValue = s_ClipBoardAnimationCurve;
|
property.serializedObject.ApplyModifiedProperties();
|
}
|
|
private static void AnimationCurveCallbackClear(object obj)
|
{
|
SerializedProperty property = (SerializedProperty)obj;
|
property.serializedObject.Update();
|
property.animationCurveValue = new AnimationCurve();
|
property.serializedObject.ApplyModifiedProperties();
|
}
|
|
private static void AnimationCurveCallback2Copy(object obj)
|
{
|
AnimationCurve animationCurve = (AnimationCurve)obj;
|
s_ClipBoardAnimationCurve = animationCurve;
|
}
|
|
private static void AnimationCurveCallback2Paste(object obj)
|
{
|
if (s_ClipBoardAnimationCurve == null)
|
{
|
return;
|
}
|
AnimationCurve animationCurve = (AnimationCurve)obj;
|
animationCurve.keys = s_ClipBoardAnimationCurve.keys;
|
animationCurve.postWrapMode = s_ClipBoardAnimationCurve.postWrapMode;
|
animationCurve.preWrapMode = s_ClipBoardAnimationCurve.preWrapMode;
|
AnimationCurvePreviewCacheClearCache();
|
}
|
|
private static void AnimationCurveCallback2Clear(object obj)
|
{
|
AnimationCurve animationCurve = (AnimationCurve)obj;
|
if (animationCurve != null)
|
{
|
for (int i = animationCurve.length - 1; i >= 0; i--)
|
{
|
animationCurve.RemoveKey(i);
|
}
|
AnimationCurvePreviewCacheClearCache();
|
}
|
}
|
}
|