2017-01-14 9 views
0

У меня возникла странная проблема с сопрограммой.Unity coroutine не работает до конца

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

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

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

Вы заметите, что в функции OnMouseExit последняя строка закомментирована, я попытался вызвать сопрограмму cooutine с использованием обоих методов, она вызывается одновременно, но исчезновение не происходит ни в одном вызове.

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

+0

Может быть, время, интерполяция не исправить здесь. Зарегистрируйтесь, чтобы проверить. Использование 'Time.deltaTime' вместо' Time.time' может исправить это. –

+0

@Gunnar B, я боюсь, что использование deltaTime разрывает код, и альфа-версия спрайта остается такой, какой она есть, она даже не подходит к 0.0f. – Crouzilles

ответ

0

Вам нужна переменная счетчика в функции сопрограммная, что рассчитывает от 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; 
    } 
} 
+1

Спасибо @Programmer, это работает шарм – Crouzilles

 Смежные вопросы

  • Нет связанных вопросов^_^