我在使脚本淡入/淡出Unity C#中的精灵列表时遇到麻烦

时间:2019-07-10 12:55:34

标签: c# unity3d sprite

我想通过游戏的点数场景中的淡入/淡出效果来循环几个精灵。我有一个可以工作的脚本,但是它只能与一个精灵一起工作。如何做到这一点,以便我可以列出一个精灵列表?

using UnityEngine;
using System.Collections;

public class possible : MonoBehaviour
{
public SpriteRenderer sprite;

public Color spriteColor = Color.white;
public float fadeInTime = 1.5f;
public float fadeOutTime = 3f;
public float delayToFadeOut = 5f;
public float delayToFadeIn = 5f;

void Start()
{
    StartCoroutine("FadeCycle");
}

IEnumerator FadeCycle()
{
    float fade = 0f;
    float startTime;
    while (true)
    {
        startTime = Time.time;
        while (fade < 1f)
        {
            fade = Mathf.Lerp(0f, 1f, (Time.time - startTime) / 
fadeInTime);
            spriteColor.a = fade;
            sprite.color = spriteColor;
            yield return null;
        }
        //Make sure it's set to exactly 1f
        fade = 1f;
        spriteColor.a = fade;
        sprite.color = spriteColor;
        yield return new WaitForSeconds(delayToFadeOut);

        startTime = Time.time;
        while (fade > 0f)
        {
            fade = Mathf.Lerp(1f, 0f, (Time.time - startTime) / 
fadeOutTime);
            spriteColor.a = fade;
            sprite.color = spriteColor;
            yield return null;
        }
        fade = 0f;
        spriteColor.a = fade;
        sprite.color = spriteColor;
        yield return new WaitForSeconds(delayToFadeIn);
    }
  }
}

2 个答案:

答案 0 :(得分:1)

我不确定您要做什么,但是不久您可以添加一个黑色的sprite / canvas图像,该图像覆盖alpha = 0的所有场景,并且使用类似的方法将alpha更改为1。它应该更好比循环每个Sprite更好。

如果要对每个Sprite进行单独控制,请执行以下操作:将SpriteRenderer参数添加到方法中,并将所有Sprite存储在列表中,然后为spriteList中的每个Sprite调用方法。为了更好的实践,您可以向SpriteRenderer

添加扩展方法

答案 1 :(得分:1)

首先,让我们做一个简单的重构,然后做一些实际的工作,然后将其分离为一个方法。所以这两行:

        spriteColor.a = fade;
        sprite.color = spriteColor;

可以转换为方法,并改为在您的代码中调用

 void SetFade(float fade)
 {
        spriteColor.a = fade;
        sprite.color = spriteColor;
 }

然后,您的其余代码变得更短,并且已经很容易读懂了:

IEnumerator FadeCycle()
{
 float startTime;
 while (true)
  {
     startTime = Time.time;
     while (fade < 1f)
     {
         fade = Mathf.Lerp(0f, 1f, (Time.time - startTime) / fadeInTime);
         SetFade(fade);      
         yield return null;
     }
     SetFade(1);
     yield return new WaitForSeconds(delayToFadeOut);
     startTime = Time.time;
     while (fade > 0f)
     {
         SetFade(Mathf.Lerp(1f, 0f, (Time.time - startTime) / fadeOutTime));
         yield return null;
     }
     SetFade(0);
     yield return new WaitForSeconds(delayToFadeIn);
    }
  }
}

现在,如果要将更改应用于多个Sprite,则只需将int放在一个地方即可。将声明从以下位置更改:

public SpriteRenderer sprite;

public SpriteRenderer[] sprites;

最后我们可以将SetFade方法修改为:

void SetFade(float fade)
  {
          spriteColor.a = fade;
          foreach(var sprite in sprites)
            sprite.color = spriteColor;
 }