如何使用按钮更改枚举项


using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEditor.IMGUI;
public class ChangeShaderRenderingModes : EditorWindow
{
public enum BlendMode
{
Opaque,
Cutout,
Fade,
Transparent
}
static Material material;
static Material objectMat;
static int modeIndex = 0;
[MenuItem("Tools/Change Rendering Modes")]
public static void ShowWindow()
{
GetWindow<ChangeShaderRenderingModes>("ChangeRenderingModes");
}
private void OnGUI()
{
if(GUI.Button(new Rect(50,50,50,50), "Switch Mode"))
{
var objects = Selection.objects;
Shader shader = Shader.Find("Standard");
material = new Material(shader);
if (modeIndex == 4)
modeIndex = 0;
ChangeRenderMode(material, BlendMode.Opaque);
GameObject go = GameObject.Find("test");
objectMat = go.GetComponent<Renderer>().sharedMaterial;
objectMat = material;
go.GetComponent<Renderer>().sharedMaterial = material;
}
}
public static void ChangeRenderMode(Material standardShaderMaterial, BlendMode blendMode)
{
switch (blendMode)
{
case BlendMode.Opaque:
standardShaderMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
standardShaderMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
standardShaderMaterial.SetInt("_ZWrite", 1);
standardShaderMaterial.DisableKeyword("_ALPHATEST_ON");
standardShaderMaterial.DisableKeyword("_ALPHABLEND_ON");
standardShaderMaterial.DisableKeyword("_ALPHAPREMULTIPLY_ON");
standardShaderMaterial.renderQueue = -1;
break;
case BlendMode.Cutout:
standardShaderMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
standardShaderMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
standardShaderMaterial.SetInt("_ZWrite", 1);
standardShaderMaterial.EnableKeyword("_ALPHATEST_ON");
standardShaderMaterial.DisableKeyword("_ALPHABLEND_ON");
standardShaderMaterial.DisableKeyword("_ALPHAPREMULTIPLY_ON");
standardShaderMaterial.renderQueue = 2450;
break;
case BlendMode.Fade:
standardShaderMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
standardShaderMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
standardShaderMaterial.SetInt("_ZWrite", 0);
standardShaderMaterial.DisableKeyword("_ALPHATEST_ON");
standardShaderMaterial.EnableKeyword("_ALPHABLEND_ON");
standardShaderMaterial.DisableKeyword("_ALPHAPREMULTIPLY_ON");
standardShaderMaterial.renderQueue = 3000;
break;
case BlendMode.Transparent:
standardShaderMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
standardShaderMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
standardShaderMaterial.SetInt("_ZWrite", 0);
standardShaderMaterial.DisableKeyword("_ALPHATEST_ON");
standardShaderMaterial.DisableKeyword("_ALPHABLEND_ON");
standardShaderMaterial.EnableKeyword("_ALPHAPREMULTIPLY_ON");
standardShaderMaterial.renderQueue = 3000;
break;
}
}
}

我想让我每次点击按钮都会切换到下一个模式。不透明、裁切、褪色、透明

和透明后回到第一个不透明

问题是ChangeRenderMode方法获得了一个特定的模式。我想当单击按钮一次ChangeRenderMode将获得不透明,然后下一次单击它将获得剪切,然后渐变和透明。

enum以默认值0开始,每个项目增加1,因此

public enum BlendMode
{
Opaque,   // = 0
Cutout,   // = 1
Fade,     // = 2
Transparent  // = 3
}

因此,您可以将其解析为int,计算下一个值,然后再次将其解析成BlendMode:

OnGUI功能中,更换

if (modeIndex == 4)
modeIndex = 0;
ChangeRenderMode(material, BlendMode.Opaque);

带有

var values = (BlendMode[])Enum.GetValues(typeof(BlendMode))
modeIndex = (BlendMode)((modeIndex+1) % values.Length);
ChangeRenderMode(material, blendMode);

您可以尝试使用Dictionary键作为当前状态值作为下一个状态。

Dictionary<BlendMode, BlendMode> dict = new Dictionary<BlendMode, BlendMode>();
dict.Add(BlendMode.Opaque, BlendMode.Cutout);
dict.Add(BlendMode.Cutout, BlendMode.Fade);
dict.Add(BlendMode.Fade, BlendMode.Transparent);
dict.Add(BlendMode.Transparent, BlendMode.Opaque);

并在类中声明一个值以存储CCD_ 6状态。

BlendMode currentMode = BlendMode.Cutout;

然后您可以使用这个currentMode(键(来获得下一个Mode。

currentMode = dict[currentMode];

完整代码将类似

public class ChangeShaderRenderingModes : EditorWindow
{
//store mode
static BlendMode currentMode = BlendMode.Opaque;
static Dictionary<BlendMode, BlendMode> dict = new Dictionary<BlendMode, BlendMode>();

public void Awake()
{
dict.Add(BlendMode.Opaque, BlendMode.Cutout);
dict.Add(BlendMode.Cutout, BlendMode.Fade);
dict.Add(BlendMode.Fade, BlendMode.Transparent);
dict.Add(BlendMode.Transparent, BlendMode.Opaque);
}

public enum BlendMode
{
Opaque,
Cutout,
Fade,
Transparent
}
static Material material;
static Material objectMat;
static int modeIndex = 0;
[MenuItem("Tools/Change Rendering Modes")]
public static void ShowWindow()
{
GetWindow<ChangeShaderRenderingModes>("ChangeRenderingModes");
}
private void OnGUI()
{
if(GUI.Button(new Rect(50,50,50,50), "Switch Mode"))
{
var objects = Selection.objects;
Shader shader = Shader.Find("Standard");
material = new Material(shader);
if (modeIndex == 4)
modeIndex = 0;
// take out the parameter
ChangeRenderMode(material);
GameObject go = GameObject.Find("test");
objectMat = go.GetComponent<Renderer>().sharedMaterial;
objectMat = material;
go.GetComponent<Renderer>().sharedMaterial = material;
}
}
public static void ChangeRenderMode(Material standardShaderMaterial)
{
switch (blendMode)
{
....
}
// set next mode
currentMode = dict[currentMode];
}
}

注意

这个解决方案可以灵活地确定下一个模式是什么

最新更新