Neilyodog Blog

shader GUI 基础

小学三年级都会写的shaderGUI

学习

参考网站:

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

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

Drawer就是:

 [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.CompareFunction)]_ZTestMode ("ZTestMode", Float) = 4
 [Enum(UnityEngine.Rendering.CullMode)]_CullMode ("CullMode", float) = 2

GUI就是:

CustomEditor "XXX"

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

说回GUI

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

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

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

具体如何写

  • GUI

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

这里先提供一个模板

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

GUIShader.shader

XXX.cs

Drawer

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

文章配图

https://zhuanlan.zhihu.com/p/93194054

文章配图

Unity GUI的一些使用

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

文章配图

如何抄作业

假设需要这种效果

文章配图

首先找到 BaseShaderGUI.cs

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

文章配图

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

文章配图

接着抄,找 SurfaceType 用到的地方

文章配图

往下翻

文章配图

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

文章配图

文章配图

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

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

文章配图

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

文章配图

文章配图

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

文章配图

文章配图

文章配图

材质需要换成自己的

文章配图

文章配图

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

文章配图

也可以混着用

文章配图

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

勘误

其实默认就混用了

文章配图

  • 枚举展开列表

在GUI里定义一个enum,然后根据枚举来决定用哪个

  • 修改ZWrite

主要问题就是BaseShaderGUI修改SurfaceType的部分,会自动确定Zwrite的方式

GUI显示比较简单

文章配图

需要改一下surface中的逻辑

文章配图

以及混合模式中的逻辑

文章配图

customZgif

Trick

  • 可以用HasProperty来区分不同shader

例如我在lighting里改了,我可以查当前shader是否有某个参数,以此来区分不同GUI

文章配图

当然也可以用 material.shader.name == "Universal Render Pipeline/Lit"

  • Begin/EndChangeCheck

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

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

文章配图

  • showMixedValue

showMixedValue 就是当选中多个材质球的时候一起编辑有用。如果不加多选编辑的时候可能会发生value回退现象

— END —