【Unity】特殊なフォルダについて

はじめに

この記事はカヤックUnityアドベントカレンダー2016の2日目の記事になります。
今日の内容は特殊なフォルダについてです。

ソーシャルゲーム事業部所属、Unityエンジニアの荒井です。
昨日のUnityの基本に引き続きの担当になります。
よろしくお願いいたします。

特殊なフォルダとは

Unityエディタではプロジェクト内にフォルダを作成することができます。
私が携わっているプロジェクトでは事業部で共通するファイルはAssets/Kayac以下に、そうでないファイルはAssets/ProjectName以下に配置して、管理しやすいようにしています。

ファイルの整理などで便利なフォルダですが、特殊な扱いがされるフォルダがあります。
フォルダ名が特定のものであると特殊な扱われ方がされるので、フォルダ名を決める場合に注意が必要です。
そのような特殊なフォルダの扱われ方を知っておくと開発する際に躓くことが少なくなるので、今回は特殊なフォルダをいくつかピックアップしてを紹介します。
また、紹介する特殊なフォルダはAssetsフォルダ以下になくても同様に特殊な扱いがされる場合があるので注意が必要です。

特殊なフォルダの例

Editorフォルダについて

Unityエディタをカスタマイズしたい場合に、そのカスタム内容が書かれたスクリプトを格納するフォルダです。
このスクリプトはよくエディタスクリプトと呼ばれます。
このフォルダ以下にあるスクリプトはアプリのビルド時に含まれません。
また、コンポーネントとしても使用できないことに注意する必要があります。

Pluginsフォルダについて

ネイティブのプラグインに関するスクリプトなどを格納するフォルダです。
Plugins/iOSフォルダはiOSに対しての、Plugins/AndroidフォルダはAndroidに対してのプラグインが配置されます。

Resourcesフォルダについて

スクリプトからロードできるアセットを格納するフォルダです。
このフォルダはAssets以下であればどこにでも作成でき、また複数作成しても問題ありません。

ResourcesフォルダにあるアセットはResources.Loadを使用して下記のように記述することでロードすることができます。
引き数にはアセットのパスを指定します。

// Resources以下にあるSmaple/SampleTextのアセットを読み込む例
TextAsset text = Resources.Load("Sample/SampleText") as TextAsset;

上記の例からわかる通り、Resources.LoadにはResourcesフォルダからの相対パスが指定されるため、Resourcesを複数作成した場合には重複しないか注意する必要があります。

また、Resourcesに置いたファイルはプロジェクトで実際には使用されていなくてもビルドしたアプリには含まれてしまいます。
無駄にアプリのサイズを大きくしないためにストアにアップロードする ビルドを作成する際などには不用なファイルがないか確認しておくといいと思います。

StreamingAssetsフォルダについて

アプリを実行する機器の標準的なファイルシステム上にデータを配置したい場合に、そのデータを格納するフォルダです。
StreamingAssetsへのパスはApplication.streamingAssetPathにより取得できます。

Androidでは.apkファイルの中に圧縮されているため、下記のようにWWWクラスを使用して読み込みを行います。

// 読み込み処理の一例
string path = System.IO.Path.Combine(Application.streamingAssetsPath, "File");
WWW www = new WWW(path);
yield return www;
string result = www.text;

特殊なフォルダで注意したいスクリプトコンパイルの順番

上記で紹介した特殊なフォルダを扱うときには、スクリプトコンパイルの順番には注意が必要です。
コンパイルは下記のように4つのフェーズでわけることができます。

  1. Standard Assets, Pro Standard Assets, Pluginsフォルダにあるランタイムスクリプト
  2. Standard Assets, Pro Standard Assets, PluginsフォルダにあるEditorフォルダのエディタスクリプト
  3. Editorフォルダにはいったもの以外のすべてのスクリプト
  4. Editorフォルダ内のスクリプト

ここで、順番が先のフェーズではそれより後のフェーズでコンパイルされるものを参照することができません。
このため、どのフェーズでコンパイルが行われるかは把握しておく必要があります。

また、先程の説明した順番において、Editorフォルダ内のエディタスクリプトは2.で処理されますが、このときこのスクリプトしか変更していない場合、1.でのコンパイルは省かれます。
このことを利用して、今後触らないスクリプトをPluginsフォルダ以下に配置することで、コンパイルに要する時間を短くするのに特殊なフォルダが活用される場合があります。

おわりに

この記事では、Unityで特別に扱われるフォルダについて説明しました。

明日はカメラとレイヤーについてになります。 担当はmadaです。 お楽しみに!