我的目标:让我的蜗牛看起来像是在自行移动。 示例:向右走几秒钟,向左走几秒钟,在一个地方停留几秒钟。
当前状态:当我尝试使用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);
}
}
答案 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,然后再次调用该函数。