U3d 反射调用方法工具

在这里插入图片描述
我们写代码,在自己业务中在GUI写上调用方法,运行时再点击一下,这样很麻烦(废力去写调用方法在GUI中,等编译,用完又删)
现直接使用此工具,可以是私有方法,参数可以是类
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;
using Random = System.Random;

public class MethodEditor : EditorWindow
{
    [MenuItem("Tools/反射")]
    public static void ShowAsset()
    {
        EditorWindow.GetWindow<MethodEditor>(false);
    }

    private string mClassName;
    private string mMethodName;
    private ParameterInfo[] mParamsInfo;
    List<object> mParamsGUI = new List<object>();
    List<string> mParamsNames = new List<string>();

    void ShowLabel(string str)
    {
        this.ShowNotification(new GUIContent(str));
    }

    void TestOne()
    {
        EditorGUILayout.BeginVertical("Box");
        {
            mClassName = EditorGUILayout.TextField("类名:", mClassName);
            mMethodName = EditorGUILayout.TextField("方法名:", mMethodName);
            if (GUILayout.Button("执行", GUILayout.Height(30)))
            {
                mParamsGUI.Clear();
                mParamsNames.Clear();
                if (PlayerPrefs.HasKey(GetType().Name) == false)
                    Debug.Log("此程序集=" + Assembly.GetExecutingAssembly().FullName);
                PlayerPrefs.SetString(GetType().Name, GetType().Name);
                if (string.IsNullOrEmpty(mClassName) || string.IsNullOrEmpty(mMethodName)) return;
                try
                {
                    var tAsb = Assembly.Load("Assembly-CSharp");
                    var tType = tAsb.GetType(mClassName);
                    var tMethod = tType.GetMethod(mMethodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                    var tObj = Activator.CreateInstance(tType);
                    mParamsInfo = tMethod.GetParameters();
                    if (mParamsInfo.Length == 0)
                    {
                        tMethod.Invoke(tObj, null);
                        ShowLabel("无参数,已调用方法");
                    }
                    for (int i = 0; i < mParamsInfo.Length; i++)
                    {
                        if (tAsb.GetType(mParamsInfo[i].ParameterType.Name) == null)
                        {//基础参数
                            AddParamsGUI(mParamsInfo[i].Name, mParamsInfo[i].ParameterType);
                        }
                        else
                        {//参数是对象类型的
                            var tParamsClass = tAsb.GetType(mParamsInfo[i].ParameterType.Name);
                            var tFields = tParamsClass.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public);
                            foreach (var item in tFields)
                            {
                                AddParamsGUI(item.Name, item.FieldType, "-类" + tParamsClass.ToString() + "," + mParamsInfo[i].Name);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Debug.LogError("异常了--查看类名.方法.参数");
                }
            }
            if (mParamsInfo != null && mParamsInfo.Length > 0)//参数 展现 填值
            {
                string s = "";
                for (int i = 0; i < mParamsNames.Count; i++)//展现
                {
                    string temp = "";
                    if (mParamsNames[i].Contains("-"))
                    {
                        temp = mParamsNames[i].Split('-')[1];
                        if (s != temp)
                            GUILayout.Label("------" + temp + "--------");
                        ShowParamsGUI(i);
                    }
                    else
                    {
                        temp = UnityEngine.Random.Range(0, 10000).ToString();
                        ShowParamsGUI(i);
                    }
                    s = temp;
                }
                if (GUILayout.Button("有参数,得调用参数", GUILayout.Height(27)))//填值
                {
                    var tAsb = Assembly.Load("Assembly-CSharp");
                    var tType = tAsb.GetType(mClassName);
                    var tMethod = tType.GetMethod(mMethodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                    object tPObj = null;//参数对象实类
                    List<object> tParams = new List<object>();
                    int index = 0;
                    for (int i = 0; i < mParamsInfo.Length; i++)
                    {
                        if (tAsb.GetType(mParamsInfo[i].ParameterType.Name) != null)
                        {
                            var tPObjDto = tAsb.GetType(mParamsInfo[i].ParameterType.Name);
                            tPObj = Activator.CreateInstance(tPObjDto);
                            var tFields = tPObjDto.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public);
                            for (int j = 0; j < tFields.Length; j++)
                            {
                                SetFieldValue(tPObj, tFields[j].Name, mParamsGUI[index]);
                                index++;
                            }
                            tParams.Add(tPObj);
                        }
                        else
                        {
                            index++;
                            tParams.Add(mParamsGUI[i]);
                        }
                    }
                    var tObj = Activator.CreateInstance(tType);
                    if (tPObj == null)
                    {//基础类型.无类参数                      
                        tMethod.Invoke(tObj, mParamsGUI.ToArray());
                    }
                    else
                    {
                        tMethod.Invoke(tObj, tParams.ToArray());
                    }
                    ShowLabel("有参数方法,已调用方法");
                }
            }
        }
        EditorGUILayout.EndVertical();
    }

    void ShowParamsGUI(int i)
    {
        EditorGUIUtility.labelWidth = 120;
        string label = mParamsNames[i];
        if (mParamsNames[i].Contains("-"))
            label = mParamsNames[i].Split('-')[0];
        if (mParamsGUI[i] is string)
        {
            mParamsGUI[i] = EditorGUILayout.TextField(label, mParamsGUI[i] as string);
        }
        else if (mParamsGUI[i] is int)
        {
            mParamsGUI[i] = EditorGUILayout.IntField(label, int.Parse(mParamsGUI[i].ToString()));
        }
        else if (mParamsGUI[i] is bool)
        {
            mParamsGUI[i] = EditorGUILayout.Toggle(label, bool.Parse(mParamsGUI[i].ToString()));
        }
        else if (mParamsGUI[i] is long)
        {
            mParamsGUI[i] = EditorGUILayout.LongField(label, long.Parse(mParamsGUI[i].ToString()));
        }
    }
    void AddParamsGUI(string pName, Type pT, string className = "")
    {
        if (pT.Name.Equals("String"))
            mParamsGUI.Add("" as string);
        else if (pT.Name.Equals("Int32"))
            mParamsGUI.Add(0);
        else if (pT.Name.Equals("Boolean"))
            mParamsGUI.Add(false);
        else if (pT.Name.Equals("Int64"))
            mParamsGUI.Add(0);
        mParamsNames.Add(pName + "(" + pT.Name + ")" + className);
    }
    /// <summary> 给字段赋值  classObj类对象(已被CreateInstance实例化出来的) </summary>
    void SetFieldValue(object classObj, string pField, object value)
    {
        var tAsb = Assembly.Load("Assembly-CSharp");
        tAsb.GetType(classObj.ToString()).GetField(pField).SetValue(classObj, value);
    }

    void OnGUI()
    {
        TestOne();
        GUILayout.Space(10);
        // TestTwo();
        // GUITestDto();
    }

    //private List<string> mTempName = new List<string>();
    //private List<string> mTempValue = new List<string>();
    //private string mNotifyName;
    //private string mDto;
    //void TestTwo()
    //{
    //    EditorGUILayout.BeginVertical("Box");
    //    {
    //        mNotifyName = EditorGUILayout.TextField("消息名:", mNotifyName);
    //        mDto = EditorGUILayout.TextField("dto:", mDto);
    //        if (GUILayout.Button("执行", GUILayout.Height(30)))
    //        {
    //            try
    //            {
    //                mTempName.Clear(); mTempValue.Clear();
    //                var tAsb = Assembly.Load("Assembly-CSharp");
    //                var tType = tAsb.GetType(mDto);
    //                var tFields = tType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
    //                for (int i = 0; i < tFields.Length; i++)
    //                {
    //                    var tField = tFields[i];
    //                    mTempName.Add(tField.Name);
    //                    mTempValue.Add("");
    //                }
    //                Debug.Log("");
    //            }
    //            catch (Exception e)
    //            {
    //                for (int i = 0; i < mTempName.Count; i++)
    //                {
    //                    mTempValue[i] = EditorGUILayout.TextField(mTempName[i], mTempValue[i]);
    //                }
    //                Debug.LogError("异常了");
    //            }
    //        }

    //        if (mTempValue.Count > 0)
    //        {
    //            for (int i = 0; i < mTempName.Count; i++)
    //            {
    //                mTempValue[i] = EditorGUILayout.TextField(mTempName[i], mTempValue[i]);
    //            }
    //        }
    //    }
    //    EditorGUILayout.EndVertical();
    //}

    ///*         testDto       */
    //private void GUITestDto()
    //{
    //    EditorGUILayout.BeginVertical("Box");
    //    {
    //        if (GUILayout.Button("testDto", GUILayout.Height(27)))
    //        {
    //            var tAsb = Assembly.Load("Assembly-CSharp");
    //            var tParamsClass = tAsb.GetType("TestDto");
    //            var tNewParams = Activator.CreateInstance(tParamsClass);
    //            SetFieldValue(tNewParams, "mId", 1);
    //            SetFieldValue(tNewParams, "mName", "曾哥");
    //            var tFields = tParamsClass.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public);

    //            foreach (var item in tFields)
    //            {
    //                Debug.Log(item.GetValue(tNewParams));
    //            }
    //        }
    //    }
    //    EditorGUILayout.EndVertical();
    //}
}
using System.Reflection;
using UnityEngine;
/// <summary>
/// 反射测试类
/// </summary>
public class MyTestNotify
{
    public MyTestNotify()
    {
        if (PlayerPrefs.HasKey(GetType().Name) == false)
            Debug.Log("此程序集=" + Assembly.GetExecutingAssembly().FullName);
        PlayerPrefs.SetString(GetType().Name, GetType().Name);
    }
    public void GetPerson()
    {
        Debug.Log("此程序集=" + Assembly.GetExecutingAssembly().FullName + ",类名=MyTestNotify");
    }
    private void GetPersonPrivate()
    {
        Debug.Log("私有的");
    }

    public void SetPersonName(string str)
    {
        Debug.Log("传入的str=" + str);
    }
    public void SetPersonNameAndAge(int num, string str, TestDto dto, TestDto dto2)
    {
        Debug.Log("传入的num=" + num + ",str=" + str + ",dto.mid=" + dto.mId + ",mName=" + dto.mName);
    }

    public void SetPerson(int age, bool isMan, string name)
    {
        Debug.Log(name + "," + age + (isMan ? "岁,男" : "岁,女"));
    }

    public void SendTestNotify(TestDto dto, TestDto dto2)
    {
        Debug.Log(dto.mId + "," + dto2.mName);//+","+dto.mName);
    }
}
public class TestDto
{
    //火id
    public long mId;
    //火名
    public string mName;
    //大小
    public int mRange;
    //全局否
    public bool mGlobal;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值