ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】自作Package を Unity Package Manager と連携させる

今回は自作Package を Unity Package Manager (upm) に対応させる方法をまとめました。

Packageを作成
  • まずはPackageフォルダを作成します。今回はPackage名を「test-upm」とします。
    f:id:aki517:20200126213842p:plain

  • Packageフォルダ直下に package.json を作成します。
    f:id:aki517:20200126213925p:plain

  • 必須項目は name, version のみです。他項目の詳細はこちら

{
    "name": "jp.goisagi.test-upm",
    "displayName": "test-upm",
    "version": "0.0.1",
    "unity": "2019.3",
    "description": "Description for this package."
}
  • 次に検証用Unityプロジェクトを作ります。
    今回は名前を「test-proj」として、Packageと同じ階層に配置します。
    f:id:aki517:20200127083119p:plain

  • test-proj > Packages > manifest.json に自作PackageのPackage名とパスを追加します。
    パスは Packagesフォルダからの相対パスになります。

  "dependencies": {
    "jp.goisagi.test-upm": "file:../../test-upm"
  }
  • 検証用Unityプロジェクトを起動すると自作Packageの読込が行われます。
    以下のようにPackageが追加されていればOKです。
    f:id:aki517:20200127212002p:plain

  • 念のため、Package Manager に追加されているかも確認します。

  • 次にスクリプト配置用のフォルダを作成します。フォルダ構成はUnity標準のPackageに合わせて Scripts > Runtime で作成します。
    f:id:aki517:20200127212626p:plain

  • Assembly Definition File を追加します。ProjectビューからRuntimeフォルダを右クリック > Create > Assembly Definition で asmfファイルを作成します。
    f:id:aki517:20200127212821p:plain

  • 次にPackage用のcsファイルを作成します。
    f:id:aki517:20200127212932p:plain

  • 最後にcsファイルをInspectorビューから確認して Assembly Information に先程のasmfファイルが設定されてるのを確認します。
    f:id:aki517:20200127213932p:plain

  • Package作成の大まかな流れは以上となります。他のUnityプロジェクトにインポートしたい場合は同様に対象UnityプロジェクトのPackages/manifest.json に自作Packageのパスを設定するだけです。

GitHub連携

自作PackageをGitHubと連携する方法です。

GitHubに登録

これは対象Package を任意のリポジトリにpushするだけです。今回の場合は「test-upm」以下が対象となります。

また、バージョンに応じてインポートをしたい場合は以下のようにタグを追加しておきます。

git tag 1.0.3
git push --tags
GitHubからインポート

インポートは対象Unityプロジェクトの Packages/manifest.jsonGitHubのURLを記述するだけです。

  "dependencies": {
    "jp.goisagi.test-upm": "https://github.com/aki517/test-upm.git"
  }

バージョンを指定する場合は以下になります。

  "dependencies": {
    "jp.goisagi.test-upm": "https://github.com/aki517/test-upm.git#0.0.1"
  }
サンプルの追加

Unity2019.1以降からサンプルの追加が可能になりました。

  • サンプルを配置するルートフォルダを作成します。
    必ず末尾に「~」を付けてください。 f:id:aki517:20200127221720p:plain

  • 次に各サンプルのフォルダを作成して、サンプル用のスクリプト、シーンを置きます。
    f:id:aki517:20200127221738p:plain

  • package.json に以下のようにサンプル設定を追加します。(サンプルは複数設定可能です)

{
    "samples": [
        {
            "displayName": "Sample1",
            "description": "Description for sample 1",
            "path": "Samples~/Sample1"
        },
        {
            "displayName": "Sample2",
            "description": "Description for sample 2",
            "path": "Samples~/Sample2"
        }
    ]
}
  • Package Manager に「Import into Project」ボタンが追加されていればOKです。 f:id:aki517:20200127222457p:plain

  • サンプルをインポートすると Assets 以下に配置されます。バージョン分けしてくれるのは便利ですね ^_^
    f:id:aki517:20200127222515p:plain

依存関係について

自作Packageをインポート時に依存するPackageも一緒にインポートすることできます。

設定は package.jsondependencies を追加して、関係するPackageとバージョンを記述します。

{
    "name": "jp.goisagi.test-upm",
    "displayName": "test-upm",
    "version": "0.0.1",
    "unity": "2019.3",
    "description": "Description for this package."
    "dependencies": {
        "com.unity.textmeshpro": "2.0.0"
    }
}

ただし、こちらはUnity標準で公開されているPackageのみです。現時点では自作Packageを依存関係に設定できないようです。。フォーラムにも上がってます。

一般的な解決策は自前のUnity Package Serverを立て、自作Packageを追加・公開になります。
medium.com

もしくはこちらのPackageをインストールすれば自作Packageの依存関係をある程度は解決できますが、依存関係を解決するアルゴリズムがUnity標準の機能とは異なるため目的のPackageがインストールされない場合があるのと、都度このPackageをUnityプロジェクトにインポートする必要があります ^_^;
github.com

おまけ

ローカルの自作Packageを組込み先の Visual Studio プロジェクトで編集したい場合、 Unity > Preferences > External Tools にある Local packages にチェックを入れます。
f:id:aki517:20210214211706p:plain

参考

Unity - Manual: Creating custom packages
UPM: How to make a custom package · GitHub
Samples in Packages - Manual Setup - Unity Forum