У меня проблемы с созданием скрипта для постепенного исчезновения списка спрайтов в Unity c # - PullRequest
0 голосов
/ 10 июля 2019

У меня есть пара спрайтов, через которые я хочу перейти с эффектом постепенного появления / исчезновения для сцены кредитов моей игры. У меня есть скрипт, который работает, но он работает только с одним спрайтом. Как я могу сделать так, чтобы у меня был список спрайтов для циклического просмотра?

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 ]

2 голосов
/ 10 июля 2019

Во-первых, давайте сделаем простой рефакторинг, возьмем бит, который выполняет реальную работу, и разделим его на метод.Итак, эти две строки:

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

Можно превратить в метод и вызвать вместо него код youro

 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);
    }
  }
}

Теперь, если вы хотите применить изменение к нескольким спрайтам, вам нужно всего лишь сделать int в одном месте.Измените ваше объявление с:

public SpriteRenderer sprite;

на

public SpriteRenderer[] sprites;

И, наконец, мы можем изменить наш метод SetFade так:

void SetFade(float fade)
  {
          spriteColor.a = fade;
          foreach(var sprite in sprites)
            sprite.color = spriteColor;
 }
2 голосов
/ 10 июля 2019

Я не совсем уверен, что вы пытаетесь сделать, но вскоре вы можете добавить черное изображение спрайта / холста, которое покрывает всю сцену с альфа = 0, и аналогичным способом вы измените альфа на 1. Это должно быть лучше производительность, чем зацикливание каждого спрайта.

Если вам нужен отдельный элемент управления для каждого спрайта: добавьте параметр SpriteRenderer к своему методу, сохраните все спрайты в списке и вызовите свой метод для каждого спрайта в spriteList. Для лучшей практики вы можете добавить метод расширения к SpriteRenderer

...