利用反射实现代码对Unity的设置(一)

Unity有很多操作需要人手动设置,比如咱们的GameView窗口,通常需要设置分辨率,是否在运行时最大化(Maximize On Playr)等等。

如何使用代码对其进行 ,就拿对GameView这个窗口的设置举例。

1.Unity有编辑器有个获取窗口的接口EditorWindow.GetWindow(Type t)

那么我们怎么获取取GameView的Type呢。毕竟这个类Unity是不对外公开的,很多人甚至不知道它的存在。

我们可以这样

    static Type GetGameViewType()
    {
        Assembly assembly = typeof(EditorWindow).Assembly;
        Type[] types = assembly.GetTypes();
        for (int i = 0; i < types.Length; i++)
        {
            if (types[i].Name == "GameView")
            {
                return types[i];
            }
        }
        return null;
    }

这个方法也可以打印出所有的继承EditorWindow的所有窗口类型。

然后我们我们传入参数,如愿得到了EditorWindow对象。我们就可以调用它一些常用方法,比如关闭,获取焦点等等。但是也只是一些通用窗口方式。为什么这么说呢,毕竟这只是一个基类,是所有窗口一些共有特性。那么我们怎么转到子类呢。比如转到GameView这个子类?很明显,这是不可能的,因为Unity对其并没有公开,(从设计角度上来说作者为为了安全也不会公开),不过我们还有另一条路可以走,那就是反射!

2.使用反射获取/修改 对象的函数,属性

   首先我们使用断点看一个这个类里有哪些属性、函数

   

经过分析,不能猜出这个属性是一个get,set 语法糖,是用来选择分辨率的。下面我们来获取它

    static PropertyInfo GetProperty_selectedSizeIndex(Type gameViewType)
    {
        var info = gameViewType.GetProperty("selectedSizeIndex", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        return info;
    }

最后我们对它进行设置

var info = GetProperty_selectedSizeIndex(gameViewType);
info.SetValue(gameView, 0);

发现GameView的分辨率变成了Free Aspect。至于Maximize On Play这个最大化的代码调用,EditorWindow 类就有接口,直接

gameView.maximized = true,即可,如果没有,参照上面selectedSizeIndex的反射做就行了。技巧就是断点这个Type。看里在的内容找到以后反射。

下一篇实战演练:https://blog.csdn.net/jcpkwudi/article/details/86651806

扩展学习:https://blog.csdn.net/han15939423461/article/details/82529225

猜你喜欢

转载自blog.csdn.net/jcpkwudi/article/details/86651408