我使用OnMouseDown()
停用了一个对象,但我希望在几秒钟内再次激活该对象。我已将WaitForSeconds()
用于其他事情,但这次它不起作用
这是我可以通过研究收集的(停用部分工作正常):
void Start()
{
StartCoroutine(wait());
}
void Update(){}
void OnMouseDown()
{
gameObject.SetActive(false);
}
IEnumarator wait()
{
yield return new WaitForSeconds(3);
gameObject.SetActive(true);
}
答案 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
。
如果您需要更多帮助,请询问。