Unity,C#|我如何在方法之间等待?

时间:2014-11-20 04:28:36

标签: c# unity3d 2d

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

当前状态:当我尝试使用WaitForSeconds

时,Snail仍然在一个地方

没有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);
    }
}

3 个答案:

答案 0 :(得分:2)

协同程序需要以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"
        }
    }
}

答案 1 :(得分:1)

你的逻辑流程有点困惑。每当你想要调用它一次(例如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;
    }
}

答案 2 :(得分:1)

美好的一天我相信你的问题是你正在调用在每个帧上调用的update方法,而不管之前的执行情况如何,这意味着只有在等待之前调用wait的线程,因此可以调用该方法再次,因为另一个线程只等待。

试试这个:

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,然后再次调用该函数。