2017-01-14 18 views
0

私はコルーチンに奇妙な問題があります。ユニティコルーチンが最後まで実行されていません

基本的に私はスプライト上にマウスを置くとマウスポインタが上にある限りフェードイン/フェードアウトしますが、これはうまくいきますが、マウスがスプライトを終了すると、そのアルファ値が0になるまでスプライトをフェードアウトさせます

これを行うには、マウスがコライダー上にある間にすべてのフレームと呼ばれるOnMouseOver関数とは異なり、私は自分のOnMouseExit関数で呼び出されるコルーチンを使用します。

以下のコードは、私が使用しているものですが、マウスがスプライトを終了するとすぐに、スプライトのアルファが0に設定されます。フェードアウトせずに、理由はわかりません。

最後の行はコメントアウトされていますが、私は両方のメソッドを使ってコルーチンを呼び出そうとしましたが、どちらの呼び出しも呼び出されますが、どちらの呼び出しでもフェードアウトは発生しません。

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.time'の代わりに' Time.deltaTime'を使うとそれを修正するかもしれません。 –

+0

@Gunnar B、deltaTimeを使用するとコードが壊れてしまい、スプライトのアルファがそのまま残ってしまうことがあります。 – 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

ありがとう@プログラマー、それは魅力を動作させる – Crouzilles

関連する問題