统一,C# |我如何在方法之间有等待时间?
Posted
技术标签:
【中文标题】统一,C# |我如何在方法之间有等待时间?【英文标题】:Unity, C# | How do I have a wait time between methods? 【发布时间】: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);
【问题讨论】:
【参考方案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 方法将无济于事。以上是关于统一,C# |我如何在方法之间有等待时间?的主要内容,如果未能解决你的问题,请参考以下文章