
最近在给shader写材质面板的时候,遇到了一个小坑,在这里记录一下。
关于unity的自定义材质面板,网上的资料并不太多,主要还是参考的unity给standard shader写的材质面板脚本(在built-in shader包里可以找到这些文件)。
要自定义某个shader的材质面板,我们只需要在shader最下面添加一行:
CustomEditor "XXX"双引号里面的就是我们的自己写的材质面板脚本的名字(脚本需要放在名为Editor的文件夹内)。
参考standard的写法,我写了一个非常简单的面板:

代码很简单,就是在面板上把一个shader属性画出来,我们看看效果。

一个带 Tiling和Offset的贴图属性已经画出来了,不过为什么贴图槽变的那么小了??我门看看默认的面板:

最初我以为是用的方法不对,但是看了下unity的源码,发现默认的面板其实也是用同样的方法画出来的。
中间的曲折不细说,反正我是把整个MaterialEditor都看了一遍,最后定位到问题是因为scaleOffsetRect的宽度是根据EditorGUIUtility.fieldWidth这个值来计算的,于是,我自己设了一下这个值:
EditorGUIUtility.fieldWidth = 65;
这样效果就和默认的效果一致了,然后我在回头看了一下PropertiesDefaultGUI这个函数,它其实是这样写的:


里面第一行就用到了一个函数:

这个函数的其实就是把fieldWidth 的值设为和高度一样,而这个函数在官方文档里面其实是有说的,为什么我绕了一大圈最后才发现人家第一行就已经写了这个方法呢?答案是......我看漏了......
虽然花了一下午的时间来解决这个非常基础的小问题(其实好好看一下api文档就能解决了),但能把默认材质面板的相关源码都理解一遍也算是一个不小的收获吧。
最后是完整代码:

Shader:


知乎@喵喵Mya


