AutoStaticsCleanup 是一个较新的属性,用于自动重置/重新初始化静态字段、属性、事件等,从而让你可以跳过域和/或场景重载。如果你还不了解这个功能,请参阅 Unity 文档。
简化工作流是个好主意,但由于它在幕后工作方式的原因,存在一些陷阱:主要是它并不总是有效,而且除非你仔细检查编辑器日志,否则它不会告诉你它对某个特定字段/属性等无效。我不知道为什么他们不能将警告和错误输出到普通日志中,但事情就是这样。
所以如果你只是添加了该属性,不要假设它真的在做任何事情!
我在为 U6.6 和 6.7 升级 TilePlus Toolkit 资源时遇到了这个问题。
如何判断:如果你将属性添加到静态类或带有静态字段的 MonoBehaviour,并且没有被告知要将类改为 partial,那么它根本没有工作。不过,它可能仍然没有为你类中的所有字段等正常工作。
如果不确定,请检查编辑器日志(从控制台的下拉菜单中)。你会看到类似这样的内容:
warning CS8785: Generator 'AutoStaticsCleanupCodeGenerator' failed to generate source. It will not contribute to the output and compilation errors may occur as a result. Exception was of type 'RoslynSymbolException' with message 'Field MyStaticClass.SomeField is readonly and has a non-trivial initialization expression'.
没有其他方法可以看到这些消息,因为正如我提到的,它们不在控制台日志中。
我放弃使用这个属性,因为很难判断单个字段/属性等是否真的生成了重置代码,很容易在代码中留下残留错误。而且它对于许多常见情况也无法合理处理。但在控制台中不给出警告就失败,在我看来是很危险的。
相反,我采用这种方法,虽然稍微多一点工作,但始终有效:
#if UNITY_EDITOR
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void Reinit()
{
//在这里添加重新初始化语句。
}
#endif
评论 (0)