在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中参数被修改。

相关推荐
牙膏上的小苏打233313 小时前
Unity Surround开关后导致获取主显示器分辨率错误
unity·主屏幕
Unity大海15 小时前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
浅陌sss20 小时前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮1 天前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge1 天前
【Unity网络编程知识】FTP学习
网络·unity
神码编程1 天前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay1 天前
Unity 单例模式写法
unity·单例模式
火一线1 天前
【Framework-Client系列】UIGenerate介绍
游戏·unity
ZKY_241 天前
【工具】Json在线解析工具
unity·json
ZKY_242 天前
【Unity】处理文字显示不全的问题
unity·游戏引擎