更改 ProBuilber 插件(一):给 Text Mode 添加图标

本文分享了在Unity中修改第三方插件的实战经验,详细介绍了如何定位代码、解决依赖问题,并以给TextMode添加图标为例,展示了具体的修改步骤。
前两天看麦扣在官方的 直播视频 时,强迫症犯了,想着能不能去魔改一下插件。 于是花了一天尝试了一下,顺便记录一下过程,也给大家提供一个修改陌生插件的着手思路。 先上最终效果图,增加了下面两个选项:

一、准备

由于无法直接修改 PackageCache 目录下的插件,同时也为了方便起见,所以需要把插件直接拖入到项目中。
①、 新建工程,找到插件包目录,拖入项目 Assets 文件夹,再将插件包目录名掐头去尾。 不把目录名掐头去尾的话,一些资源引用可能会找不到。 Unity插件包默认缓存路径:C:\Users\<用户>\AppData\Local\Unity\cache\packages\ 这时候打开项目,你将收到一堆报错。但四没有关西! 稍微看一下报错,不难发现,是缺少了依赖包 Settings Manager 造成的。
②、 所以第二步就是要解决依赖的问题。 由于这次并不需要修改 Settings Manager 插件,所以直接拖入项目 Packages 文件夹即可。 当然,你也可以在 Package Manager 中添加,不过 Settings Manager 在2020的 PM 中还通过验证,所以没法直接找到。
③、 接着就可以打开项目了。

二、定位

接下来就是最重要的部分了。 对于简单的修改一个陌生的项目,我们并不需要去完全了解他,只需要定位打击就好。 那么改如何找到需要修改的位置呢?我们先以给 Text Mode 加上图标为例。
①、 已知条件,在切换显示模式的时候用的是右键选单里的两条选项。 分析可知,对于两条选项的显示文本一般没必要有什么骚操作,大概率直接写死了,所以我们尝试直接在项目中搜索 Text Mode ,
很幸运,作者确实没做什么骚操作,很快就在 ProBuilberEditor.cs 脚本中找到了, 在通过参数中的绑定的方法一顿顺藤摸瓜,来到了 EditorToolbar.cs 脚本中。 而从 OpenEditorToolbar() 方法中,基本可以确认主界面就是在 EditorToolbar 类中实现的了, 作者甚至用了销毁重建的粗暴方式,来切换界面。
并且在 EditorToolbar 类的 OnGUI() 方法中也,确实调用了 s_EditorToolbar.OnGUI() 。 当然,为了安全起见,我们可以做一点测试, 很显然这是对的。
②、 接着还要继续缩小范围,毕竟 OnGUI() 中200行看一遍也不好受,所以还得找一些线索。 在最开头不难发现,bool 变量 s_IsIconGui 标记了两个模式,在 Menu_ToggleIconMode() 方法中可以证明这一点。 同时, s_IsIconGui 变量,在之后的过程中并没有直接传入 s_EditorToolbar 中,倒是在调用 InitWindowProperties() 时传入了 this 。 所以可以试试直接在 EditorToolbar 中搜索 s_IsIconGui 。 于是又是一顿顺藤摸瓜, 来到了 OnGUI() 中一处最可疑的地方, 很好理解,这么多的控件自然得放循环中绘制,而 if (isIconMode) 则区分了绘制方式, 所以,显然 else{...} 部分极有可能就是我们要找的地方了。
③、 不过很显然,这还得往里面再翻一层。 通过 action.DoButton(...) 转到定义处,这下是真的找到绘制按钮的地方了。

三、修改

😅呼,总算到这一步了。
①、 这一部分的代码还是要老老实实的看一下,不过很容易就能得出下面结论,
    
if ( 图标模式 ) { 绘制 Button ( 图标 ) } else { 绘制 Button ( 标题 ) }
所以只要简单的结合一下,
    
//if (GUILayout.Button(menuTitle, MenuActionStyles.buttonStyleVertical)) GUIContent guiContent = new GUIContent ( menuTitle , buttonEnabled || ! disabledIcon ? icon : disabledIcon ) ; if ( GUILayout . Button ( guiContent , MenuActionStyles . buttonStyleVertical ) ) { .. . }
就得到了下面效果, 改是改对了,但原先明明是很整齐的,可现在这参差不齐的,强迫症表示这不能忍。
②、 继续从病因分析起,造成这种情况,八成跟绘制 GUI 时的 GUILayoutOption[] options 参数有关, 但绘制 Button 时并没有传入 LayoutOptions 相关的属性, 往上两行就能发现套了一层 GUILayout.BeginHorizontal(...) ,并且有传入 layoutOptions 参数。
一路往回走,来到了 EditorToolbar 类中,调用 action.DoButton(...) 的地方, 发现当 (m_Columns < 2) 传入了 GUILayout.MinWidth(m_ContentWidth) 参数。 再通过查找 m_ContentWidth 变量,查看有赋值操作的地方……(不再细讲定位思路了)。
总之一路又绕到了 MenuAction 类中的 GetSize(...) 方法上。 又是一顿改,
    
internal Vector2 GetSize ( bool isHorizontal ) { if ( iconMode ) { .. . } else { // in text mode always use the vertical layout. isHorizontal = false ; m_LastCalculatedSize = MenuActionStyles . buttonStyleVertical . CalcSize ( UI . EditorGUIUtility . TempContent ( menuTitle ) ) + AltButtonSize ; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 添加内容 bool buttonEnabled = ( menuActionState & MenuActionState . Enabled ) == MenuActionState . Enabled ; Texture2D t = ( buttonEnabled || ! disabledIcon ? icon : disabledIcon ) ; if ( t ) { m_LastCalculatedSize . x += t . width ; m_LastCalculatedSize . y = System . Math . Max ( m_LastCalculatedSize . y , t . height ) ; } //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } return m_LastCalculatedSize ; }
这回对齐了,但是有些选项后面是有一个 [ + ] 按钮,按钮显得小了些。 回到 OnGUI() 中,第一步修改 Button 的下方,做如下修改,
    
//if (DoAltButton(GUILayout.MaxWidth(21), GUILayout.MaxHeight(16))) if ( DoAltButton ( GUILayout . MaxWidth ( 21 ) , GUILayout . MaxHeight ( Mathf . Max ( 16 , guiContent . image . height + 4 ) ) )
总算得到了一个舒服的界面。
.待续
Ps.本来打算一篇写完的,结果又唠了这么多,还是分两篇吧,明天应该会上传添加中文。 社区App优化似乎有点问题,觉得文章界面卡顿的,可以点下面图标,到我的博客阅读。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值