ぷろみん

プログラミング的な内容を扱ってます

Unityのフォルダ構成ベストプラクティス

モチベーション

Unityでは多岐にわたるプロジェクトを考慮してフォルダ関係のサポートは薄く、プロジェクト毎に自由に設定しなければならない。
自由は素晴らしいことだが統一規格がないことは他の人のコードを読む時にもんにゃりする。
そこで、私が良いと思っているフォルダ構成を紹介しようかと思う。

オススメする方法

とりあえず結論から紹介する。

  • Assets直下をAsset Storeのインポート先とする。
  • Assets以下に自身のグループや会社名のフォルダを作り、ここを作業フォルダとする。
  • Assets/MyGroup以下にScenesやScripts、Prefabs等のフォルダを作る。ここは複数のシーンで利用するアセットを格納する。
  • Assets/MyGroup/Scenes以下にシーン名フォルダを作る
  • Assets/MyGroup/Scenes/SceneName以下にScripts、Prefabs等のフォルダを作る。ここはこのシーン専用のアセットを格納する。
  • Assets/MyGroup/Scenes/SceneName/SceneName.unityにシーンファイルを作る。

タグを有効活用すれば、もっと良い方法もありそう。
けど、いちいちアセットを作る度にタグ打つのが私には無理だった。

ダメだった方法

Assets/Pluginsフォルダに全てのAsset Store等の外部アセットを入れる。

上記をすると誤作動するアセットが度々存在したためダメだった。
スクリプトに自身のパスを指定しており、デフォルトインポートパス以外では動作しないアセットが存在する以上デフォルトインポート以外は信用し辛い。
そして多くのデフォルトインポート先はAssets/GroupNameである。これはもう諦めてそれに従った方が良い。
たまにAssets直下に展開しているアセットもあるが、その場合は適当なフォルダを作って詰める。
それで動かなかった場合はスクリプト修正か利用しないかを選択した方が良いと思う。プラグインを簡単に外せる環境構築は大事。
というか、有料アセットが間違ってgithubに上がってたりするのでプラグインマネージャ欲しい。いろんな人が困っているはず。

ダメだった方法2

Assets/Scenesに全てのシーンファイルを詰める。
Assets/Scriptsに全てのスクリプトファイルを詰める。
Assets/Prefabsに全てのPrefabファイルを詰める。

シーンが増えてくるとアセットのスコープが見えなくなってくる。
スコープが見えないということは変更に対する影響範囲が見えなくなるということだ。
つまり、ちょっとシェーダを書き換えたり、ちょっとPrefabを更新したりするだけで他のシーンでは動作しなくなっている可能性がある。
スクリプトのnamespaceもシーン毎に変える。

ちょっと横にそれるが、Unityではスコープの概念がゆるゆるなので色んな所で自ら制限をかけた方が良いかと思う。
例えば私はtransform.parentは使わないようにしている。こうすることで、末端のgameObjectはアクセスできる範囲が狭まり必要以上に多機能になることはないはず。