首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Coroutine在UI中显示多个图像的统一性

使用Coroutine在UI中显示多个图像的统一性
EN

Stack Overflow用户
提问于 2019-12-18 11:54:43
回答 1查看 58关注 0票数 0

我有四个整数变量,影响游戏的最终结果。

当游戏结束时,变量以Time.deltaTime从0滑到最大(需要5-8秒)。

然后,在所有四个变量达到最大得分后,我将显示两个不同的页面(赢/输)。

到目前为止,一切都很好,所以当结果改变时,最终图像也会发生变化。

我的问题是,我想放第三张照片,而数字滑到向上(等待页面!)

但我看不见第三页。我利用了检验员,几乎每一种可能性都试过了,但我看不见第三张照片。

这是我的代码:

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;

public class EndGameStat : MonoBehaviour {
    public Text AppearanceStatText;
    public Text LikeabilityStatText;
    public Text MannerismsStatText;
    public Text HumanityStatText;
    public Text ResultText;
    public Text StoryResultText;
    public Image failImage;
    public Image SuccessImage;
    public Image WaitingImage;
    public Sprite failImageSprite;
    public Sprite successImageSprite;
    public Sprite WaitingImageSprite;

    public static float AppearanceStat = 0;
    public static float LikeabilityStat = 0;
    public static float MannerismsStat = 0;
    public static float HumanityStat = 0;

    public static int AppearanceStatFinal = 70;
    public static int LikeabilityStatFinal = 40;
    public static int MannerismsStatFinal = 90;
    public static int HumanityStatFinal = 30;

    public static int intialNumber;
    public static int animationTime = 3;

    public static float avg = (AppearanceStatFinal + LikeabilityStatFinal + MannerismsStatFinal) / 3;

    Color maxColor = new Color32 (20, 200, 20, 255);
    Color minColor = new Color32 (250, 10, 0, 255);

    // Start is called before the first frame update
    void Start () {

        AppearanceStatText.text = AppearanceStat.ToString ();
        LikeabilityStatText.text = LikeabilityStat.ToString ();
        MannerismsStatText.text = MannerismsStat.ToString ();
        HumanityStatText.text = HumanityStat.ToString ();

    }

    // Update is called once per frame
    void Update () {

        if (AppearanceStatFinal != AppearanceStat) {

            AppearanceStat += (animationTime * Time.deltaTime);
            AppearanceStatText.text = AppearanceStat.ToString ("f0");
            AppearanceStatText.GetComponent<Text> ().color = Color.Lerp (minColor, maxColor, AppearanceStat / 100f);
            if (AppearanceStat > AppearanceStatFinal)
                AppearanceStat = AppearanceStatFinal;

        }

        if (LikeabilityStatFinal != LikeabilityStat) {

            LikeabilityStat += (animationTime * Time.deltaTime);
            LikeabilityStatText.text = LikeabilityStat.ToString ("f0");
            LikeabilityStatText.GetComponent<Text> ().color = Color.Lerp (minColor, maxColor, LikeabilityStat / 100f);
            if (LikeabilityStat > LikeabilityStatFinal)
                LikeabilityStat = LikeabilityStatFinal;

        }

        if (MannerismsStatFinal != MannerismsStat) {

            MannerismsStat += (animationTime * Time.deltaTime);
            MannerismsStatText.text = MannerismsStat.ToString ("f0");
            MannerismsStatText.GetComponent<Text> ().color = Color.Lerp (minColor, maxColor, MannerismsStat / 100f);
            if (MannerismsStat > MannerismsStatFinal)
                MannerismsStat = MannerismsStatFinal;

        }

        if (HumanityStatFinal != HumanityStat) {

            HumanityStat += (animationTime * Time.deltaTime);
            HumanityStatText.text = HumanityStat.ToString ("f0");
            HumanityStatText.GetComponent<Text> ().color = Color.Lerp (minColor, maxColor, HumanityStat / 100f);
            if (HumanityStat > HumanityStatFinal)
                HumanityStat = HumanityStatFinal;

        }

        StartCoroutine (resultPage ());

    }
    bool CDPage () {

        if (HumanityStat == HumanityStatFinal & MannerismsStat == MannerismsStatFinal & LikeabilityStat == LikeabilityStatFinal & AppearanceStat == AppearanceStatFinal) {

            return true;

        } else {

            return false;

        }
    }

    IEnumerator resultPage () {

        yield return new WaitUntil (CDPage);

        if (avg < 50) {
            ResultText.text = "FAIL!";
            StoryResultText.text = "You are not belong here";
            failImage.sprite = failImageSprite;
            SuccessImage.enabled = false;

        } else {
            ResultText.text = "SUCCESS";
            StoryResultText.text = "Welcome!!";
            SuccessImage.sprite = successImageSprite;
            failImage.enabled = false;

        }

    }

}

你能帮我找出我的错误吗?

更新:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-18 12:32:17

经过你的更新,我想你想要的是

代码语言:javascript
复制
private void Awake(){
    // enough to do these only once
    WaitingImage.sprite = WaitingImageSprite;
    failImage.sprite = failImageSprite;
    SuccessImage.sprite = successImageSprite;
}

IEnumerator resultPage () 
{
    WaitingImage.enabled = true;
    SuccessImage.enabled = false;
    failImage.enabled = false;

    yield return new WaitUntil (CDPage);

    if (avg < 50) {
        ResultText.text = "FAIL!";
        StoryResultText.text = "You are not belong here";
        failImage.enabled = true;
    } else {
        ResultText.text = "SUCCESS";
        StoryResultText.text = "Welcome!!";
        SuccessImage.enabled = true;
    }

}

此外,如前所述:所有这些GetComponent<Text>调用都是冗余的,您可以简单地使用。

代码语言:javascript
复制
AppearanceStatText.color = ...;

请注意,您的Update方法不断地调用一个新的StartCoroutine(resultPage()); (每个帧)。所以你可以得到一堆并行的例程。如果某个例程已经在运行,您应该跳过它,或者在Start中只启动一次例程。

此外,您为什么在那里使用static?如果这些是常量,则将它们设置为const

实际上,我只需将整个代码移动到一个coroutine,如下所示

代码语言:javascript
复制
// yes, Start itself can be a coroutine ;)
void IEnumerator Start () 
{
    WaitingImage.enabled = true;
    SuccessImage.enabled = false;
    failImage.enabled = false;

    AppearanceStatText.text = AppearanceStat.ToString ();
    LikeabilityStatText.text = LikeabilityStat.ToString ();
    MannerismsStatText.text = MannerismsStat.ToString ();
    HumanityStatText.text = HumanityStat.ToString ();

    while(HumanityStat != HumanityStatFinal || MannerismsStat != MannerismsStatFinal || LikeabilityStat != LikeabilityStatFinal || AppearanceStat != AppearanceStatFinal
    {
        if (AppearanceStatFinal != AppearanceStat) 
        {
            AppearanceStat += (animationTime * Time.deltaTime);
            // do your clamping first, then set the color and update the text
            if (AppearanceStat > AppearanceStatFinal) AppearanceStat = AppearanceStatFinal;
            AppearanceStatText.text = AppearanceStat.ToString ("f0");
            AppearanceStatText.color = Color.Lerp (minColor, maxColor, AppearanceStat / 100f);
        }

        //TODO EQUALLY FOR THE OTHER 4 TEXTS AND ACCORDING VALUES

        // finally wait for the next frame here
        yield return null;
    }

    // finally do your check    

    if (avg < 50) 
    {
        ResultText.text = "FAIL!";
        StoryResultText.text = "You are not belong here";
        failImage.enabled = true;
    } 
    else 
    {
        ResultText.text = "SUCCESS";
        StoryResultText.text = "Welcome!!";
        SuccessImage.enabled = true;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59391489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档