188 lines
5.5 KiB
C#
188 lines
5.5 KiB
C#
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using UnityEngine.Rendering;
|
|
|
|
public class AdvanceUnlitCustomGUI : ShaderGUI
|
|
{
|
|
enum RenderMode //All switchable render modes
|
|
{
|
|
Opaque, Cutout, Fade, Transparent
|
|
//Opaque = opacity 100%
|
|
//Cutout = Cutout only opaque parts and ignore the transparent parts
|
|
//Fade = Partial transparency or translucent or semi-transparent objects
|
|
//Trasnparent = Complete transparency
|
|
}
|
|
|
|
struct RenderSettings //Render settings for all render modes
|
|
{
|
|
public RenderQueue queue;
|
|
public string renderType;
|
|
public BlendMode srcBlend, dstBlend;
|
|
public bool zWrite;
|
|
|
|
public static RenderSettings[] modes = {
|
|
new RenderSettings() {
|
|
//Opaque render mode
|
|
queue = RenderQueue.Geometry,
|
|
renderType = "",
|
|
srcBlend = BlendMode.One,
|
|
dstBlend = BlendMode.Zero,
|
|
zWrite = true
|
|
},
|
|
new RenderSettings() {
|
|
//Cutout render mode
|
|
queue = RenderQueue.AlphaTest,
|
|
renderType = "TransparentCutout",
|
|
srcBlend = BlendMode.One,
|
|
dstBlend = BlendMode.Zero,
|
|
zWrite = true
|
|
},
|
|
new RenderSettings() {
|
|
//Fade render mode
|
|
queue = RenderQueue.Transparent,
|
|
renderType = "Transparent",
|
|
srcBlend = BlendMode.SrcAlpha,
|
|
dstBlend = BlendMode.OneMinusSrcAlpha,
|
|
zWrite = false
|
|
},
|
|
new RenderSettings() {
|
|
//Transparent render mode
|
|
queue = RenderQueue.Transparent,
|
|
renderType = "Transparent",
|
|
srcBlend = BlendMode.One,
|
|
dstBlend = BlendMode.OneMinusSrcAlpha,
|
|
zWrite = false
|
|
}
|
|
};
|
|
}
|
|
|
|
static GUIContent staticLabel = new GUIContent();
|
|
Material target;
|
|
MaterialEditor editor;
|
|
MaterialProperty[] properties;
|
|
bool showAlphaCutoff; //Determines whether to show alpha cutoff slider
|
|
|
|
//Main GUI function
|
|
public override void OnGUI(
|
|
MaterialEditor editor, MaterialProperty[] properties
|
|
)
|
|
{
|
|
this.target = editor.target as Material;
|
|
this.editor = editor;
|
|
this.properties = properties;
|
|
|
|
RunRenderModes(); //First put render mode option in the inspector
|
|
|
|
if (showAlphaCutoff)
|
|
{
|
|
SetAlphaCutoff(); //Set alpha cutoff if render mode is set to cutoff
|
|
}
|
|
|
|
base.OnGUI(editor, properties); //Render the default GUI in the end
|
|
}
|
|
|
|
//Switch render modes according to the user's choice
|
|
void RunRenderModes()
|
|
{
|
|
RenderMode mode = RenderMode.Opaque;
|
|
showAlphaCutoff = false;
|
|
if (IsKeywordEnabled("_RENDERING_CUTOUT"))
|
|
{
|
|
mode = RenderMode.Cutout;
|
|
showAlphaCutoff = true;
|
|
}
|
|
else if (IsKeywordEnabled("_RENDERING_FADE"))
|
|
{
|
|
mode = RenderMode.Fade;
|
|
}
|
|
else if (IsKeywordEnabled("_RENDERING_TRANSPARENT"))
|
|
{
|
|
mode = RenderMode.Transparent;
|
|
}
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
mode = (RenderMode)EditorGUILayout.EnumPopup(
|
|
MakeLabel("Render Mode"), mode
|
|
);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
RecordAction("Render Mode");
|
|
SetKeyword("_RENDERING_CUTOUT", mode == RenderMode.Cutout);
|
|
SetKeyword("_RENDERING_FADE", mode == RenderMode.Fade);
|
|
SetKeyword(
|
|
"_RENDERING_TRANSPARENT", mode == RenderMode.Transparent
|
|
);
|
|
|
|
RenderSettings settings = RenderSettings.modes[(int)mode];
|
|
foreach (Material m in editor.targets)
|
|
{
|
|
m.renderQueue = (int)settings.queue;
|
|
m.SetOverrideTag("RenderType", settings.renderType);
|
|
m.SetInt("_SrcBlend", (int)settings.srcBlend);
|
|
m.SetInt("_DstBlend", (int)settings.dstBlend);
|
|
m.SetInt("_ZWrite", settings.zWrite ? 1 : 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Manipulates the alpha cutoff value accoring to slider value
|
|
void SetAlphaCutoff()
|
|
{
|
|
MaterialProperty slider = FindProperty("_AlphaCutoff");
|
|
EditorGUI.indentLevel += 2;
|
|
editor.ShaderProperty(slider, MakeLabel(slider));
|
|
EditorGUI.indentLevel -= 2;
|
|
}
|
|
|
|
//Finds material property name
|
|
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;
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|