【问题标题】:Unity, C# | How do I have a wait time between methods?统一,C# |我如何在方法之间有等待时间?
【发布时间】:2014-11-20 04:28:36
【问题描述】:

我的目标:让我的蜗牛看起来像是在自己移动。 示例:向右走几秒钟,向左走几秒钟,在一个地方停留几秒钟。

当前状态:当我尝试使用WaitForSeconds时,蜗牛静止不动

没有WaitForSeconds,我的蜗牛来回改变方向成功(除非做得非常快)

我昨天才开始学习 Unity 和 C#。任何提示/建议都会有很大帮助,即使它不在我原来的问题上。 如果还有什么我可以做的来帮助你帮助我,请告诉我! :)

using UnityEngine;
using System.Collections;

public class SnailMove : MonoBehaviour {
void Start()
{

}
// Use this for initialization
void Update () 
{
    Waiting();
}

// Update is called once per frame
void Movement () 
{

    int direct = Random.Range(-1, 2);
    if (direct == 1) 
    {
        transform.Translate(Vector3.left * 1f * Time.deltaTime);
        transform.eulerAngles = new Vector2(0,180);
    }
    if (direct == -1)
    {
        transform.Translate(Vector3.left * 1f * Time.deltaTime);
        transform.eulerAngles = new Vector2(0,0);
    }
}
  IEnumerator Waiting()
    {
    Movement ();
    yield return new WaitForSeconds (5);
    }
}

【问题讨论】:

    标签: c# unity3d 2d


    【解决方案1】:

    协程需要以StartCoroutine 开头。从你的描述看来你想要这样的东西:

    using UnityEngine;
    using System.Collections;
    
    public class SnailMove : MonoBehaviour
    {
        public float speed = 1f;
        int direction = 0;
        void Start()
        {
            StartCoroutine(ChangeDirection());
        }
    
        void Update () 
        {
            if (direction == 1) 
            {
                transform.Translate(Vector3.left * speed * Time.deltaTime);
                transform.eulerAngles = new Vector2(0,180);
            }
            else if (direction == -1)
            {
                transform.Translate(Vector3.left * speed * Time.deltaTime);
                transform.eulerAngles = new Vector2(0,0);
            }
        }
    
        IEnumerator ChangeDirection()
        {
            while(true)
            {
                yield return new WaitForSeconds (5);
                direction = Random.Range(-1, 2); // returns "-1", "0" or "1"
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      美好的一天,我相信您的问题是您在更新方法中调用了等待,该方法在每一帧都被调用,而不管之前的执行如何,这意味着只有在等待之前调用等待的线程才会等待,因此可以调用该方法再次因为另一个线程只等待。

      试试这个:

      using UnityEngine;
      using System.Collections;
      
      private bool waiting = false;
      
      public class SnailMove : MonoBehaviour {
      void Start()
      {
      
      }
      // Use this for initialization
      void Update () 
      {
          if(waiting == false)  
          {
             Waiting();
          }
      }
      
      // Update is called once per frame
      void Movement () 
      {
      
          int direct = Random.Range(-1, 2);
          if (direct == 1) 
          {
              transform.Translate(Vector3.left * 1f * Time.deltaTime);
              transform.eulerAngles = new Vector2(0,180);
          }
          if (direct == -1)
          {
              transform.Translate(Vector3.left * 1f * Time.deltaTime);
              transform.eulerAngles = new Vector2(0,0);
          }
      }
        IEnumerator Waiting()
          {
          Movement ();
          waiting = true;
          yield return new WaitForSeconds (5);
          waiting = false;
          }
      }
      

      这将使更新函数在再次调用该函数之前等待布尔等待设置为 false。

      【讨论】:

      • 不幸的是我没有工作。它给了我与原始代码相同的效果。不过,感谢您指出有关更新方法的事实:)
      【解决方案3】:

      您的逻辑流程有点混乱。您每帧启动 Waiting() 协程,当您可能想要调用一次时(例如在 Start() 中)并循环您的协程。结果是你有一大堆 Waiting() 协程在运行并且相互竞争。

      你有两个选择:

      void Start() {
          StartCoroutine(Waiting());
      }
      
      IEnumrator Waiting() {
          while(true) {
              Movement();
              yield return new WaitForSeconds(5f);
          }
      }
      

      不过,我在打字时感到恶心,因为while(true) 是一个可怕的想法。最好是在 Update() 中跟踪时间并每 5 秒调用一次 Movement(),如下所示:

      private float timer = 0f;
      
      void Update() {
          timer += Time.deltaTime;
          if (timer > 5f) {
              Movement();
              timer -= 5f;
          }
      }
      

      【讨论】:

      • 您的答案是我需要的最接近的解决方案。它确实起作用了,我的蜗牛在随机方向上缓慢移动。我想我应该说的是,我想模仿某人按左右箭头键,但为了我的蜗牛。我目前正在做的是试图操纵你的代码(第二个)来得到我想要它做的事情。如果您有任何其他想法,我很乐意听到。如果没有,非常感谢您让我接近解决方案!它帮助很大! :)
      • 您需要检查更新方法中的输入以确定用户是否按下了键,例如: if (Input.GetKey(KeyCode.RightArrow)) MoveRight(); else if (Input.GetKey(KeyCode.LeftArrow)) MoveLeft();由您决定 MoveRight 和 MoveLeft 应该做什么(基本上,只需更新蜗牛的 transform.position 向量)。
      • while(true) 在协程中并不是一个可怕的想法。但是,您根本没有启动协程。您必须使用 StartCoroutine 来启动协程。只调用 IEnumerator 方法将无济于事。
      猜你喜欢
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      相关资源
      最近更新 更多