やらなイカ?

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

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

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

ディレクトリ構成

Assets/下

自分で作るものはAssets/下にディレクトリ (Folder) を作り、そこにまとめています。

  • Assets
    • MY_PROJECT_NAME
      • Scripts
      • Tests
      • とか

Editor/はMY_PROJECT_NAME/の直下だったり、MY_PROJECT_NAME/Scripts/下だったり毎回不安定*1

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に追加していきます。

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

/Assets/*
!/Assets/MY_PROJECT_NAME*

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

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

/Assets/ConsolePro*

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

Play Mode tests実行時に作られて、まれによく残ってしまうScene

/Assets/InitTestScene*.unity*

Build Report Inspector

/Assets/BuildReports*

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

/*.unitypackage

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

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

Code Coverage packageの設定ファイル*5

/ProjectSettings/Packages/com.unity.testtools.codecoverage/

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

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

また、再配布可能な他者のアセットを同梱する場合は、MY_ASSET_NAMEの下ではなく、オリジナルのディレクトリに置くと、他のアセットとの競合を避けられます。

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

*1:Editor/は、Assets/直下でなくどこにあってもEditor扱いされます

*2:Makefile老人会なのでMakefile

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

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

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