Единство сопрограммы не работает до конца

У меня странная проблема с сопрограммой.

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

Для этого и потому, что в отличие от функции OnMouseOver, которая вызывается каждый кадр, когда мышь находится над коллайдером, я использую сопрограмму, вызываемую в моей функции OnMouseExit.

Код ниже - то, что я использую, но как только мышь выходит из спрайта, альфа спрайта сразу устанавливается в 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));
    }
}

С уважением

Crouz

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;
    }
}
Другие вопросы по тегам