前两天看麦扣在官方的
直播视频
时,强迫症犯了,想着能不能去魔改一下插件。 于是花了一天尝试了一下,顺便记录一下过程,也给大家提供一个修改陌生插件的着手思路。 先上最终效果图,增加了下面两个选项:
一、准备
由于无法直接修改
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优化似乎有点问题,觉得文章界面卡顿的,可以点下面图标,到我的博客阅读。
本文分享了在Unity中修改第三方插件的实战经验,详细介绍了如何定位代码、解决依赖问题,并以给TextMode添加图标为例,展示了具体的修改步骤。

被折叠的 条评论
为什么被折叠?



