Есть слишком много причины, по которым ваш код не работает правильно. Вы делаете это назад. Ваш coroutineначинаетсразу, когда запускается ваша программа, так как из функции Start() вызывается wait()
. Когда он запускается, он приостанавливается на 3 секунды и устанавливает ваш GameObject в SetActive(true)
;
Если ваш GameObject уже виден на экране, ваш код ничего не сделает, потому что SetActive(true)
будет вызываться, даже если он виден. Если вы не нажали/не нажали на экран до этого 3 секунд, вы не сможете увидеть SetActive(true)
; потому что к тому времени ваш код coroutine завершит работу.
Кроме того, если вы отключить GameObject, то сопрограммная прилагается к нему будет остановить. Решение состоит в том, чтобы создать ссылки из GameObject вы хотите отключить затем использовать это ссылки на отключить и позволяет его от другогосценария без проблем.
Поскольку предоставленный код, я исправил/переписал его для вас. Я заменил функцию OnMouseDown чем-то более надежным.
Все, что вам нужно сделать, это создать пустой GameObject. Приложить этот сценарий к этому пустой GameObject.Затем сопротивление и падение что GameObject вы хотите отключить и позволяют на это "Game Object Чтобы отключить" Slot в этом сценарии, из редактора.
ли НЕ прикрепить этот сценарий к этому 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;
}
}
Я не могу тебя отблагодарить. этот ответ на самом деле решил несколько других моих проблем, а также – ali10gaucho
. Добро пожаловать – Programmer
чрезвычайно щедрый ответ – Fattie