やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Unityプロジェクトのディレクトリ構成と .gitignore

Twitterで話題に上がっていたので、自分なりのやり方を。

ディレクトリ構成

Assets/下

自分で作るものはAssets/下にフォルダを作り、そこにまとめています。

Assets
└── MY_PROJECT_NAME
    ├── Materials
    ├── Prefabs
    ├── Scenes
    ├── Scripts
    │   ├── Editor
    │   └── Runtime
    ├── Tests
    │   ├── Editor
    │   └── Runtime
    └── etc...

"Runtime" のところは、規模が大きければ機能やレイヤごとに分けたりします*1

スクリプトを置くフォルダおよび直下のAssembly Definition File (.asmdef)を作ってくれるエディタ拡張を公開しました。 これを使うと簡単にセットアップできます。[2021.5.7追記]

github.com

Assets外

主にビルドスクリプト*2で以下のように指定しています。いずれも.gitignore(後述)で除外指定されているところ。

  • ビルド成果物は Builds/
  • ログは Logs/
  • テスト結果も Logs/
  • コードカバレッジ*3も Logs/

.gitignore

giboでベースを生成

.gitignoreファイルはgiboで生成したベースに、プロジェクトごとの設定を追加しています。

github.com

私はIDEにJetBrains Riderを使っているので、次のように。

$ gibo dump Unity JetBrains >> .gitignore

これで、以下2つの定義が連結された.gitignoreができます。

Rider以外のIDEを使用する場合は JetBrainsVisualStudioVisualStudioCode に置き換えます。

なお、OSごとの定義はあらかじめグローバルの.gitignoreに設定されている前提ですが、gitに不慣れなメンバーもいる状況では macOSWindows を加えてもいいでしょう。

プロジェクト固有の定義を追加

必要に応じて、.gitignoreに追加していきます。

3rd partyのアセットをすべて除外したいケース

まず極端な例。公開 or 納品するプロジェクトなど、3rd partyのアセットをすべて除外したい場合は、以下のようにMY_PROJECT_NAME以外をすべてトラックしないようにします*4

/Assets/*
!/Assets/MY_PROJECT_NAME*

なお、スラッシュを含めず*を書いているのは、ディレクトリの.metaファイルも含めるためです。

特定のアセットだけ個別に除外したいケース

すべてではない場合、シートライセンスのエディタ拡張など、リポジトリに含めたくないものを個別に指定していきます。例えば、

/Assets/ConsolePro*
/Assets/StompyRobot*

同様に、Assets/下に生成されるファイルでトラックしたくないものも追加していきます。代表的なものは以下。

Play modeテスト実行時に作られて、まれによく残ってしまうScene

/Assets/InitTestScene*.unity*

Automated QA パッケージのRecorded Testing機能実行時に自動生成されるもの [2021.5.7追記]

/Assets/AutomatedQA/Temp*

Build Report Inspector パッケージが自動生成するもの

/Assets/BuildReports*

Unity Recorderパッケージのデフォルト出力先 [2021.7.22追記]

/Recordings/

ML-Agents パッケージがトレーニング時に自動生成するもの [2021.5.7追記]

/Assets/ML-Agents*
/results/

NuGetForUnity がDLLを展開するところ *5 *6 [2021.5.22修正]

/Assets/Packages/
/Assets/Packages.meta

VRCSDK がアップロード用にプロジェクトルートに作るファイル

/*.unitypackage

UniVRM が生成する中間ファイル

/Assets/*.vrm
/Assets/*.vrm.meta

Code Coverage パッケージの設定ファイル *7 *8 /ProjectSettings/Packages/com.unity.testtools.codecoverage/

こちらの設定を入れた.gitignoreは、GitHub - nowsprinting/UnityTestExamples: 『Unity Test Framework完全攻略ガイド 第2版』サンプルコードリポジトリからダウンロードしてお使いいただけます。

$ curl -o .gitignore https://raw.githubusercontent.com/nowsprinting/UnityTestExamples/master/.gitignore

アセット提供側が気をつけたいこと

アセット提供側としても、自身のアセットはAssets/直下に置くのでなくディレクトリを切るべきです(以下MY_ASSET_NAMEとします)。

また、再配布可能な他者のアセットを同梱する場合は、MY_ASSET_NAMEの下ではなく、オリジナルのディレクトリに置くと、他のアセットとの競合を避けられます(利用者側がインポート時に判断できます)。

アセットの設定ファイルをAssets/MY_ASSET_NAME/下に置いてパス指定で読み書きしてしまうと、ユーザがディレクトリを変更できなくなり不便です。 設定は、 Settings Manager パッケージを使用してProjectSettings/下に保存するようにすると使いやすくなります(Unity 2018.3 以降)。

また、UPM (Unity Package Manager) パッケージ形式で作ったアセットをunitypackage形式で配布することもできます。詳しくはこちらの記事を参照してください。[2021.5.7追記]

www.nowsprinting.com

*1:直下にAssembly Definition File (.asmdef) を置いてアセンブリを分ける前提

*2:Makefile老人会なのでMakefile

*3:Code Coverage packageの場合、設定で出力先を変更できます

*4:ただし、エディタ拡張だけでなくランタイムのスクリプトその他も除外するのは、納品には良いのですがCIで不便です。Gitはこの設定で、CIはignore定義が別のUnity Collaborateにするという手もあります

*5:Nuget | Restore Packages で復元可能なため

*6:末尾*を使用していないのは、インストール済みパッケージ情報を保持している/Assets/packages.configはトラッキングしたいため、ケースセンシティブでないOS対策です

*7:0.3.0-previewからここに保存されるようになったが、出力先をフルパスで保存してしまうので除外

*8:0.4.0-preview相対パスで保存されるように修正された