【问题标题】:How do I play an animation, wait, then fade out? (In unity)如何播放动画,等待,然后淡出? (统一)
【发布时间】:2020-01-24 20:18:05
【问题描述】:

基本上是标题所要求的。我想播放我的动画,然后在动画播放完毕后,我希望它在大约 2 秒内淡出场景之前有一个小的延迟。淡出后,应将其禁用并重置。

到目前为止,这是我的代码,但是当我将解锁设置为 true 时,它​​什么也不做。

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

public class AnimationController : MonoBehaviour
{
    public Animator anim;
    public SpriteRenderer sr;
    public bool unlocking;
    Sprite unlockSprite;
    Sprite lockSprite;
    Color temp;

    // Start is called before the first frame update
    void Start()
    {
        unlocking = false;
        unlockSprite = Resources.Load<Sprite>("unlock");
        lockSprite = Resources.Load<Sprite>("lock");
    }

    // Update is called once per frame
    void Update()
    {
        if (unlocking) {
            anim.Play("unlock");
            unlocking = false;
            sr.sprite = unlockSprite;
            System.Threading.Thread.Sleep(1000);
            StartCoroutine(FadeTo(0.0f, 2.0f));
            temp = new Color(sr.color.r, sr.color.g, sr.color.b, 0f);
            sr.color = temp;
            gameObject.SetActive(false);
            sr.sprite = lockSprite;
            temp = new Color(sr.color.r, sr.color.g, sr.color.b, 1f);
            sr.color = temp;
        }
    }

    IEnumerator FadeTo(float aValue, float aTime)
    {
        float alpha = sr.color.a;
        for (float t = 0.0f; t < 1.0f; t += Time.deltaTime / aTime)
        {
            Color newColor = new Color(sr.color.r, sr.color.g, sr.color.b, Mathf.Lerp(alpha, aValue, t));
            sr.color = newColor;
            yield return null;
        }
    }
}

更新代码:

    anim.Play("unlock");
    unlocking = false;
    if (animInfo.normalizedTime >= 1)
    {
        anim.enabled = false;
        sr.sprite = unlockSprite;
        StartCoroutine(FadeTo(0.0f, 2.0f));
        temp = new Color(sr.color.r, sr.color.g, sr.color.b, 0f);
        sr.color = temp;
        gameObject.SetActive(false);
        sr.sprite = lockSprite;
        temp = new Color(sr.color.r, sr.color.g, sr.color.b, 1f);
        sr.color = temp;
    }

【问题讨论】:

  • 好的,因此您可以通过检查animationstateinfo 来判断动画是否已播放完毕,并检查它正在播放您的想法以及该动画的播放距离。我不确定你在哪里将解锁设置为真......但是,我建议你的解锁代码都不想在你的更新中像这样,因为它可能只会给你 0 fps 一段时间然后睡觉?哎哟..无论如何,否则你所拥有的似乎是合理的
  • 请不要在主线程上调用Thread.Sleep
  • @BugFinder 首先我想说我对统一很陌生。我不知道animationstateinfo是什么,只是AnimatorStateInfo,我也不知道如何访问它。我尝试使用带有animation.isPlaying的while语句,但是当我尝试在检查器中设置动画时,它不会添加它(点在一边并通过拖动)。另外,我应该把我的解锁码放在哪里?我在玩游戏时(在检查器中)将解锁设置为 true,稍后我将添加触发器。
  • 对于animationstateinfo,请查看unity docs,它们提供了很多有用的信息。
  • @BugFinder 我找不到它,你能给我一个链接吗?

标签: unity3d animation fade


【解决方案1】:

实现它的一种方法是制作另一个协程,类似这样:

IEnumerator UnlockSequence()
{
    while (animInfo.normalizedTime < 1.0f)
    {
        yield return null;
    }
    anim.enabled = false;
    sr.sprite = unlockSprite;
    yield return new WaitForSeconds(1.0f);
    yield return StartCoroutine(FadeTo(0.0f, 2.0f));
    // everything else
}

【讨论】:

  • 谢谢,这行得通(大部分)。出于某种原因, animInfo.no​​rmalizedTime 只返回 0,所以我只是使用 WaitForSeconds 并输入动画的确切时间。我现在唯一的问题是sr.sprite = unlockSprite; 行没有改变精灵。我已经确保 unlockSprite 引用了正确的精灵,但所发生的只是动画播放后,精灵回到默认精灵(它在场景开始时的那个),我不知道为什么。我一直在寻找答案几个小时,但我找不到解决方案。
  • 至于animInfo.no​​rmalizedTime,可能每次检查都需要更新。或者检查 Animator.StateName 或 StateNameHash 以查看其当前状态是否用于解锁动画。我从未尝试过使用您所做的更改精灵的技术。我通常在场景中有一个 Image 对象,Canvas 的一个子对象,我正在更改 Sprite,而不使用 SpriteRenderer..
  • 你应该把它作为另一个问题发布 BTW
猜你喜欢
  • 1970-01-01
  • 2012-07-11
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多