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の外になっていたとしても、文字列としてパスが含まれているとエラーになるようになったのかなと考えています。
コメント
自分で調べてもわからなかったので、質問させてください。
わたしもunity5.6にアップデートして、全く同じと思われる問題に遭いました。ビルドできず、Building to the Assets folder is not allowedが出てきます。
質問なのですが、「エディタツールにおいてビルドを実行するBuildPipeline.BuildPlayerメソッド」というのがよくわかりません。当方、知識はまだまだ未熟なので、「エディタツール」や「BuildPipeline.BuildPlayer」がそもそもわかりません。ググったり、unityの参考書も読んだのですが、書いてありませんでした。
現在、しばらくビルドの問題から作業が進んでおらず、非常に困っております。できれば、具体的にどうしたらよいのか教えていただけると助かります。お忙しい中、失礼しました。
ご質問ありがとうございます。
「エディタツール」とは、私がエディタ拡張で作成したビルド用のツールのことを指していました。BuildPipeline.BuildPlayerはそのエディタ拡張で使用している、プロジェクトのビルドを実行するメソッドです。
がむだん様がビルドを実行するときに、エディタ拡張で作成されたツールなど、Unityの標準ビルドと違う方法をもし行っておられましたら、そのツールの作成者の方にご確認されてみてはいかがでしょうか。
標準のビルド方法を行っていてこの問題が発生しているのでしたら、本記事とは別の原因かもしれません。その場合は解決方法も分からないので…お力になれず申し訳ありません。
補足として、「Unityの標準ビルドで発生する場合の回避方法」「BuildPipeline.BuildPlayerについて」を追記いたしました。
よろしければ合わせてご確認ください。
また、5.6にこだわる理由がなければ、5.5にダウングレードしてみる手もあります。(私は結局そうしています…)
5.5をダウンロードするための方法は、別の記事( http://scriptlife.hacca.jp/contents/programming/2017/04/05/post-2256/ )に書きました。
こちらもご参考になれば幸いです。
ご丁寧にありがとうございます。私は標準ビルドですので、かげろ様の遭遇したトラブルとは違ったみたいですね。標準以外のビルドがあるとは知りませんでした。ちょっとどうにもならなさそうなので、ダウングレードの方、やってみようと思います。しかしこの問題、この先のunityのバージョンアップとかで改善されるんでしょうかね……。
ともかく、お返事ありがとうございました。困っていたので、非常に助かりましたし、大変勉強にもなりました。失礼します。
そうでしたか…お力になれず申し訳ありません。
何が原因なのでしょうね…
ダウングレードで問題が解決されることを願ってます。がんばってください。。