unity3d - unity material.color.a代码不起作用

标签 unity3d triggers camera renderer

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

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

最佳答案

虽然其他两个答案在技术上是正确的,但您很可能错过了允许更改 Material 的 alpha 的非常重要的步骤。我会猜测并假设您使用 Asset Creation Menu 在编辑器中生成了一个新的 Material。默认情况下, Material RenderMode设置为不透明

要允许更改 Material 颜色的 alpha,您需要将 RenderMode 设置为 TransparentFade。如果您使用的是自定义着色器,则需要更改代码以格式化为提到的 RenderTypes 之一。如果您在修改着色器时需要帮助,最好在一个新问题中回答。

为了清楚起见,这里有一个 gif 图像,说明可能会出现混淆:

Example

编辑:为了完整起见,这里有一个完整的脚本,如果您不想在编译时更改它,它将在运行时切换 Material 的 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;
    }
}

您最初的问题没有说明您是否需要将 Material 切换回不透明,但我将其包括在内。您可以将 RenderMode 保持为 Transparent 并将 alpha 更改回 1.0f 以使其再次完全不透明。同样,这里是上述脚本的 gif 示例:

Example 2

为了表明该代码段有效,我在立方体后面放置了 2 个球体。该代码段可能对您的需求来说有点矫枉过正,但如果其他人无意中发现了这个问题并需要更通用的答案,那就来这里吧!

关于unity3d - unity material.color.a代码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69003736/

相关文章:

animation - Unity3D:何时评估转换条件

mysql - 使用 Resource 文件夹和 Mysql 在 Unity 中加载 3D 模型

c# - MouseEnter WPF 上的发光效果

unity3d - 用纹理填充贝塞尔曲线之间的区域

c# - 如何让按钮调用服务器功能然后更新更新面板?

c# - 如何在 Application Insights 中为 Web 作业设置警报并在 Web 作业失败时获取通知

ios - 如何从 ip camera iOs iPad/iPhone 捕获视频

html - 输入类型文件标签中的 capture ="user"和 capture ="camera"有什么区别?

android - 在 API 8 之前获取 Android 相机文件夹

android - Android和Unity之间如何通信?