2017-01-14 4 views
0

코 루틴에 이상한 문제가 있습니다.유니 코드 코 루틴이 끝까지 실행되지 않음

기본적으로 내가 마우스를 스프라이트 위에 올리면 마우스 포인터가 위에 오도록하여 효과가 있지만, 마우스가 스프라이트를 종료하면 알파 값이 0이 될 때까지 스프라이트가 희미 해지기를 원합니다.

이렇게하려면 마우스가 콜 라이더 위에있을 때마다 모든 프레임이라고하는 OnMouseOver 함수와 달리 내 OnMouseExit 함수에서 호출되는 코 루틴을 사용합니다.

아래 코드는 마우스가 스프라이트를 종료하자마자 스프라이트의 알파가 0으로 바로 설정되어 페이드 아웃하지 않고 이유를 알 수 없기 때문에 내 포스트입니다.

OnMouseExit 함수에서 마지막 줄을 주석 처리했음을 알 수 있습니다. 두 메서드를 모두 사용하여 coroutine을 호출하려고 시도했지만 두 호출 모두 호출되지만 둘 중 하나의 호출에서는 페이드 아웃이 발생하지 않습니다.

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을 사용하면 코드가 손상되고 Sprite의 알파는 그대로 유지되며 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

감사합니다 @ 프로그래머, 그것은 작동합니다. – Crouzilles