Как я могу изменить элементы перечисления с помощью кнопки? - PullRequest
0 голосов
/ 11 ноября 2018
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 получал Opaque, затем при следующем нажатии он получит Cutout, затем Fade and Transparent.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вы можете попытаться использовать клавишу 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);

и объявите значение в классе для хранения BlendMode состояния.

BlendMode currentMode = BlendMode.Cutout;

Затем вы можете использовать этот currentMode (ключ), чтобы получить следующий режим.

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

Примечание

Это решение может быть гибким для определения следующего режима.

0 голосов
/ 11 ноября 2018

enum s начинаются со значения по умолчанию 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...