Build時にHideFlags.DontSaveのエラーが出た場合の対応

  • 0
    いいね
  • 0
    コメント

    開発環境

    Unity5.6.1f1
    C#

    問題の発生

    Unityでのビルド時に以下のようなエラーが出ていました。

    An asset is marked with HideFlags.DontSave but is included in the build:
    Asset: 'Library/unity editor resources'
    
    Building - Failed to write file: sharedassets0.assets
    UnityEditor.HostView:OnGUI()
    

    このエラーが出ていてもビルド自体は完了するのですが、作成されたビルドは起動しません。
    エラーを読むと HideFlags.DontSave フラグが付いているAssetをビルド内に含めてしまった事が問題で、そのAssetはLibrary/unity editor resourcesに所属する何かのようです。editor……確かに正規ビルドに含めてはいけない物のように感じます。

    しかしここで問題になっているのは何のAssetでしょうか。
    他に何か情報がないか%APPDATA%..\Local\Unity\Editor\Editor.logを開いて該当エラーの詳細情報を確認してみます。

    An asset is marked with HideFlags.DontSave but is included in the build:
    Asset: 'Library/unity editor resources'
    (You are probably referencing internal Unity data in your build.)
    UnityEditor.BuildPipeline:BuildPlayerInternalNoCheck(String[], String, String, BuildTargetGroup, BuildTarget, BuildOptions, Boolean)
    UnityEditor.BuildPlayerWindow:BuildPlayerWithDefaultSettings(Boolean, BuildOptions, Boolean) (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:485)
    UnityEditor.BuildPlayerWindow:BuildPlayerWithDefaultSettings(Boolean, BuildOptions) (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:339)
    UnityEditor.BuildPlayerWindow:GUIBuildButtons(IBuildWindowExtension, Boolean, Boolean, Boolean, BuildPlatform) (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:1390)
    UnityEditor.BuildPlayerWindow:ShowBuildTargetSettings() (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:1317)
    UnityEditor.BuildPlayerWindow:OnGUI() (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:913)
    System.Reflection.MonoMethod:InternalInvoke(Object, Object[], Exception&)
    System.Reflection.MonoMethod:Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)
    System.Reflection.MethodBase:Invoke(Object, Object[]) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115)
    UnityEditor.HostView:Invoke(String, Object) (at C:\buildslave\unity\build\Editor\Mono\HostView.cs:262)
    UnityEditor.HostView:Invoke(String) (at C:\buildslave\unity\build\Editor\Mono\HostView.cs:255)
    UnityEditor.HostView:OnGUI() (at C:\buildslave\unity\build\Editor\Mono\HostView.cs:84)
    

    このコールスタックにあるBuildPlayerWindowとかUnityEditor.HostView:OnGUI() は単にビルド中に表示されているGUIウィンドウのようです。つまりこちらが欲しいエラーについての情報は特に示されていないように見えます。

    原因となったアセット

    BadAsset1.PNG

    今回のエラーの原因となったAssetは自分が過去にどこかのサンプルからコピーしてきたOL Box@2xでした。

    BadAsset2.PNG

    なるほど、確かにこのAssetの所属はLibrary/unity editor resourcesです。この参照を外す事でビルドは問題なく成功するようになりました。ですがこれはリビジョンを遡って運良く発見できたものです。今後の為にもっと効率的な発見方法はないでしょうか。

    原因のアセットを探す方法

    今回の問題の箇所をmetaファイルで確認するとこのようになっています。

      m_inspector_style:
        m_Name: box
        m_Normal:
          m_Background: {fileID: 0}
          m_ScaledBackgrounds:
          - {fileID: -8126836811217315462, guid: 0000000000000000d000000000000000, type: 0}
          m_TextColor: {r: 0, g: 0, b: 0, a: 1}
    

    このfileIDがマイナス値である点が気になります。
    他にfileIDがマイナスとなっている箇所を何点か調べた所、ImageコンポーネントなどUnity側で用意されているもの(つまり自分のプロジェクト外のもの)はマイナス値になっているように見られました。
    これは何かの足掛かりになりそうです。

    まとめ

    ビルド時に"Library/unity editor resources"のリソースを使った事によるエラーが出ている場合、
    使用箇所を特定するためにはプロジェクト内の*.meta;*.prefab;*.unityファイルをfileID: -で検索し、
    出てきた候補の中から怪しい場所を探します。
    一応はこれで問題の箇所を絞り込む事はできそうですが、もっと確実にそれがLibrary/unity editor resources 内への参照である事を示す値についての情報があればどなたか教えていただきたいです。