C# 反射

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;
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值