Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Elaborar um texto de Fade In/Out

Olá professor, tudo certo?

Minha dúvida é a seguinte: como posso elaborar um texto que dê Fade In/Out?

Após assistir à aula "Aviso de Chefe Criado", tentei fazer com que o aviso desse Fade In/Out (como se fosse um Biohazard alarm), porém, ainda tenho algumas limitações com a ferramenta.

A primeira maneira que pensei foi a seguinte:

corTexto.a = Mathf.Lerp(1, 0.1f, contador); corTexto.a = Mathf.Lerp(0.1f, 1, contador); corTexto.a = Mathf.Lerp(1, 0, contador);

Imaginei que essa alternação nos parâmetros funcionaria, mas não mudou nada.

A segunda maneira, foi tentar utilizar o Animation, porém, não soube como acessar o componente e rodar o clipe.

E a última que consigo imaginar, é usando o Animator, porém, não sei como criar uma animação de tal tipo, ou até mesmo se é possível.

Por fim, gostaria de agradecer por todas as aulas ministradas por você, absorvi muita coisa com o conteúdo deste curso!

6 respostas

Olá, Kalil, tudo bem?

Fico feliz que tenha gostado dos cursos!

Seu primeiro código parece bom talvez o problema do uso seja em relação ao contador, acho você poderia usar uma corrotina pra evitar esse problema, algo como:

    public IEnumerator FadeOutText(float time, Text text)
    {
        text.color = new Color(text.color.r, text.color.g, text.color.b, 1);
        while (text.color.a > 0.0f)
        {
            text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a - (Time.deltaTime / time));
            yield return null;
        }
    }

E aí você chama a corrotina da seguinte forma StartCoroutine(FadeOutText(1.5f, GetComponent<Text>())); o código está simplificado e você pode simplesmente mexer no alpha se quiser. Corrotinas são formas de criar uma função que não travam independente do Update ou outras coisas, elas podem ir executando ao longo de vários frames.

Você também pode fazer com o Lerp e tratar isso no Update ou como fiz acima, vai funcionar parecido. Esse tópico é tratado nos próximos cursos de jogos.

Inclusive o exemplo de courotine da Unity tem o Fade e está até mais bonitinho do que esse que sugeri, você pode ver aqui


Essa forma do Animation também é boa, você pode selecionar o objeto e na aba de animation selecionar a cor do texto e bater um keyframe assim você grava esse estado, depois mover o tempo para algo como 2 segundos e bater um segundo keyframe do alpha zerado.

Então você teria isso numa animação e agora pode tocar com o componente animation ou usando o animator também.

Acho que as duas que você fez são boas formas de resolver o problema, falta só resolver esses detalhezinhos que deve funcionar

Entendi a primeira parte da corrotina, mas a parte do Animation ainda é um desafio para mim. Criei o clipe do jeito que quero, mas não sei como implementar no script. A não ser que seja possível implementar o clip com compressão do tipo "anim" no Animator. Se sim, já tenho uma noção de como fazer a implementação.

Consegui fazer a implementação baseado nas linhas que você mostrou, ficou assim:

    IEnumerator FadeOutText(float time, Text text)
    {
        text.gameObject.SetActive(true);
        text.color = new Color(text.color.r, text.color.g, text.color.b, 0);

        while (text.color.a < 1f)
        {
            text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a + (Time.deltaTime / time));
            yield return null;
        }
        while (text.color.a > 0.0f)
        {
            text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a - (Time.deltaTime / time));
            yield return null;
        }

        while (text.color.a < 1f)
        {
            text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a + (Time.deltaTime / time));
            yield return null;
        }

        while (text.color.a > 0.0f)
        {
            text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a - (Time.deltaTime / time));
            yield return null;
        }
    }

Desta forma, o texto aparece e some duas vezes. Porém, sinto que essa não é a melhor implementação.

Bom, minha principal dúvida já foi sanada, mas ainda estou curioso sobre a parte da Animation.

solução!

Depois que você cria a animação você pode usar ela num Animator como fizemos no curso com a personagem, inimigos e com o chefe. Ou você pode usar o componente de Animation que é mais simples mas se você colocar a animação nele você poderia simplesmente fazer algo como:

animation = GetComponent<Animation>();

animation.Play("Nome da animação");

Ele é bem mais simplório do que fizemos porque todo o controle é via script, é assim que a Unity funcionava antigamente antes dessa parte do Animator existir. Mas agora esse pedaço é usado somente para objetos mais simples como esse do texto.

Aqui na Unity tem alguns exemplos

Você poderia criar um método que faz isso no texto com um componente animation e chamar essa animação, algo como:

private Animation textAnimation

void Start() {
  textAnimation = objetotexto.GetComponent<Animation>();
}

void PlayTextFadeInAnimation() 
{
        if (textAnimation.isPlaying) return;

        textAnimation.Play("Animação do texto");
}

Alguma coisa assim, não sei se deu pra entender muito bem, mas qualquer me avise que tento explicar de outra forma.

Consegui entender perfeitamente, muito obrigado professor!

Opa, que bom! Qualquer coisa que precisar estou por aqui!