背景

某天下午,正常使用Unity发包,编译资源时,突然报错。Win32 IO returned 1224。没有修改任何编译相关的代码,而且前几个小时,还能正常打包。以下是报错截图。

Unity打包 ios 支持的最低版本 unity windows打包ios_解决方案

历程

经过搜索知,unity IO 报错1224代表,IO访问文件时,该文件被其他进程占用。参考链接

Unity打包 ios 支持的最低版本 unity windows打包ios_重启_02

由此作为线索,查询该文件被什么进程占用了。查询进程占用方法链接。但是并没有找到任何正在执行的进程。而且最近又没有改过任何编译资源相关的代码。

重启引擎,关机重启,换了磁盘,尝试用进程工具解锁,均无果。试了几个月前无任何修改的的老工程,也是同样的报错表现

由此排除绝对不是某个常规进程占用了。

后续在运维的协助下,看到Windows10在几个小时前有更新补丁,由此转为排查是否是系统更新引起。

最终发现是,WindowsDefender主动防御系统更新后,可能改动了自动扫描文件的机制引起的。

猜测:新的机制中,系统中每新建一个文件,新的病毒检测系统,立即就去检查该文件是否有病毒,此时应该会占用IO权限,如果这时Unity使用IO流再访问就会报错。

比如 IO.Create之后直接调用IO.Write或IO.Copy,极有概率复现该问题。

Unity打包 ios 支持的最低版本 unity windows打包ios_unity3d_03

Unity打包 ios 支持的最低版本 unity windows打包ios_unity3d_04

解决方案

解决方案有两个,第一个比较简单:关闭所有的自动检测。但是要注意,关闭了病毒检测,会有被攻击风险。而且系统设置中标明了,该机制后续有可能还会自动打开,治标不治本。

Unity打包 ios 支持的最低版本 unity windows打包ios_解决方案_05

第二个,修改系统自带的病毒扫描过滤列表,即,将Unity工程文件夹和Unity进程都加到过滤列表中去。

建议将所有的工程放到一个大的文件夹中,不然工程放的比较散,每一个工程,都要添加一个过滤路径。不过如果选中的文件夹比较大的话,点击添加之后,系统会反应很久很久才会刷新列表。

第一步,找到设置中的如下位置。

Unity打包 ios 支持的最低版本 unity windows打包ios_Unity打包 ios 支持的最低版本_06

第二步,按类型添加。

Unity打包 ios 支持的最低版本 unity windows打包ios_Unity打包 ios 支持的最低版本_07

第三步,添加结果如下。PS:文件夹比较大就没有添加。因为我工程中编译输出的文件都是.unity3d类型的,使用后缀完全够用。

Unity打包 ios 支持的最低版本 unity windows打包ios_windows_08

文章对你有帮助么,点个赞可以嘛。攒攒人气,谢谢啦。