У меня возникла странная проблема с сопрограммой.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
Может быть, время, интерполяция не исправить здесь. Зарегистрируйтесь, чтобы проверить. Использование 'Time.deltaTime' вместо' Time.time' может исправить это. –
@Gunnar B, я боюсь, что использование deltaTime разрывает код, и альфа-версия спрайта остается такой, какой она есть, она даже не подходит к 0.0f. – Crouzilles