代码控制 Inspector 视图的锁定

25 篇文章 1 订阅
14 篇文章 0 订阅

当我们写编辑器自定义工具的时候,会发现一些 Unity 编辑器中已在的按钮、菜单项并没有开放访问权限,而我们的工具又需要调用这些按钮、菜单的功能。怎么办呢?下面我们就以调用 Inspector 的锁定功能为例,利用反射来实现。

文章的内容也是提供一种思路,当碰到类似情况时,自己也可以按下面流程尝试

关于 Inspector 的锁定功能点这里查看

先看下最终效果

首先我们需要下载 dll 反编译工具 dnspy,在 这篇文章 里有介绍。直接从 GitHub 上下载,解压使用免安装

准备好了之后,打开 dnSpy, 找到 UnityEditor.dll 拖进 dnSpy 窗口,为了方便查看代码,我们把反编的代码导出工程。

UnityEditor.dll 路径是 Unity 安装目录\Editor\2019.3.0f3(我用的是这个版本)\Editor\Data\Managed\下

导出后会自动生成.sln 文件

双击.sln 打开工程,因为我们要找的是小锁子位于 Inspector 视图当中,所以我们搜索一下 Inspector 来确定接口位于哪个类里面

图中 InspectorWindow.cs 便是目标类。搜索一下关键词 “Lock”, 发现有个叫 isLock 的属性,这个属性就是控制小锁子的属性。

  • 我用的是 Unity 2019.3.0,早一些的版本中的类名和属性名可能不相同,需要自己判定。比如 Unity 2018 中的类名是 Inspector.cs
  • 至于怎么找对应的接口或属性,终极大法: 连猜带蒙

找到了对应的属性,我们就开始写代码来实现调用了,由于 InspectorWindow.cs 有访问权限限制,所以我们用反射来调用并修改


代码很简单,贴出来

using UnityEditor;
using System;
public class TestLock : Editor
{
    protected static bool isLock;

    //添加菜单项
    [MenuItem("Tools/Test Lock")]
    static void Lock()
    {
        Type t = typeof(EditorWindow).Assembly.GetType("UnityEditor.InspectorWindow");
        var window = EditorWindow.GetWindow(t);

        isLock = !isLock;
        t.GetProperty("isLocked").SetValue(window, isLock);
    }
}



欢迎关注公众号,定期分享Unity的实用技巧~~
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值