不能与OnMouseDown一起使用WaitForSeconds

时间:2016-03-05 04:01:59

标签: c# unity3d

我使用OnMouseDown()停用了一个对象,但我希望在几秒钟内再次激活该对象。我已将WaitForSeconds()用于其他事情,但这次它不起作用

这是我可以通过研究收集的(停用部分工作正常):

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

void Update(){}

void OnMouseDown()
{
    gameObject.SetActive(false);
}

IEnumarator wait()
{
    yield return new WaitForSeconds(3);
    gameObject.SetActive(true);
}

3 个答案:

答案 0 :(得分:1)

太多原因导致代码无法正常工作。你正在倒退。程序启动时,协程 立即启动 ,因为从Start()函数调用了wait()。当它开始时,它会暂停3秒并将你的GameObject设置为SetActive(true);

如果您的GameObject已经在屏幕上可见,那么您的代码将不会执行任何操作,因为SetActive(true)即使在可见时也会被调用。如果你在3秒之前没有按下/点击屏幕,你将无法看到SetActive(true);因为您的协程代码将在那时完成运行。

此外,如果你禁用一个GameObject,附加到它的协程将停止。解决方案是创建游戏对象 参考 禁用,然后将参考用于另一个 脚本中禁用启用而不会出现任何问题。

由于提供了代码,我为您修复/重新编写了代码。我用更强大的东西取代了OnMouseDown功能。

您所要做的就是创建一个空的GameObject。 脚本附加空GameObject 。然后拖动放弃 GameObject 您要停用启用到此编辑中的禁用游戏对象 插槽

将此脚本附加到您希望禁用启用 GameObject

使用多维数据集进行测试并且有效。

using UnityEngine;
using System.Collections;

public class ALITEST: MonoBehaviour
{
    //Reference to the GameObject you want to Disable/Enable
    //Drag the Object you want to disable here(From the Editor)
    public GameObject gameObjectToDisable;

    void Start()
    {

    }

    void Update()
    {
        //Keep checking if mouse is pressed
        checkMouseClick();
    }

    //Code that checks when the mouse is pressed down(Replaces OnMouseDown function)
    void checkMouseClick()
    {
        //Check if mouse button is pressed
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hitInfo = new RaycastHit();
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo))
            {
                //Check if the object clicked is that object
                if (hitInfo.collider.gameObject == gameObjectToDisable)
                {
                    Debug.Log("Cube hit");
                    StartCoroutine(wait()); //Call the function to Enable/Disable stuff
                }
            }
        }
    }

    //This value is used to make sure that the coroutine is not called again while is it already running(fixes many bugs too)
    private bool isRunning = false;

    IEnumerator wait(float secondsToWait = 3)
    {
        //Exit coroutine while it is already running
        if (isRunning)
        {
            yield break; //Exit
        }
        isRunning = true;

        //Exit coroutine if gameObjectToDisable is not assigned/null
        if (gameObjectToDisable == null)
        {
            Debug.Log("GAME OBJECT NOT ATTACHED");
            isRunning = false;
            yield break; //Exit
        }
        gameObjectToDisable.SetActive(false);

        //Wait for x amount of Seconds
        yield return new WaitForSeconds(secondsToWait);

        //Exit coroutine if gameObjectToDisable is not assigned/null
        if (gameObjectToDisable == null)
        {
            Debug.Log("GAME OBJECT NOT ATTACHED");
            isRunning = false;
            yield break; //Exit
        }
        gameObjectToDisable.SetActive(true);
        isRunning = false;
    }
}

答案 1 :(得分:0)

因为您在StartCoroutine()中呼叫Start(),所以您的协程将在组件启动后3秒恢复。您想在StartCoroutine(wait())中调用OnMouseDown(),以便GameObject在此之后变为活动状态。

答案 2 :(得分:0)

您无法停用GameObject并继续Coroutine。如果停用已运行GameObject的{​​{1}},则会停止运行。

因此,如果您想要做得对,那么您需要Coroutine在其他Coroutine上运行,并从那里开始GameObject

如果您需要更多帮助,请询问。