ShaderGUI


也可以看知乎 https://zhuanlan.zhihu.com/p/394910141

Unity GUI的一些使用

https://www.codenong.com/cs106864188/https://www.codenong.com/cs106864188/

图片

Begin/EndChangeCheck 就是检查被包围的代码的参数是否有变化,有变化才执行。

所以如果涉及到开启A关闭B的二选一功能,可以写进End的检测里

图片

图片

图片

showMixedValue 就是当选中多个材质球的时候一起编辑有用

学习

参考网站:

https://blog.csdn.net/enk_2/article/details/109236874

GUI分为两种,一种是Drawer一种是GUI,当然可以把GUI集成后用Drawer的形式写。

Drawer就是:

可以看喵爷的https://zhuanlan.zhihu.com/p/93194054

1
2
3
4
5
6
7
[Header(Option)]
[Enum(UnityEngine.Rendering.BlendOp)] _BlendOp ("BlendOp", Float) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Float) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Float) = 0
[Enum(Off, 0, On, 1)]_ZWriteMode ("ZWriteMode", float) = 1
[Enum(UnityEngine.Rendering.CullMode)]_CullMode ("CullMode", float) = 2
[Enum(UnityEngine.Rendering.CompareFunction)]_ZTestMode ("ZTestMode", Float) = 4

GUI就是:

1
CustomEditor "XXX"

这里主要说的是GUI,因为Drawer有很多限制,例如修改RenderType的时候就很麻烦。
说回GUI

大部分GUI继承的类分为两个 : ShaderGUI& BaseShaderGUI

前者是自己造轮子,后者是根据前者的基础上造好了一些轮子(如果是在Lit基础上魔改的,用BaseShaderGUI方便一些)

参考默认shader的时候会发现CustomEditor里面是一个namespace,所以其实也可以写成CustomEditor “namespace.name”的形式

具体如何写

https://blog.csdn.net/enk_2/article/details/109236874

这里先提供一个模板

基本都做好注释了,对着部分抄就行

GUIShader.shader

XXX.cs

如何抄作业

假设需要这种效果

图片

首先找到 BaseShaderGUI.cs

打开发现第一行就是想要的

图片

这里值需要拷贝需要的枚举到 XXX 中

图片

接着抄,找 SurfaceType 用到的地方

图片

往下翻

图片

他写进 DrawSurfaceOptions 的函数里了,咱们可以自定义一个标签写进去,例如在 XXX 中这样写

图片

图片

报错了,首先是一些函数没放进来,例如 DoPopup,所以先搜一下这个

这些都打包带走(图里没截全)

图片

剩下的找到对应的属性抄过来,他是写进Styles里了,咱们没写,就把 “Styles.”去掉

图片

图片

这个需要在shader里写对应的变量,直接隐藏就可以

图片

图片

图片

材质需要换成自己的

图片

图片

抄完之后记得吧 BlendMode 运算的函数放到 OnGUI里面

图片

也可以混着用

图片

不过只能在shader里隐藏不需要的属性

  • 枚举展开列表
    图片

首先

踩坑

  • 开关里不能用 setfloat 函数(我也忘了为啥)
  • 可以用HasProperty来区分不同shader
    例如我在lighting里改了,我可以查当前shader是否有某个参数,以此来区分不同GUI

图片


文章作者: Neilyodog
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Neilyodog !
评论
评论