什么是 C# 中的 IEnumerator,它在 Unity 中的用途是什么?

我是开发人员-9

最近我看到了一个关于在 Unity 中使用 C# 生成对象的教程。那个老师使用了一个看起来像这样的方法:

   public IEnumerator CallSpawner()
   {
      yield return new WaitForSeconds(0.5f);
      SpawnObstacles();
   }

我想问一下,返回的方法有什么用IEnumerator像这样实现相同的逻辑是不可能的吗?:

float diffTime = 0f;
private void Update()
{
    if(Time.time - diffTime == 0.5f)
    {
        diffTime = Time.time;
        SpawnObstacles();
    }
}

我阅读了microsft 文档,但我不明白。请帮我。

凯厄斯·贾德

IEnumerator函数有什么用

IEnumerator 没有函数,它是返回类型。C# 也没有函数(但我知道你的意思)——在 C# 中,我们称它们为methodsIEnumerator 被称为意味着它是一个接口,因此任何实现 IEnumerator 接口的类都可以通过此方法返回

在这种使用的实践中,它实际上更像是一种黑客行为,而不是打算提供真正的意图,即遍历(或生成)一组事物。当你yield return在一个方法中使用一个语句时,“一些魔法发生了”,它不是经典意义上的返回,而是创建了一个工具,代码可以从它离开的地方恢复(调用返回的枚举器中的下一个项目将导致在 yield 之后恢复的代码,具有之前的所有状态,而不是重新开始)。如果您查看 MSDN 示例以获取收益:

public class PowersOf2
{
    static void Main()
    {
        // Display powers of 2 up to the exponent of 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }

    public static System.Collections.Generic.IEnumerable<int> Power(int number, int exponent)
    {
        int result = 1;

        for (int i = 0; i < exponent; i++)
        {
            result = result * number;
            yield return result;
        }
    }

    // Output: 2 4 8 16 32 64 128 256
}

循环由i; 如果这不是 ayield return那么这将不会按预期运行(它无法返回枚举器作为开始,但我们将忽略它)。假设它只是一个正常的返回,循环根本不会循环;代码会进入,开始循环,点击返回,然后只返回一个数字,循环所在的所有记忆都将被遗忘。通过将其设置为 yield return,将返回一个枚举器,并设置一小组“保存状态”,从而循环可以记住 i 的当前值 - 每次您要求下一个值时,循环都会再次循环并弹出一个不同的值,当然是最大值..此时返回的枚举器表示它没有更多项目


在这种情况下,您必须使用 yield return new WaitForSeconds 因为这就是 WaitForSeconds 的工作方式。Yielding 放弃了一个枚举器给调用方法,然后调用方法可以自由地枚举它。从文档来看,这是故意在下一帧上完成的,因此使用 yield(可能重复)是一种排列跨多个帧发生的代码块的方式,而无需某种外部状态管理来记住进程在哪里最多和一个冗长的“如果状态= 1,则关闭门并将状态加1,否则如果状态= 2,则点亮手电筒并添加1,否则如果状态= 3 ...”。你可以屈服,关上门,屈服,点燃火炬,屈服..

我们不能通过这个过程做到这一点

当然,看起来很合理;每秒看时钟 100 次,如果距离第一次看时钟已经过去了 0.5 秒,则生成障碍物

我想(从未使用过 Unity;除了阅读此函数的文档外,不要自称了解它)您的 Update 循环还有很多事情要做,因此将一个过程交给专门的等待然后做比花所有时间看时钟并进行潜在的复杂计算来计算是否应该做某事更有效;生活中大多数以每 x 毫秒轮询一次开始的事情都受益于切换到“如果事件发生,对其做出反应”的工作方式

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章