【问题标题】:WaitForSeconds is not being called未调用 WaitForSeconds
【发布时间】:2019-12-15 23:53:15
【问题描述】:

我想在开始时隐藏一个按钮,并在一定时间后让它再次变为活动状态。但是,对 WaitForSeconds() 的调用不起作用。

我尝试了以下方法:

  • 让其他方法调用 WaitForSeconds
  • 从其他脚本访问 bool 值以跳过 WaitForSeconds
  • StartCoroutine 方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class HideUnhideBtn : MonoBehaviour
{
    public Button buttonToHide;
    public float comeInTime = 32.5f;

    IEnumerator Start()
    {
        buttonToHide.gameObject.SetActive(false);
        yield return new WaitForSeconds(comeInTime);
        buttonToHide.gameObject.SetActive(true);
    }
}

【问题讨论】:

  • 到目前为止的答案应该是无效的。 Start 方法可以像 manual 中的示例一样作为协程实现,并且不需要 StartCoroutine。你确定使用这种单一行为的游戏对象开始启用了吗?
  • 取决于创建顺序,您确定此时 buttontohide 可用吗?

标签: c# user-interface unity3d


【解决方案1】:

协程不会在禁用的对象上运行

到目前为止的答案都是不正确的,因为 Start() 可以直接用作协程,并且不需要 StartCoroutine 从这个 example in the Manual 开始(唉 Unity 对 Start 的这个功能不是很明确)。

您很可能将HideUnhideBtn 脚​​本放在您想禁用的同一GameObject 上。所以这行buttonToHide.gameObject.SetActive(false); 用你的脚本禁用了对象,并因此停止了协程。

要解决此问题,您需要使用 2 个不同的 GameObjects。

  1. 对于按钮
  2. 对于运行协程的脚本

第二个GameObject 需要一直保持启用状态。如果你禁用它,你会杀死协程。

【讨论】:

  • 我可以确认Start可以是协程。我已经抱怨很长时间了,文档中的大多数其他方法都提到了它(例如Awake cannot be a co-routine.OnCollisionEnter can be a co-routine),但在Start 中没有提到它通常更有意义
  • @derHugo 从 IEnumerator 的返回类型开始真是太棒了,不知道它也适用于 OnCollisionEnter 但很高兴知道谢谢。这也适用于其他碰撞和触发回调吗?是否有一些列出的文档页面?
  • @yes 不,不幸的是不是真的,这正是有时让我有点困扰的原因.. 文档通常很不完整,因为它是“边缘用例”,但完全同意知道会很棒!大多数情况下,您必须通过检查每条消息的相应 api 文档或尝试来找出答案;)
  • 非常感谢!我花了将近三个小时把头发拉出来找出问题所在。你是对的,我将脚本附加到按钮上,我所要做的就是将它附加到一个空的游戏对象上。谢谢!
【解决方案2】:

您需要使用给定的协程作为参数调用StartCoroutine 函数才能使其工作。 例如在这样的 start 方法中调用它 StartCoroutine(Start());

【讨论】:

  • 他是对的,协程尝试不同步地执行代码,就像您通常的程序流程所允许的那样。从技术上讲,它们仍然在同一个线程中执行,只是在任务之间切换。
【解决方案3】:

你必须像这样调用协程:

public class HideUnhideBtn : MonoBehaviour
{
    public Button buttonToHide;
    public float comeInTime = 32.5f;

    void Start()
    {
        StartCoroutine(HideAndShowButton());
    }

    IEnumerator HideAndShowButton()
    {
        buttonToHide.gameObject.SetActive(false);
        yield return new WaitForSeconds(comeInTime);
        buttonToHide.gameObject.SetActive(true);
    }
}

这里是官方文档:https://docs.unity3d.com/ScriptReference/WaitForSeconds.html

享受吧!

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多