Unityでゲームを作るとき、どのようなフォルダ構成でアセットを管理するか悩みどころです。
フォルダ構成が悪いと開発効率が落ちてしまいます。
「アセットはどのようなフォルダ構成にすれば良いのだろうか?」 という問に関して考えられるフォルダ構成をいくつかご紹介したいと思います。
基本方針
以下を基本的な方針とします。
・アセットストアからインポートするアセットはAssets直下に配置
・開発中のゲームで使用しているアセットはProjectフォルダの中に配置
Project/以下をどう分けるべきか
シーン、スクリプト、テクスチャなどのアセットはProjectフォルダ以下に入れることになりますが、
ここで問題となるのが、これらのアセット群をどのようなフォルダ構成にするかです。
・・・ むずかしい
3つの方法
悩みに悩んだ結果、これがよさそうだなぁという結論にたどり着きました。
そこで、考えられるフォルダ構成を3つ、今回は紹介したいと思います。
・方法1 : アセット単位でフォルダを作る
・方法2 : シーン単位でフォルダを作る
・方法3 : 音素材、デザイン素材、プログラム素材という区分でフォルダを作る
方法1. アセットの種類でフォルダを作る
アセットの種類ごとにフォルダを作ろうという思想です。
文章で説明すると、
・シーンはSceneフォルダの中に配置
・シーンで使用するスクリプトは Scriptsフォルダの中へ配置
という管理方法です。
メリット: アセットの場所が分かりやすい
アセット群を種類で分けることのメリットは、アセットがどこにあるかが分かりやすくなるという点にあると思います。
さらに、その中でシーン別に分けることによりそのアセットがどのシーンで使われているのかも分かりやすくなります。
例えば、SceneAで使用されているテクスチャを差し替えたい場合はAssets/Project/Textures/SceneA の中だけを触れば良いので
分かりやすい。
デメリット : 同名フォルダを複数作る必要が出てしまう
この方法ですが管理が面倒くさいというデメリットがあります。
例えば、新しくシーンを作成しようとした場合などに手間がかかります。
Assets/Project/の中にScenes/, Scripts/, Textures/フォルダが存在する場合を考えます。
Hogeシーンを作る場合以下の作業が必要になります。
- Assets/Project/Scenesフォルダ以下にHoge.unityを作る
- Assets/Project/Scriptsフォルダ以下にもHogeフォルダを作る
- Assets/Project/Texturesフォルダ以下にもHogeフォルダを作る
同じ名前のフォルダを複数作成する必要が出てきてしまい、これは若干面倒です。
シーンの名前変更も手間がかかる
このHogeシーンですが、名前を変えてFugaシーンに変えようとした場合にも手間がかかります。
複数あるHogeフォルダを一つ一つFugaへとリネームするという作業が必要になります。
これも面倒くさい。
方法2. シーン単位でフォルダを作る
二つ目の方法は、
「アセット群をシーン単位でまとめてしまおう」
という考え方です。
シーン単位でまとめることにより、シーンと同名のフォルダを作る作業が要らなくなります。
細かい補足をすると、
・シーンアセットは Assets/Project/[シーン名]/ の中に入れる
・シーンで使用するスクリプトは Assets/Project/[シーン名]/Scripts/ の中に入れる
・シーンで使用するテクスチャは Assets/Project/[シーン名]/Textures/ の中に入れる
全てのシーンで使用するスクリプトをまとめたい場合は、
Assets/Project/_Common/Scripts/というフォルダを作りその中に入れます。
メリットその1 : シーン名のフォルダは1つだけ
方法1.のデメリットとして、「シーンに対応する同名フォルダが複数必要になる」というものがありましたが、
方法2.ではシーンに対応するフォルダは1つだけで済みます。
同じ名前のフォルダを何個も作る、という面倒くさい作業はしなくて済みます。 楽です。
メリットその2 : アセット群が一か所にまとまる
この方法でアセット管理をする場合、シーンデータとシーン内で使用されているデータ群が近い場所に配置されます。
関連の強いアセット群が近い場所に配置されることにより管理がしやすいというメリットがあります。
例えば、Hogeシーンで使用しているスクリプトを編集する場合はシーンファイルの近くにあるScripts/フォルダ以下を見れば良いので
管理が楽です。
メリットその3 : 素材とシーンとの関係が分かりやすい
例えば、SceneAで使用されているテクスチャを差し替えたい場合はAssets/Project/SceneA/Textures の中だけを触れば良いので
分かりやすい。
デメリット : 同種アセットが分散してしまう
・同系統のファイルが 分散 してしまう。
例えば、Gameシーンで使用しているテクスチャはAssets/Project/Game/Texturesフォルダの中。
Titleシーンで使用しているテクスチャは Assets/Project/Title/Texturesフォルダの中。といった感じで
ファイルが離れたところに置かれてしまいます。
テクスチャの差し替えをしたいとなった場合、これはちょっと手間が多いです。
方法3. 音、デザイン、プログラム単位でフォルダを作る
以下のようなフォルダ構成にします。
Designフォルダ
pngや3DモデルやFontなどのファイルはすべてデザイン素材というくくりにして
Assets/Project/Design/ 以下にそのまま入れます。
Design/以下はどのようなフォルダ構成になっていてもOKです。シーン構成と対応付ける必要はありません。
Audioフォルダ
mp3,wavファイルなどの音声ファイルはオーディオ素材というくくりにして
Assets/Project/Audio/ 以下に入れます。
これも好きな適当なフォルダ構成でも大丈夫です。シーン構成を意識する必要は皆無です。
Programフォルダ
スクリプト、シェーダー、Prefab、Scene、ScriptableObjectなどは プログラム素材 というくくりにして
Assets/Project/Program/[シーン名]/ 以下に入れます。
Program以下ではシーン構成を意識したフォルダ構成にします。
例えばGameシーンは Assets/Project/Program/Game/Game.unity としてシーンアセット(.unity)を配置します。
Gameシーンで使用するスクリプトは Assets/Project/Program/Game/Scripts/ の中へ入れます。
Prefabはプログラム素材なの?
Prefabは内部的には画像ファイルや音声データといったリソースの参照を持っているだけです。
つまり、スクリプトやScriptableObjectと似たようなもので、「Prefabもプログラム素材である」というとらえ方をして問題ないのではないかと個人的に考えています。
mp3やwav = オーディオ素材
pngやfbx = デザイン素材
それ以外 = プログラム素材
という分け方をしても困らない、というのが自分の考えです。
方法3のメリット: 素材の管理がしやすい
方法3.は素材が差し替えやすい、というメリットがあります。
デザイン素材はDesignフォルダにまとめてあるので、差し替える場合はこの中だけ触れば良い。
サウンド系素材を差し替えたい場合はAudioフォルダ。
方法3 は 方法1 と 方法2 のいいとこ取り
方法2.のデメリットとして挙がっていた「同系統の素材が離れた位置に置かれてしまう」ですが、
方法3ではこれを解消しています。
むしろ、方法3は方法1と方法2のいいとこ取り、といった感じでしょうか。
プログラム系のアセットは方法2をそのまま採用しつつ、音やデザイン素材はそれとは別に一か所にまとめてしまう。
私は方法3が好きです。
方法3のデメリット : 素材とシーンの関連が分かりにくい。
方法3のデメリットとしては「シーンとデザイン素材の関連が分かりにくい」というのが考えられます。
方法2ではシーンデータと素材は近い場所に配置されていたため、関連が分かりやすいという利点がありました。
一方、方法3の場合はシーンデータと素材が離れた場所に配置されてしまうので、方法2と比べてシーンと素材との間の関連が分かりにくいというデメリットがあります。
素材の数が増えてきた場合は シーンと同名フォルダを作り、その中に素材をまとめるという形がやりやすいと思います。
まとめ
これまでに3つのフォルダ構成を紹介しましたが、どれも一長一短という印象です。
ゲームに応じて最適なフォルダ構成というのは変わるのではないかと思いました。
自分は方法3.が好きです。