当布尔值为true时,如何调用IEnumerator?

时间:2018-01-05 16:14:48

标签: c# function unity3d ienumerator

我正在使用IEnumerator函数,并且我的if语句有问题:

IEnumerator Spawning()
    {
        Debug.Log("Spawning being called...");
        if (GameObject.Find("FPSController").GetComponent<BoxCollide>().hitTrigger == true)
        {
            Debug.Log("CUSTOMER SHOULD SPAWN!");
            while (countStop == false) {

                yield return new WaitForSeconds(2);
                Debug.Log("Fisher Spawned!");
                counter++;
                spawnNewCharacter.SpawnCharacter();

                if (counter >= 3){
                    countStop = true;
                }

            }
        }
    }

经过一些调试后,事实证明我的if语句确实有效。这个问题实际上是我运行游戏时调用的IEnumerator函数。我需要一种方法只在我的IEnumerator时调用此hitTrigger == true函数,但我似乎无法正常工作。

我已经在IEnumerator函数上尝试了这个:

void Update()
    {
        if (GameObject.Find("FPSController").GetComponent<BoxCollide>().hitTrigger == true)
        {
            Debug.Log("Spawning now...");
            StartCoroutine(Spawning());
        }
    } 

但仍然无法让任何Debug.Log得以通过。希望得到一些帮助!

1 个答案:

答案 0 :(得分:0)

边信息

Find()和GetComponent()

您不想在Update方法中使用GameObject.Find(...),因为它是一个昂贵的调用。每帧调用Update方法,因此您以60fps的速度在1秒内调用GameObject.Find(...)60次。 因此,当您使用GetComponent()或Find()时,您希望保存对这些对象的引用,如下面的代码段所示。

使用GetComponent()或GameObject.Find()等方法的更好位置是Awake()Start()方法。

<强>唤醒

  

唤醒用于初始化之前的任何变量或游戏状态   比赛开始。唤醒只在一生中被召唤一次   脚本实例。在初始化所有对象之后调用Awake   您可以安全地与其他对象交谈或使用例如查询它们。   GameObject.FindWithTag。 [...]   解释来自链接文档。

开始

  

当在任何脚本之前启用脚本时,在帧上调用Start   Update方法的第一次调用。像清醒一样   function,Start在脚本的生命周期中只调用一次。   但是,初始化脚本对象时会调用Awake,   无论脚本是否已启用。开始可能不是   如果脚本未启用,则调用与Awake相同的帧   初始化时间。   解释也来自链接文档

可能的解决方案

将第一个Component(FPSControllerCollission)添加到保存FPSController的对象上。 它利用了统一性OnTriggerEnter&amp; OnTriggerExit方法。

当触发器进入盒子对撞机的空间时,此脚本会将IsTriggered bool设置为 true

  

注意:当&#34; Is Trigger&#34;时,对撞机充当触发器。复选框   检查组件。

当碰撞器进入箱式对撞机的空间时,您可以使用OnCollisionEnter / Exit进行类似的识别。

  

请注意,以下只是一个示例,您必须调整/   将其集成到您的代码中

  [RequireComponent(typeof(BoxCollider))]
  public class FPSControllerCollission : MonoBehaviour {
    public bool IsTriggered;

    private void OnTriggerEnter(Collider other) {
      this.IsTriggered = true;
    }

    private void OnTriggerExit(Collider other) {
      //Maybe check the tag/type of the other object here
      this.IsTriggered = false;
    }
  }

以下SpawnController类可以集成到您已经拥有的类中。

  public class SpawnController : MonoBehaviour {
    private FPSControllerCollission _fpsControllerCollission;

    private void Awake() {
      this._fpsControllerCollission = FindObjectOfType<FPSControllerCollission>();
    }

    private void Update() {
      if (this._fpsControllerCollission.IsTriggered) {
        StartCoroutine(nameof(Spawning));
      }
    }

    IEnumerator Spawning() {
      Debug.Log("Spawning being called...");
      if (this._fpsControllerCollission == true) {
        Debug.Log("CUSTOMER SHOULD SPAWN!");
        bool countStop = false;
        int counter;
        while (countStop == false) {

          yield return new WaitForSeconds(2);
          Debug.Log("Fisher Spawned!");

          counter++;
          spawnNewCharacter.SpawnCharacter();

          if (counter >= 3) {
            countStop = true;
          }

        }
      }
    }
  }