源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

298 regels
13 KiB

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;
}
}