2016-03-05 6 views
0

Я использовал OnMouseDown() для деактивации объекта, но я хочу, чтобы объект активировался снова через несколько секунд. Я использовал WaitForSeconds() для других вещей, но на этот раз он просто не работаетне может использовать WaitForSeconds с OnMouseDown

это то, что я мог собрать, исследуя (дезактивирующую часть работает отлично):

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

void Update(){} 

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

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

ответ

1

Есть слишком много причины, по которым ваш код не работает правильно. Вы делаете это назад. Ваш 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; 
    } 
} 
+0

Я не могу тебя отблагодарить. этот ответ на самом деле решил несколько других моих проблем, а также – ali10gaucho

+0

. Добро пожаловать – Programmer

+2

чрезвычайно щедрый ответ – Fattie

0

Потому что вы звоните StartCoroutine() в Start(), ваша сопрограмма возобновится через 3 секунды после запуска компонента. Вы хотите позвонить StartCoroutine(wait()) в OnMouseDown(), чтобы GameObject стал активным после этого.

+0

я сделал, что до сих пор не работает – ali10gaucho

0

Вы не можете деактивировать GameObject и продолжить работу Coroutine. Если вы деактивируете GameObject, который имеет Coroutine, он будет остановлен.

Так что, если вы хотите сделать это правильно, вам нужно Coroutine, показывая по другому GameObject и оттуда, действуя на этом GameObject.

Если вам нужна дополнительная помощь, спросите.

Смежные вопросы