【发布时间】:2021-02-01 17:22:35
【问题描述】:
我刚刚开始学习如何在 Unity 中编程。在过去的两三周里,每天都在尝试编写一些代码。我有点卡在一个简单的脚本上。该脚本如下:
`using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControllerX : MonoBehaviour
{
public GameObject dogPrefab;
public float timeWaited = 0.5f;
public void Start()
{
}
// Update is called once per frame
void Update()
{
// On spacebar press, send dog
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(MyCoroutine());
}
}
private IEnumerator MyCoroutine()
{
Instantiate(dogPrefab, transform.position, dogPrefab.transform.rotation);
yield return new WaitForSeconds(1f);
Debug.Log("Waited 0.5 seconds!");
}
} `
我希望在按空格键之间有 0.5 秒的休息时间(这会产生一条狗)。我认为这不起作用,因为协程只是在按空格键时从头开始播放。但是,我想不出解决此问题的方法。任何建议将不胜感激!
【问题讨论】:
-
每次按下空格键时,您的代码都会启动一个新的协程。即使从技术上讲,您在 每个协程实例 内等待 1 秒(即使您记录 0.5 秒,但您的代码等待 1 秒,而不是 0.5),它不会阻止新的协程开始。所以,你几乎是正确的 - 协程从顶部重新启动 - 它的新实例 - 不是同一个。您可以改为保留某种
TimeSpan变量来跟踪按键之间的时间,并完全消除协程。 -
另外,
if (Time.time >= timeWaited)语句在前几帧之后总是true- 它返回自游戏开始后的总秒数。 docs.unity3d.com/ScriptReference/Time-time.html 考虑改用Time.deltaTime,并将其累积到某个变量中以确定是否该生成下一个项目(在您的情况下为狗)。 docs.unity3d.com/ScriptReference/Time-deltaTime.html -
@CoolBots 我会看看我能不能完成这项工作。出于兴趣,协程是否有任何可能的方式在这里工作?我也忘了删除那条线哈哈,正在试验。谢谢!
-
当然,您可以为此目的制作协程。假设您想做一些耗时的任务(例如,狗生成的动画大约需要半秒,这将是生成之间延迟的一个很好的原因) - 您仍然可以启动协程你现在就做,但我会让主代码负责检查是否是时候开始一个新的协程。或者,您可以“永远”运行协程,并检查该协程中的按键,但这不是 Unity 协程的典型用例。
-
@CoolBots
Time.deltaTime是完全不同的东西。他需要实时等待 0.5 秒,而Time.deltaTime仅返回自上一帧以来的秒数。如果不知何故距离上一帧的时间小于 0.5 秒,则协程将永远不会触发。
标签: c# unity3d scripting coroutine