如何通过脚本将Material渲染模式改为淡入淡出?

How to change Material Rendering Mode to Fade by script?

material 渲染模式现在默认设置为不透明。 我想把它改成淡入淡出。

到目前为止我做了:

if (g.GetComponent<SkinnedMeshRenderer>() != null)
                {
                    Material[] mats = g.GetComponent<SkinnedMeshRenderer>().materials;
                }

material 在索引 0 处只有一个 material 但我不确定如何访问 material 的渲染模式以及如何将其更改为淡入淡出.

到目前为止我尝试了什么:

我创建了一个新的 public 静态 class :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class MaterialUtils
{
    public enum BlendMode
    {
        Opaque,
        Cutout,
        Fade,
        Transparent
    }

    public static void SetupBlendMode(Material material, BlendMode blendMode)
    {
        switch (blendMode)
        {
            case BlendMode.Transparent:
                material.SetOverrideTag("RenderType", "Transparent");
                material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
                material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
                material.SetInt("_ZWrite", 0);
                material.DisableKeyword("_ALPHATEST_ON");
                material.EnableKeyword("_ALPHABLEND_ON");
                material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
                material.SetFloat("_Mode", 3.0f);
                break;
            case BlendMode.Opaque:
                material.SetOverrideTag("RenderType", "");
                material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
                material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
                material.SetInt("_ZWrite", 1);
                material.DisableKeyword("_ALPHATEST_ON");
                material.DisableKeyword("_ALPHABLEND_ON");
                material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                material.renderQueue = -1;
                material.SetFloat("_Mode", 0.0f);
                break;
            default:
                Debug.LogWarning("Warning: BlendMode: " + blendMode + " is not yet implemented!");
                break;
        }
    }
}

然后回到编辑脚本:

OnGUI 内部:

if (GUILayout.Button("Start"))
        {
            allChildren = new List<Transform>();

            foreach (Transform g in transform.GetComponentsInChildren<Transform>())
            {
                var level = ObjectLevel(g);
                names.Add(" Level " + level.ToString());

                if (g.GetComponent<SkinnedMeshRenderer>() != null)
                {
                    Material[] mats = g.GetComponent<SkinnedMeshRenderer>().sharedMaterials;
                    Material mat = mats[0];
                    MaterialUtils.SetupBlendMode(mat, isOpaque ? MaterialUtils.BlendMode.Fade : MaterialUtils.BlendMode.Fade);
                    mats[0] = mat;
                    allChildren.Add(g);
                }
            }
        }

但我在编辑器中收到警告:

警告:混合模式:淡入淡出尚未实现!

在线:

MaterialUtils.SetupBlendMode(mat, isOpaque ? MaterialUtils.BlendMode.Fade : MaterialUtils.BlendMode.Opaque);

渲染模式仍然是不透明的。

只需设置_Mode的浮点数属性:

renderer.material.SetFloat("_Mode", 1)

例如代码:

private MeshRenderer renderer;
void Start() => renderer = GetComponent<MeshRenderer>();
void Update()
{
    if (Input.GetKeyDown(KeyCode.Alpha1))
    {
        renderer.material.SetFloat("_Mode", 0); // Opaque
    }
    if (Input.GetKeyDown(KeyCode.Alpha2))
    {
        renderer.material.SetFloat("_Mode", 1); // Cutout
    }
    if (Input.GetKeyDown(KeyCode.Alpha3))
    {
        renderer.material.SetFloat("_Mode", 2); // Fade
    }
    if (Input.GetKeyDown(KeyCode.Alpha4))
    {
        renderer.material.SetFloat("_Mode", 3); // Transparent
    }
}