Synamon’s Engineer blog

Synamonでは、VR空間に複数人が同時に接続可能で、多彩な標準機能を搭載している『NEUTRANS』という独自のVRシステムを開発しています。ビジネスなどの現場でも使いやすいよう、独自の機能や技術を日々追究しています。このブログでは、『NEUTRANS』開発の裏側にあるVR技術と、それを支えるUnityやC#といった技術の話を書いていきます。

Unity Package Managerに自作Packageを登録する方法

Unity2018で、パッケージマネージャという仕組みが新しく搭載されました。後々、AssetStoreで販売されているアセットが全てパッケージマネージャに対応するという展望がUnite2018にて語られています。詳しい仕様を調べてみた所、カスタムパッケージの読み込みが可能であるようなので、新規プロジェクトを作成してパッケージ化し、やり方をまとめてみました。

Package Managerとは?

今まで、外製のAssetをプロジェクトに取り込む際は、.unitypackage形式のパッケージファイルをプロジェクトにドラッグ&ドロップする方法が一般的でした。Assetをファイルとして扱え、展開が自動で行われる為、共有の利便性が高いのが特徴です。

一方で、バージョン管理の難しさや、AssetStoreから入手したAssetがProjectビューを散らかし、どれがどのパッケージのファイルなのか分からなくなる、などの欠点がありました。 特にPluginsフォルダは荒れやすく、アンインストール時に苦戦した経験のある方は多いと思います。

Package Managerは、外部のAssetを参照という形で保持します。プロジェクトのルートフォルダ上に"Packages"フォルダが作成され、その中のmanifest.jsonというファイルがパッケージの名前とバージョンを管理します。

これにより、Asset同士が完全に切り分けられ、Project内にそのプロジェクトで作成したファイルのみが入るほか、パッケージにバージョンや依存関係を定義することが出来るので、非常に手軽にパッケージ管理が行えるようになります。

このような仕組みはパッケージ管理システムと呼ばれ、VisualStudioやAtomの拡張機能、RubyGemsやnpm等で広く使われています。(Unity Package Managerはnpmを利用しているそうです。)

パッケージ管理システム - Wikipedia

Custom Packageの導入方法

カスタムパッケージの導入はまだ裏技的な方法であることを踏まえ、導入は自己責任でお願いします。

より詳しい情報が公式のマニュアルに記載されています。(英語)

Unity Package Manager | Package Manager UI website

また、カスタムパッケージの作り方は以下の情報を参考にしました。(英語)

UPM: How to make a custom package · GitHub

作り方

パッケージ化したいフォルダ(以下、パッケージ)と、パッケージをインポートしたいプロジェクト(以下、プロジェクト)を用意します。パッケージは別のUnityプロジェクトのAssetフォルダ以下でも大丈夫です。

まず、パッケージ内にAssembly Definitionを定義します。

パッケージ内のスクリプトがアセンブリの外に出ているとスクリプトが読み込まれなくなってしまう為、全てのスクリプトを別アセンブリに退避する必要があります。

次に、パッケージ内に、「package.json」を追加します。

package.jsonの記述例は以下のとおりです。

{
    "name": "com.hoge.mypackage",
    "displayName": "MyPackage",
    "version": "1.0.0",
    "unity": "2018.1",
    "description": "This is my hogehoge Package.",
    "keywords": ["Script", "Test"],
    "category": "Controllers",
    "dependencies": { }
}
パラメータ名 説明
"name" パッケージの名前(システム識別用)。
"displayName" 人が読むための名前。
"version" パッケージのバージョン。
"unity" 対応するUnityのバージョン。
"description" 人が読むためのパッケージの説明。
"keywords" 恐らく検索用。(現在は未使用)
"category" 恐らく検索用。(現在は未使用)
"dependencies" 依存するパッケージ名とそのバージョンを、"com.hoge.mypackage": "1.0.0"のように書く。 バージョン内に"exclude"と記入することでパッケージのインストールをさせないように出来るほか、ファイルパスを入力することでローカルファイルに依存させることが出来る。

package.jsonを作成することで、そのフォルダがパッケージとして認識されるようになります。次はプロジェクトにインポートするのですが、2018年5月12日現在、自作したパッケージをUnity内のPackageManagerウィンドウを利用してインポートする事は出来ないので、 手動でパッケージ管理ファイルを書き換える必要があります。

プロジェクトをUnity2018で開いたことがある場合、Assetsと同じ階層にPackagesというフォルダがあるので、その中にある、「manifest.json」を編集します。

manifest.jsonの記述例は以下のとおりです。

{
    "dependencies": {
        "com.hoge.mypackage": "file:../../CustomPackage"
    }
}
パラメータ名 説明
"dependencies" プロジェクトが依存するパッケージの名前とバージョン。バージョン欄にパッケージフォルダへのパスを書くことで、ローカルのパッケージを取り込むことが出来る。

manifest.jsonを保存し、Unityプロジェクトを開くと、パッケージがインストールされているはずです。PackageManagerウィンドウにpackage.jsonに書いた情報が表示されていれば成功です。

スクリプト以外のアセットの利用方法

パッケージの内容はProjectビューに表示されないという特徴のため、Prefab含め、スクリプト以外のパッケージ内のAssetを直接利用する事は出来ません。 取り出す方法としては

  • スクリプトファイルのインスペクタに表示されるDefault referencesにアタッチする。
  • Resourcesフォルダに入れてResources.Load()する。
  • エディタ拡張でAssetDatabaseから取ってくる。
  • その場合、"Assets/"ではなく、"Packages/[com.hoge.mypackage]/"以下を指定してやるとロード出来る。

が考えられます。

Unity2018.2(beta)から、パッケージの内容が見られるようになりました!

Unity 2018.2からPackagesから取得したパッケージがProjectビューに映るようになり、ECSの内部コードも確認できるようになりました。

【Unity】ECSのメモリレイアウトとその周辺 - テラシュールブログ

まとめ

UnityPackageやAssetStoreから持ってきたアセットはProjectを汚すのが常でした。Pluginsに全てのファイルを入れてくれているアセットもあったりましたが、不意の展開で迷子になってしまったり、内部でしか使わないファイルがずらずら並ぶのが見えたりしてしまうので、パッケージマネージャの仕組みは素晴らしいと思います。

スクリプト以外のアセットをどうするのかとか、社内ツールをパッケージ化した時バージョン合わせをどうするかとか、不便な部分はまだ多いですが、今後アップデートで改善されていくことでしょう。 現状はまだゴリゴリ導入するには怖い部分も多いですが、触れておくと正式対応時にスムーズに移行できるかもしれません。