淡入/淡出GameObject

goo*_*iag 4 c# 2d sprite unity-game-engine

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

到目前为止,我已经设法弄清楚如何在触发器上使"秘密墙"GO处于非活动状态,因此它会消失,但这并不会产生我想要的视觉效果.正如我所说,我仍在努力开发编码器的思维方式,所以虽然我已经做了很多研究来解决这个问题,但很多结果我都不太明白.

这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SecretDoor1 : MonoBehaviour {

    void OnTriggerEnter2D (Collider2D SecretDoorTrig) {
         if (SecretDoorTrig.gameObject.tag == "Player") {
             GetComponent<SpriteRenderer> ().enabled = false;
         }
         else {
             GetComponent<SpriteRenderer> ().enabled = true;
         }
    }

    void OnTriggerExit2D (Collider2D SecretDoorTrig) {

         if (SecretDoorTrig.gameObject.tag == "Player") {

             GetComponent<SpriteRenderer> ().enabled = true;
         }
         else {
             GetComponent<SpriteRenderer> ().enabled = false;
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

Pro*_*mer 5

随着时间的推移,淡化a Sprite移动 GameObject 几乎相同,除了你修改它的alpha而不是它的位置.

关于褪色对象的三个最重要的东西是Time.deltaTime,Mathf.Lerp/Color.Lerp和协程.您需要了解这些如何协同工作.

启动协同程序,用于Time.deltaTime增加变量.该变量用于确定该函数的运行程度.在for/ whileloop中,使用每帧递增的变量以及希望淡入淡出的持续时间,以便在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想让它淡入,换Mathf.Lerp(1, 0, counter / duration);Mathf.Lerp(0, 1, counter / duration);这将使得阿尔法从去01过的时间,而不是10.


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

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

GameObject褪色:

public GameObject SpriteRend;
Run Code Online (Sandbox Code Playgroud)

淡出3秒钟

StartCoroutine(fadeInAndOut(SpriteRend, false, 3f));
Run Code Online (Sandbox Code Playgroud)

淡入3秒

StartCoroutine(fadeInAndOut(SpriteRend, true, 3f));
Run Code Online (Sandbox Code Playgroud)


小智 1

我完成此操作的方法是更改​​精灵颜色的 Alpha。

颜色(R、G、B、A)。A 是阿尔法。

  • 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%透明,精灵看不到。

  • 值得注意的是,颜色对象可以缓存到字段中并重复使用。 (2认同)