【问题标题】:unity c# changing button color wait 1 second and change the color againunity c# 更改按钮颜色等待1秒并再次更改颜色
【发布时间】:2019-12-18 02:33:45
【问题描述】:

我正在尝试编写一个函数,单击更改按钮颜色会等待 1 秒,然后再次更改颜色

这是我写的:

    public float showForSeconds = 1.0f;
    public Button DoBut;

    public void DoFunc()
    {
            StartCoroutine(DoTimer());
    }

    IEnumerator DoTimer()
    {
            ColorBlock colors = DoBut.colors;
            colors.normalColor = new Color32(255, 0, 0, 255);
            Debug.Log(colors.normalColor);
            yield return new WaitForSeconds(showForSeconds);
            Debug.Log("I'm back");
            colors.normalColor = new Color32(255, 128, 128, 255);
            Debug.Log(colors.normalColor);
    }

它将颜色一次更改为 (255, 0, 0, 255) 等待 1 秒,但不会再次将颜色更改为 (255, 128, 128, 255)。

所有的 Debug.Log 都是正确的, 第一个调试是:RGBA(1.000, 0.000, 0.000, 1.000) 第二个调试是:我回来了 第三个调试是:RGBA(1.000, 0.502, 0.502, 1.000)

我做错了什么? :(

【问题讨论】:

  • 我试图改变颜色的每一个功能:colors.normalColor = new Color32(255, 128, 128, 255); colors.selectedColor = new Color32(255, 128, 128, 255); colors.pressedColor = new Color32(255, 128, 128, 255); colors.highlightedColor = new Color32(255, 128, 128, 255);没有帮助。它仍然存在 (255, 0, 0, 255)

标签: c# unity3d


【解决方案1】:

问题是您将颜色分配给本地副本。 ColorBlockstruct,因此当您将其分配给局部变量时,您将获得一个副本。为了对按钮产生影响,您需要将struct 重新分配给按钮。

IEnumerator DoTimer()
    {

            ColorBlock colors = DoBut.colors;
            // now colors is a local copy, so all changes you do to it will not affect the button.
            colors.normalColor = new Color32(255, 0, 0, 255);

            // you need to assign it back to the button
            DoBut.colors = colors;
            yield return new WaitForSeconds(showForSeconds);

            colors.normalColor = new Color32(255, 128, 128, 255);
            // and again assign it back to the button
            DoBut.colors = colors;
    }

structs 恰好出于这个原因有点不直观。因此,如果您以后遇到类似问题,请查看您是否在某处使用struct。当我开始使用 Unity 时,Vector3 等让我深受其害。

在相关说明中,这个ColorBlock 似乎只是改变了状态转换的颜色。因此,直接分配颜色可能不会立即对按钮的颜色产生影响。

Unity 论坛有一些关于如何直接设置按钮颜色的thread(我只是从那里复制了相关部分):

DoBut.GetComponent<Image>().color = Color.red;

【讨论】:

  • 谢谢,这很好,但现在我面临一个新问题。看来我需要在 1 秒后通过代码取消选择按钮。这对我的代码更有用。有什么建议么? :)
  • 您能解释一下它是如何工作的吗?在按钮的manual 中没有colors 的字段,在我的编辑器中我得到CS1061: 'Button' does not contain a definition for 'colors'。我错过了什么?
  • 它只是像你说的那样改变颜色。我添加了“DoBut.colors = colors;”在每个“colors.normalColor = new Color32(int, int, int, 255);”之后
  • 现在唯一的问题是我意识到我不需要更改颜色,只需在 1 秒后取消选择按钮。现在我试图找到我该怎么做:/
  • @GilJosef 请点击灰色复选标记 (✔) 将此答案标记为已接受的答案,然后查看What should I do when someone answers my question?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2014-07-11
  • 2020-04-30
相关资源
最近更新 更多