【发布时间】:2021-08-21 12:05:35
【问题描述】:
我正在使用 Unity 的运行模式测试单元,该单元在 Enumerator 函数(又名协程)上运行。
在测试内部,它们会调用更多的子例程,其中一些是普通函数,一些是IEnumerator函数,从而允许测试运行并跨越几帧。
[UnityTest]
public IEnumerator Test1( )
{
SubAction1( );
yield return SubAction2( );
}
void SubAction1( ) // A sub function that does not need to run over several frames
{
}
IEnumerator SubAction2( ) // A sub function that need to span over several frames
{
... // More code
yield return WaitForSeconds( 1 );
... // More code
while( condition == false )
yield return null; // Wait until condition becomes true to continue
... // More code
}
如果我误用 SubAction2 并像普通函数一样调用它:
SubAction2( ); // without yield return, this is misuse
它仍然会编译并静默运行!这将使 SubAction2 不会执行其所有代码。这只是一个小错字,但这可能会导致整个测试静默失败! SubAction2 是一个 IEnumerator 函数,应该通过 yield return 调用。
我是否有某种方法来进行完整性检查,或者强制使用“yield return”调用此函数?
我正在寻找以下任何可能的解决方案:
- 一些 C# 语言模式可防止在运行时或编译时发生此类误用。
- 或者一些有助于检查这种滥用的神奇属性?
- 或有助于检测此类误用的编辑器警告(例如 VisualStudio intellisense 中的选项?)
我现在的解决方案是使用“DoSubAction2”之类的前缀命名所有 IEnumerator 函数,然后进行正则表达式搜索以查找没有“yield return”的“Do”函数调用的出现,以手动检查是否存在误用。
【问题讨论】:
-
对问题审阅者的评论:虽然问题本身与 GameDev SE 有一些关系,但它更侧重于 C# 语言方面,所以我会在这里问。
-
顺便说一句,当您现在可以访问
async/await时,真的没有理由在 Unity 中使用遗留协程。虽然前者在 .NET Framework 4.x+ 推出之前很流行,但当看到yield的使用方式时,它往往会引起C#开发人员的注意 -
您使用的是什么 IDE? Rider 和 afaik 也 VisualStudio(但也许它只是 Resharper ^^)对此发出警告;)
-
@derHugo 我正在使用视觉工作室,但没有 resharper。嘿,很高兴知道它提供了这样的功能。我会记住这一点。但由于经济上的选择,我会先尝试寻找替代方案。
-
严格来说,调用返回IEnumerator作为方法的方法并没有错。你现在有一个生成器而不是协程。您希望收到有关“未使用退货”的某种警告。
标签: c# unity3d enumerator