【Unity】反射:编辑器中通过类名获取Type

 做配置表工具的时候,用到通过类名获取类的Type:

Type type = Type.GetType(_className)

发现一个问题,在Unity运行代码中创建一个类:通过GetType能正常获取该类的Type,但是在编辑器代码中,Get出来的却是null。

猜想在当前的Assembly中没有该类。

Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();

在两个代码中获取当前的程序集,发现是两个不同的程序集:Assembly-CSharp、Assembly-CSharp-Editor,怪不得在Editor中获取不到所选的类型,Assembly-CSharp-Editor中根本就没有这个类。

在需要获取的类的程序集里面创建一个静态函数,就能获取到了。

    public Type GetConfigType(string className)
    {
        return Type.GetType(className);
    }
    public Type GetConfigTypeByAssembley(string className)
    {
        Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
        if (assembly == null)
        {
            return null;
        }
        Type _type = assembly.GetType(className);
       
        return _type;
    }

获取当前所有程序集:

 Assembly[] all = AppDomain.CurrentDomain.GetAssemblies();

2021.3.25

Dll库里面调用Unity类里面的方法:

先加载程序集,通过程序集获取到Type,创建对象,获取方法。

    public static void ShowTest()
    {
        Assembly assembly = System.Reflection.Assembly.Load("Assembly-CSharp");
        Type _type = assembly.GetType("TestScript1");

        if (_type!=null)
        {
            object _obj = assembly.CreateInstance(_type.FullName); //Activator.CreateInstance(_type);
            MethodInfo methodInfo = _type.GetMethod("ShowTest", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod);
            if (methodInfo != null)
            {
                 methodInfo.Invoke(_obj, null);
            }
        }
    }

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 编辑器,您可以使用 `EditorGUIUtility.systemCopyBuffer` 属性和 `EditorGUIUtility.systemCopyBufferIndex` 属性来获取当前选的文本内容。这个属性会返回剪贴板的文本内容,如果当前选了文本并进行了复制操作,那么剪贴板就会包含这段文本内容。 以下是一个示例代码,它可以在 Unity 编辑器获取编辑器输入框当前选的文本内容并在 Console 窗口输出: ```csharp using UnityEngine; using UnityEditor; public class EditorUtils : EditorWindow { string inputText = "Hello World!"; [MenuItem("Window/EditorUtils")] static void Init() { EditorUtils window = GetWindow<EditorUtils>(); window.Show(); } void OnGUI() { inputText = EditorGUILayout.TextField(inputText); if (GUIUtility.keyboardControl == 0) EditorGUIUtility.systemCopyBufferIndex = 0; if (Event.current.type == EventType.MouseDown && Event.current.button == 1) { string selectedText = EditorGUIUtility.systemCopyBuffer; Debug.Log("Selected Text: " + selectedText); } } } ``` 在上面的示例代码,我们在 `OnGUI` 方法添加了一个文本输入框,并在 `OnGUI` 方法添加了一个事件处理器。当用户在编辑器输入框鼠标右键点击时,会调用 `EditorGUIUtility.systemCopyBuffer` 属性来获取当前选的文本内容,并在 Console 窗口输出。 需要注意的是,为了使剪贴板包含当前选的文本内容,我们需要在事件处理器设置 `EditorGUIUtility.systemCopyBufferIndex` 属性为 0,这样剪贴板才会包含当前选的文本。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值