解决Unity发生意外偶先不执行构造函数及Enter Play Mode Options
前言
今天开发时候碰到Unity编辑器频繁报错。报错的发生位置总是与构造函数有关,经过排查后锁定了问题。发现构造函数竟然会意外的不执行,这真的完全颠覆了我所了解的知识了。前前后后捣鼓了一小时就是想不通为什么创建了对象会发生不执行构造函数的情况(同样代码过去不会发生)。
排查流程
源代码:
//伪代码,不全贴了。
where T:GameObjectFactory
public static T Instance
{
get
{
if (_Instance == null)
{
_Instance = new T();
}
return _Instance;
}
}
public GameObjectFactory()
{
Debug.Log("InitGameObjectFactory");
Init();
}
在调用GameObjectFactory.Instance属性时,Instance正常返回实例,但GameObjectFactory构造函数偶先不执行。导致Init函数没执行,后面逻辑没走通。
解决方案
离谱吧。最后仔细想了一下,之前启用了一个“Enter Play Mode Options”的实验性功能。把“Enter Play Mode Options”关掉后就正常了。
点击File > Project Settings > Editor,取消勾选Enter Play Mode Options。
如果实在是想要使用“Enter Play Mode Options”功能,可以选择启用Reload Domain(重新加载域)和Reload Scene(重新加载场景)。至于是否会发生其他问题,我也不知道,反正我是不打算使用“Enter Play Mode Options”。
Enter Play Mode Options介绍
Enter Play Mode Options功能会禁用域和场景的重新加载。在禁用域和场景的重新加载后,在进入运行模式时,不会重新加载脚本。因为无需销毁、创建和重新加载 .NET 应用程序域,所以可更快地切换到运行模式。
观点
很显然这是不靠谱的!我们不可能为每个脚本的静态成员都进行拉回默认值的操作。显然让我自己去跟踪每一个静态成员是真的太麻烦了,更别提让所有人去跟踪静态成员。这无形会增加bug的潜在的可能。即使我们能够按照这一约束开发,但并非所有Unity资源包都可以在禁用域和场景重新加载的情况下继续使用,我们甚至要检查并跟踪导入的资源里的静态成员。
来源:麦瑞克博客
链接:https://www.playcreator.cn/archives/unity/unity_technologyshare/2960/
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!