tanaka's Programming Memo

プログラミングについてのメモ。

Unity2017でのWebGLのビルドエラー Sharing violation on path について

問題

以前、node.exeを古いものにすると直る、というやつは書いたのですが、その後、以下のようなエラーが発生するようになりました。

IOException: Sharing violation on path C:\Users\Public\Documents\Unity17\webglbuildtest\Temp\StagingArea\Data\Output\Build\WebGL.asm.code.unityweb.compressed System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/FileStream.cs:320) System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share) (wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare) System.IO.File.Open (System.String path, FileMode mode) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/File.cs:347) UnityEditor.WebGL.WebGlBuildPostprocessor.SetGzipComment (System.String path, System.String comment) (at /Users/builduser/buildslave/unity/build/PlatformDependent/WebGL/Extensions/Unity.WebGL.extensions/BuildPostprocessor.cs:802) UnityEditor.WebGL.WebGlBuildPostprocessor.CompressAndMarkGzip (System.String path) (at /Users/builduser/buildslave/unity/build/PlatformDependent/WebGL/Extensions/Unity.WebGL.extensions/BuildPostprocessor.cs:827) UnityEditor.WebGL.WebGlBuildPostprocessor.CompressBuild (BuildPostProcessArgs args) (at /Users/builduser/buildslave/unity/build/PlatformDependent/WebGL/Extensions/Unity.WebGL.extensions/BuildPostprocessor.cs:862) UnityEditor.WebGL.WebGlBuildPostprocessor.PostProcess (BuildPostProcessArgs args) (at /Users/builduser/buildslave/unity/build/PlatformDependent/WebGL/Extensions/Unity.WebGL.extensions/BuildPostprocessor.cs:924) UnityEditor.PostprocessBuildPlayer.Postprocess (BuildTargetGroup targetGroup, BuildTarget target, System.String installPath, System.String companyName, System.String productName, Int32 width, Int32 height, BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.BuildReporting.BuildReport report) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/PostprocessBuildPlayer.cs:272) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

Error building Player: 2 errors

Build completed with a result of 'Failed' UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

UnityEditor.BuildPlayerWindow+BuildMethodException: 3 errors at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (BuildPlayerOptions options) [0x0020e] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:181 at UnityEditor.BuildPlayerWindow.CallBuildMethods (Boolean askForBuildLocation, BuildOptions defaultBuildOptions) [0x00065] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:88 UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

エラーのタイミングは、以下の圧縮時のようです。

f:id:am1tanaka:20180117145753p:plain

解決策

原因は、GZIP圧縮のようでした。以下の手順で圧縮をしないようにするか、あるいは圧縮方式をBrotliに変更すると、ビルドできるようになりました。

  • Editメニューから、Project Settings -> Playerを選択
  • InspectorビューのPublising Settings欄を開いて、Compression Formatを"Gzip"から"Disabled"に変更する(あるいはBrotli)

f:id:am1tanaka:20180117150217p:plain

まとめ

圧縮しないと容量が大きくなりますし、BrotliChromeFirefox、Edgeには対応していますが、Safariは非対応のようです(Unity - マニュアル: webgl-deploying)。

学校の一部のPCでのみ発生している不具合で、一般的な不具合ではなさそうです。とりあえず応急処置ということで。根本的な原因をつきとめたら追記します。