material 渲染模式现在默认设置为"不透明".

到目前为止,我做到了:

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

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

Material

到目前为止我所做的try :

我创建了一个新的公共静态类:

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

然后返回编辑器脚本:

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

但我在编辑中得到警告:

警告:BlendMode:尚未实现淡入淡出!

在线:

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

渲染模式仍然不透明.

推荐答案

只需将float设置为_Mode属性:

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

E、 g代码:

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

Csharp相关问答推荐

EF Core 8—应用客户端投影后无法转换集操作

是否可以使用EF—Core进行临时部分更新?

Select Many和默认IfEmpty内部Select Many错误工作

Nuget包Serilog.Sinks.AwsCloudwatch引发TypeLoadExceptions,因为父类型是密封的

Quartz调度程序不调用作业(job)类

如何将不同类型的扩展参数的javascript函数转换成C#风格?

如何测量在使用UTF8而不是C#中的UTF16编码字符串时内存使用量的增长

在路由中使用枚举

使用HttpResponseMessage中的嵌套列表初始化JSON

当用户右键单击文本框并单击粘贴时触发什么事件?

C#无法让WinForm进度条生成动画错误跨线程操作无效

如何在C#中实现非抛出`MinBy`?

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

将内置的OrderedEumable&Quot;类设置为内部类有什么好处?

此异步方法在重写方法中缺少等待运算符警告

CsvHelper在第二次迭代时抛出System.ObjectDisposedException

为什么我不能在固定语句中使用外部函数?

为什么使用User.IsInRole()总是返回FALSE?

现在是否有一个.NET SDK等效于AsyncEx的AsyncLock?