using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
public class MainRoleProHologramEditor : ShaderGUI
|
|
{
|
|
Material target;
|
|
MaterialEditor editor;
|
|
MaterialProperty[] properties;
|
|
static GUIContent staticLabel = new GUIContent();
|
|
// 折叠参数
|
|
bool expand_color_glitch;
|
|
bool expand_fresnel;
|
|
bool expand_line1;
|
|
bool expand_line2;
|
|
bool expand_ver_gliter1;
|
|
bool expand_ver_gliter2;
|
|
bool expand_grain;
|
|
bool expand_mask;
|
|
bool expand_dissolve;
|
|
|
|
public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
|
|
{
|
|
// base.OnGUI(materialEditor, properties);
|
|
this.target = materialEditor.target as Material;
|
|
this.editor = materialEditor;
|
|
this.properties = properties;
|
|
DoBase();
|
|
DoColorGlitch();
|
|
DoFresnel();
|
|
DoScanLine();
|
|
DoVertexGliter();
|
|
DoGrain();
|
|
DoHgMask();
|
|
DoDissolve();
|
|
}
|
|
|
|
// 基础参数
|
|
void DoBase()
|
|
{
|
|
// 全息颜色
|
|
// GUILayout.Label("全息基础参数", EditorStyles.helpBox);
|
|
MaterialProperty hg_color = FindProperty("_HologramColor");
|
|
editor.ShaderProperty(hg_color, MakeLabel("全息整体颜色"));
|
|
MaterialProperty hg_alpha = FindProperty("_HologramAlpha");
|
|
editor.ShaderProperty(hg_alpha, MakeLabel("全息整体透明度"));
|
|
MaterialProperty glitch_map = FindProperty("_HologramGlitchMap");
|
|
editor.TextureProperty(glitch_map, "噪声纹理", false);
|
|
GUILayout.Space(10);
|
|
}
|
|
// 颜色故障效果
|
|
void DoColorGlitch()
|
|
{
|
|
// GUILayout.Label("全息颜色故障效果", EditorStyles.helpBox);
|
|
expand_color_glitch = EditorGUILayout.Foldout(expand_color_glitch, "全息颜色故障效果");
|
|
if(expand_color_glitch)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
MaterialProperty c_g_tog = FindProperty("_HologramColorGlitchTog");
|
|
editor.ShaderProperty(c_g_tog, "使用颜色故障");
|
|
if(GetToggleEnabled(c_g_tog))
|
|
{
|
|
MaterialProperty glitch_val = FindProperty("_HologramColorGlitch");
|
|
MaterialProperty glitch_data = FindProperty("_HologramColorGlitchData");
|
|
MaterialProperty glitch_min = FindProperty("_HologramColorGlitchMin");
|
|
editor.ShaderProperty(glitch_val, "颜色故障强度");
|
|
editor.VectorProperty(glitch_data, "噪声速度(使用XY分量)");
|
|
editor.ShaderProperty(glitch_min, "颜色故障最小值");
|
|
}
|
|
EditorGUI.indentLevel -= 1;
|
|
}
|
|
}
|
|
|
|
// 菲涅尔反射
|
|
void DoFresnel()
|
|
{
|
|
// GUILayout.Label("全息Fresnel效果", EditorStyles.helpBox);
|
|
expand_fresnel = EditorGUILayout.Foldout(expand_fresnel, "全息Fresnel效果");
|
|
if(expand_fresnel)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
MaterialProperty fresnel_scale = FindProperty("_FresnelScale");
|
|
MaterialProperty fresnel_power = FindProperty("_FresnelPower");
|
|
MaterialProperty fresnel_scale_a = FindProperty("_FresnelAlphaScale");
|
|
MaterialProperty fresnel_power_a = FindProperty("_FresnelAlphaPower");
|
|
editor.ShaderProperty(fresnel_scale, "Fresnel大小");
|
|
editor.ShaderProperty(fresnel_power, "Fresnel指数");
|
|
editor.ShaderProperty(fresnel_scale_a, "Fresnel Alpha大小");
|
|
editor.ShaderProperty(fresnel_power_a, "Fresnel Alpha指数");
|
|
EditorGUI.indentLevel -= 1;
|
|
}
|
|
}
|
|
|
|
// 扫描线属性
|
|
void DoScanLine()
|
|
{
|
|
// GUILayout.Label("扫描线效果", EditorStyles.helpBox);
|
|
expand_line1 = EditorGUILayout.Foldout(expand_line1, "扫描线效果1");
|
|
if(expand_line1)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
MaterialProperty line1_map = FindProperty("_HologramLine1");
|
|
MaterialProperty line1_speed = FindProperty("_HologramLine1Speed");
|
|
MaterialProperty line1_tilling = FindProperty("_HologramLine1Frequency");
|
|
MaterialProperty line1_alpha = FindProperty("_HologramLine1Alpha");
|
|
editor.TextureProperty(line1_map, "扫描线1纹理", false);
|
|
editor.ShaderProperty(line1_speed, "扫描线1速度");
|
|
editor.ShaderProperty(line1_tilling, "扫描线1tilling");
|
|
editor.ShaderProperty(line1_alpha, "扫描线1透明度");
|
|
EditorGUI.indentLevel -= 1;
|
|
}
|
|
|
|
expand_line2 = EditorGUILayout.Foldout(expand_line2, "扫描线效果2");
|
|
if(expand_line2)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
EditorGUI.BeginChangeCheck();
|
|
MaterialProperty line2_tog = FindProperty("_HologramLine2Tog");
|
|
editor.ShaderProperty(line2_tog, "使用扫描线2");
|
|
bool line2_enabled = GetToggleEnabled(line2_tog);
|
|
if(line2_enabled)
|
|
{
|
|
MaterialProperty line2_map = FindProperty("_HologramLine2");
|
|
MaterialProperty line2_speed = FindProperty("_HologramLine2Speed");
|
|
MaterialProperty line2_tilling = FindProperty("_HologramLine2Frequency");
|
|
MaterialProperty line2_alpha = FindProperty("_HologramLine2Alpha");
|
|
editor.TextureProperty(line2_map, "扫描线2纹理", false);
|
|
editor.ShaderProperty(line2_speed, "扫描线2速度");
|
|
editor.ShaderProperty(line2_tilling, "扫描线2tilling");
|
|
editor.ShaderProperty(line2_alpha, "扫描线2透明度");
|
|
}
|
|
EditorGUI.indentLevel -= 1;
|
|
if(EditorGUI.EndChangeCheck())
|
|
{
|
|
SetKeyword("_USE_SCANLINE2", line2_enabled);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 顶点故障效果
|
|
void DoVertexGliter()
|
|
{
|
|
// GUILayout.Label("模型顶点故障效果", EditorStyles.helpBox);
|
|
expand_ver_gliter1 = EditorGUILayout.Foldout(expand_ver_gliter1, "顶点故障1");
|
|
if(expand_ver_gliter1)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
MaterialProperty gliter1 = FindProperty("_HologramGliterData1");
|
|
GUILayout.Label("x:速度,y:抖动范围,z:抖动偏移量(正负区分左右抖动),w代表频率(0~0.99)", EditorStyles.centeredGreyMiniLabel);
|
|
editor.VectorProperty(gliter1, "故障参数1");
|
|
EditorGUI.indentLevel -= 1;
|
|
}
|
|
expand_ver_gliter2 = EditorGUILayout.Foldout(expand_ver_gliter2, "顶点故障2");
|
|
if(expand_ver_gliter2)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
MaterialProperty gliter2 = FindProperty("_HologramGliterData2");
|
|
GUILayout.Label("x:速度,y:抖动范围,z:抖动偏移量(正负区分左右抖动),w代表频率(0~0.99)", EditorStyles.centeredGreyMiniLabel);
|
|
editor.VectorProperty(gliter2, "故障参数2");
|
|
EditorGUI.indentLevel -= 1;
|
|
}
|
|
}
|
|
// 颗粒效果
|
|
void DoGrain()
|
|
{
|
|
// GUILayout.Label("整体颗粒效果", EditorStyles.helpBox);
|
|
expand_grain = EditorGUILayout.Foldout(expand_grain, "颗粒效果");
|
|
if(expand_grain)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
MaterialProperty grain_data = FindProperty("_HologramGrainData");
|
|
MaterialProperty grain_speed = FindProperty("_HologramGrainSpeed");
|
|
MaterialProperty grain_affect = FindProperty("_HologramGrainAffect");
|
|
GUILayout.Label("xy:噪声采样tilling(需要噪声图),zw:噪声颜色区间(0~1)", EditorStyles.centeredGreyMiniLabel);
|
|
editor.VectorProperty(grain_data, "颗粒参数");
|
|
editor.ShaderProperty(grain_speed, "颗粒效果速度");
|
|
editor.ShaderProperty(grain_affect, "颗粒效果强度");
|
|
EditorGUI.indentLevel -= 1;
|
|
}
|
|
}
|
|
// 蒙版
|
|
void DoHgMask()
|
|
{
|
|
// GUILayout.Label("整体颜色蒙版", EditorStyles.helpBox);
|
|
expand_mask = EditorGUILayout.Foldout(expand_mask, "整体蒙版");
|
|
if(expand_mask)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
MaterialProperty mask = FindProperty("_HologramMaskMap");
|
|
MaterialProperty mask_affect = FindProperty("_HologramMaskAffect");
|
|
MaterialProperty mask_use_axis = FindProperty("_HologramMaskUseAxis");
|
|
MaterialProperty mask_y = FindProperty("_HologramYMask");
|
|
editor.TextureProperty(mask, "蒙版");
|
|
editor.ShaderProperty(mask_affect, "蒙版强度");
|
|
GUILayout.Label("项目中有的模型会带有不同方向的旋转,用这个字段筛选旋转后的正确的y轴", EditorStyles.helpBox);
|
|
editor.ShaderProperty(mask_use_axis, "目标渐变的坐标轴");
|
|
editor.ShaderProperty(mask_y, "垂直方向显示蒙版阈值");
|
|
EditorGUI.indentLevel -= 1;
|
|
}
|
|
}
|
|
// 溶解效果
|
|
void DoDissolve()
|
|
{
|
|
// GUILayout.Label("溶解效果", EditorStyles.helpBox);
|
|
expand_dissolve = EditorGUILayout.Foldout(expand_dissolve, "溶解效果");
|
|
if(expand_dissolve)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
EditorGUI.BeginChangeCheck();
|
|
MaterialProperty dissolve_enabled_tog = FindProperty("_DissolveToggle");
|
|
editor.ShaderProperty(dissolve_enabled_tog, "使用溶解效果");
|
|
bool tog1_enabled = GetToggleEnabled(dissolve_enabled_tog);
|
|
MaterialProperty dissolve_map_tog = FindProperty("_DissolveMapToggle");
|
|
bool tog2_enabled = GetToggleEnabled(dissolve_map_tog);
|
|
if(tog1_enabled)
|
|
{
|
|
editor.ShaderProperty(dissolve_map_tog, "使用溶解纹理");
|
|
if(tog2_enabled) // 使用溶解纹理
|
|
{
|
|
MaterialProperty dissolve_map = FindProperty("_DissolveMap");
|
|
editor.TextureProperty(dissolve_map, "溶解纹理");
|
|
}
|
|
MaterialProperty dissolve_threshold = FindProperty("_DissolveThreshold");
|
|
MaterialProperty dissolve_fadein_color = FindProperty("_DissolveFadeInColor");
|
|
MaterialProperty dissolve_fadein_threshold = FindProperty("_DissolveFadeInThreshold");
|
|
MaterialProperty dissolve_mid_color = FindProperty("_DissolveFadeMidColor");
|
|
MaterialProperty dissolve_mid_threshold = FindProperty("_DissolveFadeMidThreshold");
|
|
MaterialProperty dissolve_out_color = FindProperty("_DissolveFadeOutColor");
|
|
MaterialProperty dissolve_out_threshold = FindProperty("_DissolveFadeOutThreshold");
|
|
|
|
editor.ShaderProperty(dissolve_threshold, "溶解进度");
|
|
editor.ColorProperty(dissolve_fadein_color, "开始溶解的颜色");
|
|
editor.ShaderProperty(dissolve_fadein_threshold, "开始溶解阈值");
|
|
editor.ColorProperty(dissolve_mid_color, "进入到溶解时的颜色");
|
|
editor.ShaderProperty(dissolve_mid_threshold, "进入到溶解时的颜色");
|
|
editor.ColorProperty(dissolve_out_color, "溶解至淡出时颜色");
|
|
editor.ShaderProperty(dissolve_out_threshold, "溶解淡出阈值");
|
|
}
|
|
EditorGUI.indentLevel -= 1;
|
|
if(EditorGUI.EndChangeCheck())
|
|
{
|
|
SetKeyword("_USE_DISSOLVE_EFFECT", tog1_enabled);
|
|
SetKeyword("_USE_DISSOLVE_MAP", tog2_enabled);
|
|
}
|
|
}
|
|
}
|
|
// 利用方法优化GUI代码结构,使得代码更容易看
|
|
MaterialProperty FindProperty(string name)
|
|
{
|
|
return FindProperty(name, properties);
|
|
}
|
|
|
|
static GUIContent MakeLabel(string text, string tooltip = null)
|
|
{
|
|
staticLabel.text = text;
|
|
staticLabel.tooltip = tooltip;
|
|
return staticLabel;
|
|
}
|
|
|
|
static GUIContent MakeLabel(MaterialProperty property, string tooltip = null)
|
|
{
|
|
staticLabel.text = property.displayName;
|
|
staticLabel.tooltip = tooltip;
|
|
return staticLabel;
|
|
}
|
|
// 设置shader关键字
|
|
void SetKeyword(string keyword, bool state)
|
|
{
|
|
if(state)
|
|
{
|
|
foreach(Material m in editor.targets)
|
|
{
|
|
m.EnableKeyword(keyword);
|
|
}
|
|
}
|
|
else{
|
|
foreach(Material m in editor.targets)
|
|
{
|
|
m.DisableKeyword(keyword);
|
|
}
|
|
}
|
|
}
|
|
bool IsKeywordEnabled(string keyword)
|
|
{
|
|
return target.IsKeywordEnabled(keyword);
|
|
}
|
|
|
|
void RecordAction(string label)
|
|
{
|
|
editor.RegisterPropertyChangeUndo(label);
|
|
}
|
|
|
|
bool GetToggleEnabled(MaterialProperty property)
|
|
{
|
|
return (int)property.floatValue == 1;
|
|
}
|
|
}
|