Unity Material.color.a 代码不起作用

ere*_*ger 2 camera triggers renderer unity-game-engine

 void OnTriggerStay(Collider other)
{
    if (other.gameObject.CompareTag("tree"))
    {
        Color color = other.gameObject.GetComponent<Renderer>().material.color;
        color.a = 0.5f;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果带有“树”标签的对象进入相机的触发器,我希望该对象的不透明度为 0.5。但没有成功。我怎样才能解决这个问题?谢谢。

use*_*449 5

虽然其他两个答案在技术上是正确的,但您很可能错过了允许更改 a 的 alpha 的非常重要的步骤Material。我将猜测并假设您Material使用Asset Creation Menu. 默认情况下,Material RenderMode设置为Opaque

为了允许更改Material颜色的 Alpha,您需要将或设置RenderMode为。如果您使用自定义着色器,则需要更改代码以格式化为上述之一。如果您需要帮助修改着色器,最好在新问题中得到回答。TransparentFadeRenderTypes

为了清楚起见,这里有一张 gif 来说明可能出现的混乱情况:

例子

编辑:为了完整性,这里有一个完整的脚本,RenderMode如果您不想在编译时更改它,它将在运行时切换您的材料。

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

[RequireComponent(typeof(MeshRenderer))]
public class TestScript : MonoBehaviour
{
    [SerializeField] private MeshRenderer mr = null;
    [SerializeField] private float alphaChange = 0.5f;
    private bool isOpaque = true;

    private void Awake()
    {
        if (mr == null)
            mr = GetComponent<MeshRenderer>();
    }

    private void OnMouseDown()
    {
        // store our color struct and change the alpha channel
        Color clr = mr.material.color;
        clr.a = alphaChange;

        // instance our material to alter the rendermode
        Material mat = mr.material;

        // update our render mode to transparent and our color to the new alpha
        MaterialUtils.SetupBlendMode(mat, isOpaque ? MaterialUtils.BlendMode.Transparent : MaterialUtils.BlendMode.Opaque);
        mat.color = clr;

        // apply our material change
        mr.material = mat;

        // toggle our bool
        isOpaque = !isOpaque;
    }
}
Run Code Online (Sandbox Code Playgroud)

您最初的问题没有说明您是否需要将材质切换回不透明,但我将其包括在内。您可以保留RenderModeasTransparent并简单地将 alpha 更改回 ,1.0f使其再次完全不透明。同样,下面是上述脚本实际运行的 gif 示例:

实施例2

为了表明该代码片段正在运行,我在立方体后面放置了 2 个球体。对于您所需要的内容来说,该片段可能有点过分了,但是如果其他人偶然发现了这个问题并且需要一个更通用的答案,那就是!