我刚刚开始使用Unity,我想构建以下函数: 目前我按下一个按钮,在屏幕外产生一颗小行星,然后小行星从右向左穿过屏幕,最后我在屏幕外摧毁小行星.所有这些都已经奏效了.但现在我想改变按钮功能,这样它就可以延迟几秒钟产生更多小行星.我不知道该怎么做.我的代码目前如下所示:

public class ButtonSkript : MonoBehaviour
{       
    private Vector3 spawnPosition = new Vector3(15, 0, 0);
    public GameObject planet_001Prefab;
    public GameObject planet_011Prefab; // not in use
    public GameObject planet_017Prefab; // not in use
    public GameObject planet_079Prefab; // not in use
    

    public void ShowJourney()
    {
        int[] asteroids_array = {27, 569, 1293, 37};
        int[] material_type_array = {0, 2, 1, 3}; // not in use
        
        for (int i  = 0; i < asteroids_array.Length; i++) {
            GameObject a = Instantiate(planet_001Prefab);
            a.transform.position = spawnPosition;
        
            Destroy(a, 3);

            // wait for 3 seconds
        }
    }
}


public class Translate : MonoBehaviour
{
    public float speed = 10.0f;


    // Update is called once per frame
    void Update()
    {
        moveAsteroid(new Vector2(-1, 0));
    }
    
    void moveAsteroid(Vector2 direction)
    {
        transform.Translate(direction * speed * Time.deltaTime);
    }
}

我已经try 了System.Threading.Thread.Sleep(3000);,我还try 用IEnumarateyield return new waitForSeconds(3.0f);来构建一个计时器,但这两个东西都不起作用,或者我没有正确地实现它.

这可能是一个简单的问题,但我自己想不出来.

感谢您的帮助:)

推荐答案

StartCoroutine方法有点像一种"一发即忘"的方法.它将启动一个新的协程,而不是实际等待查看协程正在做什么.所以,您最初try 循环并启动‘n’个协程就是这样做的--同时启动4个新的协程.

这种情况下的一个潜在解决方案可能是:

int[] asteroids_array = {27, 569, 1293, 37};
int[] material_type_array = {0, 2, 1, 3}; // not in use

public void ShowJourney()
{
    StartCoroutine(Spawn());
}

IEnumerator Spawn()
{
    for (int i  = 0; i < asteroids_array.Length; i++)
    {
        var a = Instantiate(planet_001Prefab);
        a.transform.position = spawnPosition;
        Destroy(a, 3); // could be here, or after the WaitForSeconds.
        yield return new WaitForSeconds(3);
    }
}

请注意,没有判断协程是否正在运行,所以如果您将一个按钮附加到ShowJourney,您可能仍然会运行大量的协程.

如果每颗小行星都遵循你的逻辑,你也可以简单地重新定位小行星,而不是创建一个新的小行星.例如:

IEnumerator Spawn()
{
    var a = Instantiate(planet_001Prefab);
    a.transform.position = spawnPosition;
    for (int i  = 0; i < asteroids_array.Length; i++)
    {
        yield return new WaitForSeconds(3);
        a.transform.position = spawnPosition;
    }
    Destroy(a);
}

但这只是说明,通常有很多方法可以实现你想要的结果.

Csharp相关问答推荐

无法通过绑定禁用条目

如何解决提交按钮后 Select 选项错误空参照异常

集合表达式没有目标类型

HelperText属性不支持复杂内容(混合C#和标记)

Celler ArgumentExpression是否期望在所有情况下都捕获允许空值的运算符?

当我try 在与XAMP的MySQL服务器连接的ASP.NET核心应用程序中添加迁移时出现错误

如何在发布NuGet包之前设置命名空间?

类/值和日期的泛型方法

使用未赋值的、传递的局部变量

如何使用类似于[SELECT*FROM&Q;&Q;WHERE&Q;]SQL查询的System.Data.Entity创建查询?

如何使用LINQ在C#中填充列表列表?

获取应用程序版本信息时出现奇怪信息

读取测试项目中的应用程序设置

单位中快照的倾斜方向

使用Try-Catch-Finally为API端点处理代码--有什么缺点?

C#如何替换两个XML元素值?

每个.resx文件的变体都应该生成自己的Designer.cs文件吗?

RDLC比例图像对齐

如何在创建类列表之前草签该类

在Visual Studio中检测源代码文件中的特定单词或模式?