【问题标题】:Unity Mesh Renderer won't be completely transparentUnity Mesh Renderer 不会完全透明
【发布时间】:2017-01-14 23:12:17
【问题描述】:

我正在创建一个脚本,允许对象在一段时间内褪色。

脚本运行良好,但是当对象淡出时,它在检查器和构建中仍然非常可见。

有人可以解释一下为什么以及如何使对象完全不可见吗? (我知道我可以“启用”该对象,但它使用的资源不是比褪色还多吗?我不知道 :()

如果我犯了任何错误,这里是代码(代码灵感来自统一论坛中的一个主题)

// Update is called once per frame
void Update () 
{
    MyTime = Time.deltaTime;
    AccumulatedTime += MyTime;
    if (this.name == "Cube (1)")
    {
        Debug.Log(AccumulatedTime);
    }
    if (SwitchVisibility == 1)
    {

        if (AccumulatedTime >= Interval && AccumulatedTime<= 2*Interval || AccumulatedTime >= 3*Interval && AccumulatedTime<= 4*Interval)
        {
            StartCoroutine(FadeTo(0.0f, 1.0f));
            SwitchVisibility = 0;
        }
    }
    if (SwitchVisibility == 0)
    {
        if (AccumulatedTime >= 0 && AccumulatedTime <= Interval || AccumulatedTime >= 2*Interval && AccumulatedTime <= 3*Interval)
        {
            StartCoroutine(FadeTo(1.0f, 1.0f));
            SwitchVisibility = 1;
        }
    }
    if (AccumulatedTime >= Interval * 4.5f)
    {
        AccumulatedTime = 0;
    }
}

IEnumerator FadeTo(float aValue, float aTime)
{
    float alpha = MyRenderer.material.color.a;
    for (float t = 0.0f; t < 1.0f; t += Time.deltaTime / aTime)
    {
        OriginalColor.a = Mathf.Lerp(alpha, aValue, t);
        Color newColor = OriginalColor;
        MyRenderer.material.color = newColor;  
        yield return null;
    }
}

这是对象的样子:

【问题讨论】:

  • FadeTo 函数中的aValueaTime 变量是什么?另外,你想随着时间的推移而褪色吗?您是否还想让对象在某个时候出现?
  • aTime 是“for”语句中用于除以 Time.DeltaTime 的值。它设置淡化对象的速度。我每隔“间隔”秒淡化一次(在编辑器中设置间隔)。我可能没有正确解释问题,我的问题是我想让它完全不可见,代码运行良好(好吧,即使它不会使对象不可见)
  • 为什么不输入 Debug.Log(alpha) 并查看该值是否实际上为 0。这将有助于解决您的代码。告诉我结果。我知道了。不,您的代码无法正常工作。让我知道Debug.Log(alpha)的输出
  • Grmbl,我不知道为什么我没有考虑过......你是对的,alpha是0.006000......为什么不是0?
  • 我猜这是因为浮点数和浮点数不精确。通常,将其设置为某个阈值的最小值/最大值是个好主意。类似if alpha &lt;= 0.01 -&gt; alpha = 0

标签: c# unity3d opacity


【解决方案1】:

假设您的代码没有问题,那么问题很可能来自您的材质设置。这在 Unity 5 中发生了变化。要更改 Mesh Renderer 的 alpha,您还必须将材质的 Rendering ModeOpaque(默认)更改为 Fade强>。

透明模式也可以,但不会完全透明,会导致您的问题出现问题

您可以通过脚本更改模式。

属性名称_Mode

使用Debug.Log(MyRenderer.material.GetFloat("_Mode"));,我得到了以下值:

0 = Opaque
1 = Cutout
2 = Fade
3 = Transparent

我们可以用MyRenderer.material.SetFloat("_Mode",2);Rendering Mode改为Fade

从脚本设置渲染模式时有一个已知的problem。您还必须更新所有其他属性以使更改生效。这是将渲染模式更改为从脚本淡出的完整方法:

MyRenderer.material.SetFloat("_Mode", 2);
MyRenderer.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
MyRenderer.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
MyRenderer.material.SetInt("_ZWrite", 0);
MyRenderer.material.DisableKeyword("_ALPHATEST_ON");
MyRenderer.material.EnableKeyword("_ALPHABLEND_ON");
MyRenderer.material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
MyRenderer.material.renderQueue = 3000;

最后,如果这对你有用,那么你的脚本不好。您可以使用下面的脚本来淡入和淡出 Mesh Renderer。

public MeshRenderer MyRenderer;
bool fading = false;

void Fade(bool fadeIn, float duration)
{
    if (fading)
    {
        return;
    }
    fading = true;

    changeModeToFade();
    StartCoroutine(FadeTo(fadeIn, duration));
}

void changeModeToFade()
{
    MyRenderer.material.SetFloat("_Mode", 2);
    MyRenderer.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
    MyRenderer.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
    MyRenderer.material.SetInt("_ZWrite", 0);
    MyRenderer.material.DisableKeyword("_ALPHATEST_ON");
    MyRenderer.material.EnableKeyword("_ALPHABLEND_ON");
    MyRenderer.material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
    MyRenderer.material.renderQueue = 3000;
}

IEnumerator FadeTo(bool fadeIn, float duration)
{
    //MyRenderer.material.
    float counter = 0f;

    //Set Values depending on if fadeIn or fadeOut
    float a, b;
    if (fadeIn)
    {
        a = 0;
        b = 1;
    }
    else
    {
        a = 1;
        b = 0;
    }


    //Enable MyRenderer component
    if (!MyRenderer.enabled)
        MyRenderer.enabled = true;

    //Get original Mesh Color
    Color meshColor = MyRenderer.material.color;


    //Do the actual fading
    while (counter < duration)
    {
        counter += Time.deltaTime;
        float alpha = Mathf.Lerp(a, b, counter / duration);
        Debug.Log(alpha);


        MyRenderer.material.color = new Color(meshColor.r, meshColor.g, meshColor.b, alpha);
        yield return null;
    }

    if (!fadeIn)
    {
        //Disable Mesh Renderer
        MyRenderer.enabled = false;
    }
    fading = false; //So that we can call this function next time
}

void Start()
{
    //Fade(true, 3f); //Fade In
    Fade(false, 3f);//Fade Out
}

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多