unity协程未运行结束
Unity coroutine not running to the end
我在使用协程时遇到了一个奇怪的问题。
基本上,当我将鼠标悬停在一个精灵上时,只要鼠标指针悬停在它上面,它就会淡入淡出,这工作正常,但是当鼠标离开精灵时,我希望精灵淡出直到它的 alpha 值达到0.
这样做是因为与鼠标悬停在碰撞器上时每帧都调用的 OnMouseOver 函数不同,我使用了在我的 OnMouseExit 函数中调用的协程。
下面的代码是我使用的,但是一旦鼠标退出精灵,精灵的alpha立即设置为0,没有淡出,我不知道为什么,因此我的post .
您会注意到在 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));
}
}
此致
克鲁兹
协程函数中需要一个计数器变量,从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;
}
}
我在使用协程时遇到了一个奇怪的问题。
基本上,当我将鼠标悬停在一个精灵上时,只要鼠标指针悬停在它上面,它就会淡入淡出,这工作正常,但是当鼠标离开精灵时,我希望精灵淡出直到它的 alpha 值达到0.
这样做是因为与鼠标悬停在碰撞器上时每帧都调用的 OnMouseOver 函数不同,我使用了在我的 OnMouseExit 函数中调用的协程。
下面的代码是我使用的,但是一旦鼠标退出精灵,精灵的alpha立即设置为0,没有淡出,我不知道为什么,因此我的post .
您会注意到在 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));
}
}
此致
克鲁兹
协程函数中需要一个计数器变量,从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;
}
}