【问题标题】:Fading in/out GameObject淡入/淡出游戏对象
【发布时间】:2017-07-05 18:28:29
【问题描述】:

我对编码还很陌生,我仍在努力发展这种思维逻辑,以帮助我创建我想要的游戏解决方案。目前,我在 Unity 中尝试创建一个 2D 游戏对象,它是一堵隐藏秘密门的墙。我希望该游戏对象在玩家游戏对象触发它时淡出(大约 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;
         }
    }
}

【问题讨论】:

    标签: c# unity3d 2d sprite


    【解决方案1】:

    随着时间的推移淡化 Sprite 几乎与 moving 游戏对象相同,只是您修改了它的 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;
        }
    }
    

    用法

    要淡出的游戏对象:

    public GameObject SpriteRend;
    

    3 秒后淡出

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

    在 3 秒内淡入

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

    【讨论】:

      【解决方案2】:

      我实现这一点的方法是更改​​精灵颜色的 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% 透明,看不到精灵。

      【讨论】:

      • 值得注意的是,颜色对象可以缓存到一个字段中并重复使用。
      • @Laslos 我不想这么说,但我不知道如何实现该代码。你能举个例子说明我将如何插入它吗?我会将这些相同的效果应用到其他 GO,因此了解一下会很有用。
      • @goodwiag 设置门的透明度为90%,设置门GameObject的颜色:DoorGameObject.GetComponent().color = new Color(1f,1f,1f,。 1f);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多