学习
参考网站:
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
这里先提供一个模板
基本都做好注释了,对着部分抄就行
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中的逻辑

以及混合模式中的逻辑


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

当然也可以用 material.shader.name == "Universal Render Pipeline/Lit"
- Begin/EndChangeCheck
Begin/EndChangeCheck 就是检查被包围的代码的参数是否有变化,有变化才执行。
所以如果涉及到开启A关闭B的二选一功能,可以写进End的检测里

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