Unity 5.6で、BuildPlayerに渡すパスのチェックが変わったみたいです。
目次
BuildPipeline.BuildPlayerで「Building to the Assets folder is not allowed.」が発生する
エディタ拡張で自作したツールにおいてビルドを実行するBuildPipeline.BuildPlayerメソッドを使用していましたら、Unity 5.6で「Building to the Assets folder is not allowed.」エラーが発生するようになってしまいました。
Unity 5.5では動いていたコードですから、おかしいと思いつつもいろいろ試していくと、どうやらApplication.dataPathがパスに含まれているからいけないようでした。
Application.dataPathの文字列を含めないようにする
BuildPlayerでは第2引数にビルド結果の出力先を指定します。そこに指定するパスにApplication.dataPathの示す文字列が含まれていたため、先のエラーとなっていました。
Application.dataPathには「(プロジェクトディレクトリ)/Assets」が格納されており、警告のメッセージと一致します。
しかし、ビルド結果を本当にAssetsディレクトリの下へ出力しようとしていたわけではありません。「Application.dataPath+"/../tmp"」のように、Assetsディレクトリの一つ上の階層(プロジェクトディレクトリの位置)を取得するために使用していました。
けれど結果的にAssetsディレクトリとは関係ないパスになったとしても、文字列として入っていたらアウトのようです。
絶対パスに変換した
ですので私のケースでは、Path.GetFullPathメソッドを使用して、第2引数に指定するパスを絶対パスに変換してから渡してやることにしました。
指定したパスの文字列は最終的にAssetsディレクトリの外を示していますから、絶対パスにすればAssetsディレクトリのパスは消えます。これでBuildPlayerのエラーは消えました。
参考:Application.dataPath、Path.GetFullPath
Unityの標準ビルドで発生する場合の回避方法
Unityの「File > Build Settings」から実行する「Build」でも、出力先をプロジェクトの「Assets」以下に指定すると、「Building to the Assets folder is not allowed.」が発生するようです。
ただこちらの場合は、5.5でも発生しました。
BuildPipeline.BuildPlayerについて
私が遭遇した現象と、BuildPipeline.BuildPlayerについてもう少し補足します。
このメソッドは、エディタ拡張においてコードからビルドを実行させるときに使用します。
例えば次のコードをAssets/Editor/Build.csとして保存すると、Editorのメニューバーに「Build」が現れます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; public class Build : MonoBehaviour { [MenuItem("Build/test")] public static void Build_test() { string path = "C:\\tmp\\sample.exe"; BuildPipeline.BuildPlayer( new string[0], path, BuildTarget.StandaloneWindows, BuildOptions.None); } [MenuItem("Build/test_assets")] public static void BuildSample_assets() { string path = Application.dataPath + "/../build/sample.exe"; BuildPipeline.BuildPlayer( new string[0], path, BuildTarget.StandaloneWindows, BuildOptions.None); } [MenuItem("Build/test_assets_ok")] public static void BuildSample_assets_ok() { string path = Path.GetFullPath (Application.dataPath + "/../build/sample.exe"); BuildPipeline.BuildPlayer( new string[0], path, BuildTarget.StandaloneWindows, BuildOptions.None); } }
そして、「Build > test」を実行すると、C:\tmpにビルドされた実行ファイルが保存されていると思います。
さて、問題となっている「Building to the Assets folder is not allowed.」については、dataPathからの相対パスで、プロジェクトディレクトリにビルド結果を保存しようとしていたときに発生しました。
「Build > test_assets」を実行すると、5.5ではプロジェクトのディレクトリにbuildディレクトリが作成され、その下にsample.exeが出力されているはずです。
これが5.6では「Building to the Assets folder is not allowed.」となります。
しかし、BuildPlayerに指定するパスを絶対パスに変換してやると、5.6でも5.5と同じように動作します。その処理を入れた「Build > test_assets_ok」を実行すると、プロジェクトディレクトリの下にbuildディレクトリが作成され、そこに出力されることが分かります。
上記の挙動から推測して、最終的な出力先がAssetsの外になっていたとしても、文字列としてパスが含まれているとエラーになるようになったのかなと考えています。