вопрос о единстве c# функция обновления скрипта - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь сделать таймер для управления отображением gameObject, я обнаружил, что t не меняется, когда становится равным нулю, как я могу это исправить или другое лучшее решение?

public class randomGopher : MonoBehaviour
{

  // Use this for initialization
  public int t;
  public bool active;
  void Start()
  {
    t = Random.Range(30, 150);
  }

  // Update is called once per frame
  void Update()
  {
        Debug.Log(t);
    if (t == 0)
    {
      active = this.gameObject.activeSelf;
      this.gameObject.SetActive(!active);
      t = Random.Range(30, 150);
    }
    else
    {
      t = t - 1;
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Итак, ваша проблема в том, что Update больше не вызывается, если GameObject, к которому прикреплен ваш скрипт, неактивен после

gameObject.SetActive(false);

(не уверен на 100% и не может проверить прямо сейчас это как печатать на смартфоне.)

Afaik Invoke все еще работает также на отключенном MonoBehaviour или неактивном GameObject (по крайней мере, я знаю, что это так для InvokeRepeating), так что вы, вероятно, можете просто использовать что-то вроде

public class randomGopher : MonoBehaviour
{
    // Adjust these in seconds
    [SerializeField] private float minDelay = 1f;
    [SerializeField] private float maxDelay = 3f;

    private void Start()
    {
         Invoke(nameof(SwitchActiveState), Random.Range(minDelay, maxDelay);
    }

    private void SwitchActiveState ()
    {
        gameObject.SetActive(! gameObject.activeSelf);

        Invoke(nameof(SwitchActiveState), Random.Range(minDelay, maxDelay);
    }
}
0 голосов
/ 17 июня 2020

Лучше всего выполнить ваш скрипт в отдельном GameObject и активировать или деактивировать только TargetObject.

public class randomGopher : MonoBehaviour
{

  // Use this for initialization
  public int t;
  public bool active;
  public GameObject TargetObj;
  void Start()
  {
    t = Random.Range(30, 150);
  }

  // Update is called once per frame
  void Update()
  {
    Debug.Log(t);
    if (t == 0)
    {
      active = TargetObj.activeSelf;
      TargetObj.SetActive(!active);
      t = Random.Range(30, 150);
    }
    else
    {
      t = t - 1;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...