在URP管线中添加ShaderMaterial自定义GUI的方法

编写GUI面板

1. 新建GUI子面板

csharp 复制代码
using UnityEngine;
using UnityEngine.Rendering;

namespace UnityEditor.Rendering.Universal.ShaderGUI
{
    internal class CP_XXXOutLineGUI
    {
        public static class Styles{}

        public struct LitProperties
        {
            public LitProperties(MaterialProperty[] properties){}
        }
        public static void DoDetailArea(LitProperties properties, MaterialEditor materialEditor){}
        public static void SetMaterialKeywords(Material material){}
    }
}

2. 将在Shader关联的GUI面板中注册该子面板

csharp 复制代码
internal class CP_XXXLitShader : BaseShaderGUI
{
	//声明子面板属性
    private CP_XXXOutLineGUI.LitProperties litXXXOutLineProperties;


    public override void FillAdditionalFoldouts(MaterialHeaderScopeList materialScopesList)
    {
  		
    }
  	public override void FindProperties(MaterialProperty[] properties)
    {
        base.FindProperties(properties);
        // 新建子面板属性
        litXXXOutLineProperties = new CP_XXXOutLineGUI.LitProperties(properties);
    }
}

3. 注册列表头部展开区域

FillAdditionalFoldouts(MaterialHeaderScopeList)会在继承BaseShaderGUI的类中由系统自动调用,它传入当前材质GUI的列表实例,我们通过RegisterHeaderScope可以添加新的列表项目。

csharp 复制代码
public override void FillAdditionalFoldouts(MaterialHeaderScopeList materialScopesList)
{
	materialScopesList.RegisterHeaderScope(LitDetailGUI.Styles.detailInputs, Expandable.Details, _ => LitDetailGUI.DoDetailArea(litDetailProperties, materialEditor));
}

注册函数:materialScopesList.RegisterHeaderScope<TEnum>(GUIContent, TEnum, Action<Material>)

(1)创建头部列表GUIContext对象

csharp 复制代码
public GUIContent(...);
- string text	文本
- Texture image	图片
- string tooltip 鼠标指针当前悬停在其上或具有键盘焦点的控件的工具提示。
csharp 复制代码
internal class CP_XXXOutLineGUI{
	public static class Styles
	{
	     public static readonly GUIContent OutLineInputs = new GUIContent("Outline Inputs",
	        "This Let You Open The OutLine Panel");
	}
}

(2)设置掩码

掩码设置要求,掩码按照位来设置,每个掩码占一个位字节。

如:在URP内置代码BaseShaderGUI:ShaderGUI类中已经设置了部分掩码

csharp 复制代码
[URPHelpURL("shaders-in-universalrp")]
protected enum Expandable
{
    SurfaceOptions = 1 << 0,
    SurfaceInputs = 1 << 1,
    Advanced = 1 << 2,
    Details = 1 << 3,
}

其中SurfaceOptions、SurfaceInputs、Advanced 都已被系统注册,在URPShader的LitShader(其他Shader中可能也有)中,Details也在重写函数FillAdditionalFoldouts中被注册

csharp 复制代码
materialScopesList.RegisterHeaderScope(
	LitDetailGUI.Styles.detailInputs, 
	Expandable.Details, 
	_ => LitDetailGUI.DoDetailArea(litDetailProperties, materialEditor)
);

我们仿照URP标准库中的写法,添加自定义掩码的扩展

csharp 复制代码
在CP_XXXLitShader中自定义
protected enum AdditionalExpandable
{
	...其他掩码(16、32、64、128、256)
	OutlineMask = 512,
}

(3) 注册列表头部区域

csharp 复制代码
public override void FillAdditionalFoldouts(MaterialHeaderScopeList materialScopesList)
{
    materialScopesList.RegisterHeaderScope(
    	CP_XXXOutLineGUI.Styles.OutLineInputs, 
    	AdditionalExpandable.OutlineMask, 
    	_ => CP_XXXOutLineGUI.DoDetailArea(litXXXOutLineProperties, materialEditor));
}

现在返回Unity,查看Shader列表。发现已经有了列表头显示。

4. 添加属性列表的显示

首先OutLine需要的参数有OutLineColor和OutLineSize。

首先在LitProperties中声明该属性,并绑定该属性的Shader名称。

csharp 复制代码
public struct LitProperties
{
    public MaterialProperty OutLineColor;
    public MaterialProperty OutLineSize;


    public LitProperties(MaterialProperty[] properties)
    {
        OutLineColor = BaseShaderGUI.FindProperty("_OutlineColor", properties, false);//false-->未找到不抛出异常
        OutLineSize  = BaseShaderGUI.FindProperty("_OutlineSize", properties, false); 
    }
}

当展开OutLine下拉框时:调用public static void DoDetailArea(LitProperties properties, MaterialEditor materialEditor)函数

csharp 复制代码
public static void DoDetailArea(LitProperties properties, MaterialEditor materialEditor)
{
    materialEditor.ColorProperty(properties.OutLineColor, Styles.OutLineColorContent.text);
    materialEditor.FloatProperty(properties.OutLineSize, Styles.OutLineSizeContent.text);
}

展开显示

修改属性,Shader中参数被修改。

相关推荐
天人合一peng2 小时前
unity 生成标记根据背景色变色为明显的颜色
unity·游戏引擎
魔士于安3 小时前
Unity 超市总动员 超市收银台 超市货架 超市购物手推车 超市常见商品
游戏·unity·游戏引擎·贴图·模型
CandyU23 小时前
Unity —— 数据持久化
unity·游戏引擎
zh路西法3 小时前
【Unity实现Oneshot胶卷显形】游戏窗口化与Win32API的使用
游戏·unity·游戏引擎
凡情8 小时前
android隐私合规检测
android·unity
小贺儿开发8 小时前
Unity3D 本地 Stable Diffusion 文生图效果演示
人工智能·unity·stable diffusion·文生图·ai绘画·本地化
mxwin1 天前
Unity Shader 半透明物体为什么不能写入深度缓冲?
unity·游戏引擎·shader
晚枫歌F1 天前
三层时间轮的实现
网络·unity·游戏引擎
咸鱼永不翻身1 天前
Lua脚本事件检查工具
unity·lua·工具
leo__5201 天前
单载波中继系统资源分配算法MATLAB仿真程序
算法·matlab·unity