はじめに
Unityで複数のプロジェクトを進行していると、共通の処理をライブラリとして切り出したくなることがよくある。公開できるものだったらAsset Storeに出せば、まあそれっぽい感じにはなるわけだが、privateな状態でやろうとすると、Unity自体にはそういったパッケージ管理の仕組みはないので1、自作するか、サードパーティのものを使わなくてはいけない。
要件としては、
・gitのレポジトリ(プライベートレポジトリ含む)で公開されているパッケージを簡単にインポートできること
・依存するライブラリのバージョン管理ができること(ローカルのバージョンと最新を比較して、バージョンが上がっていればアップデートするなど)
・MacでもWindowsでも使えること
・パッケージを公開する側で行うべき処理がなるべく少ないこと
であるが、これらを満たすツールとして、node.jsのライブラリ管理で使われるnpmを使うのが便利だという結論に落ち着いたので、その内容を記す。
npmを使ったUnityプロジェクトのパッケージ依存性管理
unity3d-package-syncer というnodeモジュールが公開されているので、それを使う。元々npmには依存ライブラリのバージョン管理機能は備わっているが、このモジュールはnpmが使う node_modules
ディレクトリとUnityのディレクトリを同期してくれる。
以下手順を解説する。
パッケージを公開する側の作業
unity3d-package-syncer は gitのrootに assets
(先頭は大文字でもよい)ディレクトリがあることを前提として、その中身を使用する側のUnityプロジェクトにインポートするため、インポートされる必要のあるファイルは全て assets
以下に突っ込んでおく。
また、npmの習わしに従って、プロジェクトのrootディレクトリにpackage.jsonを配置する必要がある。
中身は最低限nameとversionくらいあれば十分だ。
package.jsonの例
{
"name": "my-unity-package",
"version": "0.0.1"
}
後は githubのプラベートレポジトリなり、private npmなりにプッシュしておけばよい。
https://github.com/rotorz/unity3d-package-example/ で実際の例が見られる。
パッケージを使用する側の作業
使用する側では、package.jsonの dependencies
の項目に unity3d-package-syncer
と使用したいパッケージの名前とバージョン(npmで公開している場合)もしくはチェクアウト先のURLを追加する。以下の例では
https://github.com/rotorz/unity3d-package-example/ で公開されているunityパッケージを追加している。
{
"name": "my-unity-project",
"version": "0.0.1",
"description": "",
"scripts": {
"sync": "unity3d--sync"
},
"dependencies": {
"unity3d-package-syncer": "^1.0.1",
"unity3d-package-example": "git@github.com:rotorz/unity3d-package-example.git"
}
}
このpackage.jsonをUnityのrootディレクトリ(Assetsディレクトリがあるディレクトリ)に配置し、以下のコマンドを実行する。
$ npm install --save unity3d-package-syncer # unity3d-package-syncerをインストール
$ npm run sync
これでunity3d-package-exampleの中身がUnityのAssetsディレクトリにインポートされたはずだ。
以降は npm run sync
を実行するだけで、自動的に最新にアップデートされる。
まとめ
npm は nodeのプロジェクト以外で使っても意外と便利。
-
https://unity3d.com/jp/unity/beta/unity2017.2.0b2 によると Unity 2017.2.0から順次 Package Managerの仕組みが導入されるようですが、2017年10月15日現在は使用できません。 ↩