【问题标题】:Unity coroutine not running to the endUnity协程没有运行到最后
【发布时间】:2017-05-29 16:59:49
【问题描述】:

我在协程方面遇到了一个奇怪的问题。

基本上,当我将鼠标悬停在精灵上时,只要鼠标指针在它上面,它就会淡入和淡出,这很好,但是当鼠标退出精灵时,我希望精灵淡出,直到其 alpha 值达到 0。

这样做,因为与鼠标悬停在对撞机上时每帧调用的 OnMouseOver 函数不同,我使用在我的 OnMouseExit 函数中调用的协程。

下面的代码是我使用的,但是一旦鼠标退出精灵,精灵的 alpha 立即设置为 0,没有淡出,我不知道为什么,因此我的帖子。

你会注意到在 OnMouseExit 函数中最后一行被注释掉了,我尝试使用这两种方法调用协程,它被调用了两次,但在任何一次调用中都不会发生淡出。

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

public class Fader : MonoBehaviour {

    public float min_fade_speed;
    public float max_fade_speed;

    private SpriteRenderer sprite;
    private float fade_speed;

    // Use this for initialization
    void Start () {
        fade_speed = Random.Range (min_fade_speed, max_fade_speed);
        sprite = GetComponent<SpriteRenderer> ();
        reset_color ();
    }

    void reset_color() {
        //Initially transparent
        sprite.color = new Color(1, 1, 1, 0.0f);
    }

    // Update is called once per frame -- currently unused
    void Update () {
    }

    void FadeInAndOut() {
        sprite.color = new Color (1, 1, 1, Mathf.SmoothStep (0.0f, 1.0f, Mathf.PingPong(Time.time/fade_speed, 1f)));
    }

    IEnumerator FadeOut(float alpha_start) {
        Debug.Log ("Alpha is: " + alpha_start);
        while (sprite.color.a > 0.0f) {
            sprite.color = new Color (1, 1, 1, Mathf.SmoothStep (alpha_start, 0.0f, Time.time / fade_speed));
            yield return null;
        }
    }

    void onMouseEnter() {
        reset_color ();
    }

    void OnMouseOver() {
        FadeInAndOut ();
    }

    void OnMouseExit() {
        float alpha = sprite.color.a;
        Debug.Log ("Alpha is: " + alpha);
        StartCoroutine ("FadeOut", alpha);
        // StartCoroutine(FadeOut(alpha));
    }
}

问候

克鲁兹

【问题讨论】:

  • 这里的插值时间可能不正确。记录下来检查。使用 Time.deltaTime 而不是 Time.time 可能会解决这个问题。
  • @Gunnar B,我担心使用 deltaTime 会破坏代码,并且精灵的 alpha 现在保持原样,甚至根本没有达到 0.0f。

标签: c# unity3d coroutine


【解决方案1】:

Coroutine 函数中需要一个计数器变量,从0 计数到fade_speed。在while 循环中使用Time.deltaTime 递增此变量。当该变量 >= fade_speed 时,退出 while 循环。要在整个循环中获取新颜色,您可以执行new Color(1, 1, 1, Mathf.Lerp(startingAlpha, 0, counter / fade_speed));。

您的新FadeOut 函数:

IEnumerator FadeOut(float alpha_start)
{
    //This will start decreasing from where it is
    float startingAlpha = sprite.color.a;

    float counter = 0;

    while (counter < fade_speed)
    {
        counter = counter + Time.deltaTime;
        sprite.color = new Color(1, 1, 1, Mathf.Lerp(startingAlpha, 0, counter / fade_speed));
        yield return null;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 2018-10-29
    • 2017-05-10
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多