淡入/淡出GameObject

时间:2017-07-05 18:28:29

标签: c# unity3d 2d sprite

我对编码很陌生,我仍然在努力发展思维逻辑,以帮助我创建我想要的游戏解决方案。目前,我在Unity尝试创建一个2D GameObject,它是隐藏一扇秘密门的墙。当玩家GameObject触发它时,我希望GameObject淡出(大约90%),露出后面的空间和隐藏的门。

到目前为止,我已经设法弄清楚如何渲染'#34;秘密墙"在触发器上处于非活动状态,因此它会消失,但这并不会产生我想要的视觉效果。正如我所说的那样,我仍然在努力发展这种编码器的思维方式,所以虽然我已经做了很多研究来解决这个问题,但是很多结果我并没有做到。很容易理解。

这是我的代码:

main

2 个答案:

答案 0 :(得分:5)

随着时间的推移淡出Sprite几乎与moving GameObject相同,只不过你修改了alpha而不是它的位置。

关于淡化对象的三个最重要的东西是Time.deltaTimeMathf.Lerp/Color.Lerp和协程。您需要了解这些如何协同工作。

启动协同程序,使用Time.deltaTime增加变量。该变量用于确定该函数的运行程度。在for / while循环中,使用每帧递增的变量以及希望淡入淡出的持续时间,以便在Mathf.Lerp函数的帮助下生成alpha。使用该alpha创建新颜色,并将其指定给Sprite。

每个帧都会这样做,直到用Time.deltaTime递增的变量达到你希望淡入淡出的持续时间。

这是一个简单的SpriteRenderer淡入淡出功能:

public SpriteRenderer spriteToFade;

IEnumerator fadeOut(SpriteRenderer MyRenderer, float duration)
{
    float counter = 0;
    //Get current color
    Color spriteColor = MyRenderer.material.color;

    while (counter < duration)
    {
        counter += Time.deltaTime;
        //Fade from 1 to 0
        float alpha = Mathf.Lerp(1, 0, counter / duration);
        Debug.Log(alpha);

        //Change alpha only
        MyRenderer.color = new Color(spriteColor.r, spriteColor.g, spriteColor.b, alpha);
        //Wait for a frame
        yield return null;
    }
}

如果您希望它淡入,请将Mathf.Lerp(1, 0, counter / duration);更改为Mathf.Lerp(0, 1, counter / duration);,这会使alpha从0变为1而不是1 } 0

从上面的示例中,编写淡出和淡入功能只需要一种方法来告诉函数将alpha从1更改为0或从0更改为1。您可以使用booleanenum变量来确定要执行的淡入淡出类型。当然,您可以将淡入/淡出功能分开,但最好将它放在一个功能中。

这是该功能的扩展版本,支持淡入和淡出。它还支持几乎所有游戏对象,如MeshRenderer(3D),SpriteRenderer(2D),ImageRawImage ....您可以扩展它以支持更多缺少的组件。

IEnumerator fadeInAndOut(GameObject objectToFade, bool fadeIn, float duration)
{
    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;
    }

    int mode = 0;
    Color currentColor = Color.clear;

    SpriteRenderer tempSPRenderer = objectToFade.GetComponent<SpriteRenderer>();
    Image tempImage = objectToFade.GetComponent<Image>();
    RawImage tempRawImage = objectToFade.GetComponent<RawImage>();
    MeshRenderer tempRenderer = objectToFade.GetComponent<MeshRenderer>();
    Text tempText = objectToFade.GetComponent<Text>();

    //Check if this is a Sprite
    if (tempSPRenderer != null)
    {
        currentColor = tempSPRenderer.color;
        mode = 0;
    }
    //Check if Image
    else if (tempImage != null)
    {
        currentColor = tempImage.color;
        mode = 1;
    }
    //Check if RawImage
    else if (tempRawImage != null)
    {
        currentColor = tempRawImage.color;
        mode = 2;
    }
    //Check if Text 
    else if (tempText != null)
    {
        currentColor = tempText.color;
        mode = 3;
    }

    //Check if 3D Object
    else if (tempRenderer != null)
    {
        currentColor = tempRenderer.material.color;
        mode = 4;

        //ENABLE FADE Mode on the material if not done already
        tempRenderer.material.SetFloat("_Mode", 2);
        tempRenderer.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
        tempRenderer.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
        tempRenderer.material.SetInt("_ZWrite", 0);
        tempRenderer.material.DisableKeyword("_ALPHATEST_ON");
        tempRenderer.material.EnableKeyword("_ALPHABLEND_ON");
        tempRenderer.material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
        tempRenderer.material.renderQueue = 3000;
    }
    else
    {
        yield break;
    }

    while (counter < duration)
    {
        counter += Time.deltaTime;
        float alpha = Mathf.Lerp(a, b, counter / duration);

        switch (mode)
        {
            case 0:
                tempSPRenderer.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
                break;
            case 1:
                tempImage.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
                break;
            case 2:
                tempRawImage.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
                break;
            case 3:
                tempText.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
                break;
            case 4:
                tempRenderer.material.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
                break;
        }
        yield return null;
    }
}

<强>用法

GameObject褪色:

public GameObject SpriteRend;

3秒内淡出

StartCoroutine(fadeInAndOut(SpriteRend, false, 3f));

3秒内淡入

StartCoroutine(fadeInAndOut(SpriteRend, true, 3f));

答案 1 :(得分:1)

我完成此操作的方法是改变精灵颜色的alpha值。

颜色(R,G,B,A)。 A是alpha。

  • SpriteRenderer.color = new Color(1f,1f,1f,1f)不透明。
  • SpriteRenderer.color = new Color(1f,1f,1f,.5f)约为50% 透明。
  • SpriteRenderer.color = new Color(1f,1f,1f,0f)约 100%透明,精灵无法看到。