统一,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# |我如何在方法之间有等待时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何使脚本以简单的方式统一等待/休眠

如何在统一 c# 中检测用户 IP 地址? [关闭]

C#如何在不等待完成的情况下启动异步方法?

C#如何使同步方法等待事件触发?

C#如何强制等待连接到 WCF 服务

如何将方法转换为异步/等待 C#