public static class AnimationWindowReflectUtil
{
public static Type CheckTypeString(string typeStr)
{
Type ret = Type.GetType(typeStr + ", UnityEditor");
if (ret == null)
{
ret = Type.GetType("UnityEditor." + typeStr + ", UnityEditor");
}
if (ret == null)
{
ret = Type.GetType("UnityEditorInternal." + typeStr + ", UnityEditor");
}
if (ret == null)
{
ret = Type.GetType(typeStr + ", Assembly-CSharp-firstpass");
}
if (ret == null)
{
UnityEngine.Debug.Log(string.Format("Cannot find {0}", typeStr));
return null;
}
return ret;
}
public static System.Reflection.MethodInfo CheckTypeMethod(Type type, string methodName)
{
return type.GetMethod(methodName);
}
public static System.Reflection.MethodInfo CheckTypeMethod(
Type type,
string methodName,
System.Reflection.BindingFlags bindingAttr
)
{
return type.GetMethod(methodName, bindingAttr);
}
public static System.Reflection.PropertyInfo CheckTypeProperty(Type type, string fieldName)
{
return type.GetProperty(
fieldName,
System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.SetField | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Instance
);
}
public static AnimationClip GetAnimEditorAnimationClip()
{
AnimationClip animationClip = null;
Type typeAnimEditor = CheckTypeString("AnimEditor");
if (null != typeAnimEditor)
{
System.Reflection.MethodInfo method = CheckTypeMethod(typeAnimEditor, "GetAllAnimationWindows");
if (null != method)
{
object obj = method.Invoke(null, null);
System.Collections.IEnumerable objEnm = obj as System.Collections.IEnumerable;
System.Collections.IEnumerator curIte = objEnm.GetEnumerator();
curIte.MoveNext();
object curAnimEditor = curIte.Current;
System.Reflection.PropertyInfo propertyState = CheckTypeProperty(typeAnimEditor, "state");
if (null != propertyState)
{
object fieldValueState = propertyState.GetValue(curAnimEditor, null);
Type animationWindowStateType = CheckTypeString("AnimationWindowState");
if (null != animationWindowStateType)
{
System.Reflection.PropertyInfo propertyAnimationClip = CheckTypeProperty(animationWindowStateType, "activeAnimationClip");
if (null != propertyAnimationClip)
{
object animationClipValue = propertyAnimationClip.GetValue(fieldValueState, null);
animationClip = animationClipValue as AnimationClip;
UnityEngine.Debug.Log(string.Format("find animationClip"));
}
}
}
}
}
return animationClip;
}
// 获取当前编辑器时间
public static float GetAnimEditorTimeSec()
{
float time = 0;
Type typeAnimEditor = CheckTypeString("AnimEditor");
if (null != typeAnimEditor)
{
System.Reflection.MethodInfo method = CheckTypeMethod(typeAnimEditor, "GetAllAnimationWindows");
if (null != method)
{
object obj = method.Invoke(null, null);
System.Collections.IEnumerable objEnm = obj as System.Collections.IEnumerable;
System.Collections.IEnumerator curIte = objEnm.GetEnumerator();
if (curIte.MoveNext())
{
object curAnimEditor = curIte.Current;
System.Reflection.PropertyInfo propertyControlInterface = CheckTypeProperty(typeAnimEditor, "controlInterface");
if (null != propertyControlInterface)
{
object fieldValueControl = propertyControlInterface.GetValue(curAnimEditor, null);
Type animationWindowControlType = CheckTypeString("AnimationWindowControl");
if (null != animationWindowControlType)
{
System.Reflection.PropertyInfo propertyTime = CheckTypeProperty(animationWindowControlType, "time");
if (null != propertyTime)
{
object timeValue = propertyTime.GetValue(fieldValueControl, null);
Type animationKeyTimeType = CheckTypeString("AnimationKeyTime");
if (null != animationKeyTimeType)
{
System.Reflection.PropertyInfo propertyFloatTime = CheckTypeProperty(animationKeyTimeType, "time");
if (null != propertyFloatTime)
{
object timeValueObject = propertyFloatTime.GetValue(timeValue, null);
time = (float)timeValueObject;
}
}
}
}
}
}
}
}
return time;
}
}