簡體   English   中英

Unity協程沒有運行到最后

[英]Unity coroutine not running to the end

我對協程有一個奇怪的問題。

基本上,當我將鼠標懸停在一個精靈上時,只要將鼠標指針停留在該精靈上,它就會淡入和淡出,這可以正常工作,但是當鼠標退出該精靈時,我希望該精靈淡出直到其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));
    }
}

問候

克魯茲

您需要在Coroutine函數中使用一個計數器變量,該變量的計數范圍從0fade_speed 您可以使用Time.deltaTimewhile循環中遞增此變量。 當該變量> = fade_speed ,退出while循環。 要在整個循環中獲得new Color(1, 1, 1, Mathf.Lerp(startingAlpha, 0, counter / fade_speed)) ,可以執行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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM