Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unity Package Managerで自作パッケージを配布する方法

Unity Package Managerで自作パッケージを配布する方法

パッケージ開発の初心者でもわかりやすい、Unity Package Managerで自作パッケージを配布する方法についてまとめました!
Github Actionsを使った自動デプロイについても紹介しています。

3dfed36dc1543f0007b5fd46fcb41a47?s=128

yunoda

May 20, 2022
Tweet

More Decks by yunoda

Other Decks in Technology

Transcript

  1. 【初心者向け】Unity Package Managerで 自作パッケージを配布する 2022/05/20 CA.unity #4 yunoda

  2. 自己紹介 株式会社HIKKY所属 VR最大のイベント「バーチャルマーケット」主催 ブラウザメタバースエンジン「VketCloud」のSDK 開発リードエンジニアです yunoda @yunoda_3DCG

  3. UPM向け自作パッケージは敷居が高い....?

  4. 1. UPM対応は簡単 2. 配布がややこしい

  5. UPM対応で最低限必要なこと • package.jsonの追加 • asmdefの設定 • リモートリポジトリへのプッシュ

  6. package.jsonを追加 • Packages以下に置く場合、インスペクターから編 集できます。 • Assets以下に置く場合、テキストエディターから編 集します。

  7. package.jsonの中身 { "name": "com.yunoda.samplesdk", "version": "0.0.1", "displayName": "Sample SDK", "description":

    "This is the sample SDK for how to make the UPM package.", "unity": "2020.3", "unityRelease": "15f2", "keywords": [ "Sample" ], "author": { "name": "yunoda", "email": "yunoda@vrhikky.com", "url": "https://www.hikky.life" } } • package.jsonを置いた階 層以下が、パッケージとし て配布されます。 • パッケージ名は逆ドメイン です。
  8. これだけだとスクリプトを認識しない....

  9. スクリプトを認識させるために、asmdef を配置する

  10. asmdefとは アセンブリを切り分けるパーツ。 コンパイルが速くなる。 引用元:https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html

  11. 右クリック > Create > Assembly Definitionから追加。

  12. asmdefの配置例 SampleSDK ModuleA Runtime Editor yunoda.SampleSDK yunoda.SampleSDK.ModuleA yunoda.SampleSDK.ModuleA.EditorLayout ModuleB ModuleC

    機能ごとにフォルダを切る エディタ拡張は”Editor”に入れる
  13. Name ファイル名と一致させる Allow 'unsafe' Code このasmdef内のみ、unsafeなコード を許可する(プロジェクト全体で unsafeを許可しないで済む) Auto Referenced

    オンにすると、Assembly-Csharpか らの参照を許可する。公開しない場 合はオフにする。 No Engine Reference オンにすると、UnityEngineのアセン ブリを参照しなくなる。 transformや GetComponentといったメソッドが 使えなくなるので注意が必要 。 Override References 対象のasmdefが参照できるdllを制 御。オフにするとどんな dllも参照で きてしまいます。 Root Namespace 新規スクリプト作成時に自動でネームス ペースを追加してくれる。 asmdefの設定項目 }
  14. Define Constraints シンボルを設定することで、コード全体を 条件付きコンパイルできる。 コード全体が#if UNITY_EDITORで囲ま れる感じ。 Assembly Definition References

    【重要!】 参照するasmdefを設定す る。 循環参照になるとエラーがでるので注 意。 Use GUIDs オンならIDで、オフならアセンブリ名で参 照先を記録。asmdefのnameを変更する と参照が切れるので、オンを推奨。 Use GUIDsが、オフの場合 Use GUIDsが、オンの場合
  15. • 基本的にAny Platformで問題なし。 • 動作するプラットフォームを区別したい場合 は、目的のものだけにチェックを入れる。 • エディター拡張を含むasmdefはEditorに チェックを入れる。

  16. Resorces 対象にするアセンブリ Define コード内で定義されるシンボル Expression バージョン Expression outcome 条件式の見本

  17. 循環参照に注意 yunoda.SampleSDK.ModuleA yunoda.SampleSDK.ModuleB

  18. • フォルダ構成を見直す 循環参照の対策 フォルダ構成の参考 • RuntimeとEditorをルート直下に置かない • 機能ごとにフォルダを分ける ⇒ あとでパッケージを分割するときに、干渉せ ずに独立させやすい

  19. • asmrefを追加する 循環参照の対策 配置したフォルダ以下を、指定した asmdefとみなす。

  20. UPM対応で必要なことはこれだけ

  21. 導入したいパッケージのgitURLを入力すると、UPMがパッケージを認識します。 また、リポジトリのルートにpackage.jsonがない場合は、 https://github.com/yunoda-3DCG/Sample-SDK.git?path=Assets/SampleSDK のように、”?pack=~”でルートを指定することもできます。 パッケージをプロジェクトに導入するには

  22. gitURLでの導入には、git環境が必要....

  23. 配布先のユーザー全員が gitを導入しているとは限らない

  24. パッケージの頒布方法 1. パッケージをnpmでデプロイ 2. (ユーザーが)UPMにスコープ付きレ ジストリを登録

  25. npmとは • Node Package Manager • npmは、パッケージ管理ツールの一種 • パッケージの検索、公開、インストールを 管理する

    • Node.jsに付属
  26. npmjsでアカウント登録 https://www.npmjs.com/

  27. Node.jsをインストール https://nodejs.org/ja/download/

  28. npmjsへアップロードする $ npm login Username: # アカウント名 Password: # パスワード

    Email: (this IS public) # 登録したメールアドレス Enter one-time password from your authenticator app: # メールに届く二段階認証パス
  29. $ cd [package.jsonがあるディレクトリ] $ npm publish ------- パッケージ内包物一覧が表示される ------- errorが出ていなければ成功

  30. None
  31. スコープ付きレジストリを登録 Name:このリストでの表示名 URL:パッケージのアップロード先(npmjsならhttps://registry.npmjs.com) Scope(s):パッケージ名

  32. My Registriesに変更

  33. 逆ドメインでパッケージ名まで含めない場合 ex) jp.keijiro 逆ドメインでパッケージ名まで含める場合 ex) jp.keijiro.osc-jack

  34. npmjsの注意点 • 72時間以内なら非公開化($ npm unpublish --force) が可能 • 非公開化すると24時間は再登録できない •

    フリープランだとプライベートなパッケージは作成 不可
  35. npmjs以外の選択肢 • yarn • OpenUPM • Github Packages • Verdaccio

  36. npmjsへのデプロイを自動化する

  37. リポジトリに変更をプッシュ Github Actionsで変更を検知 npmjsにデプロイ 自動化のイメージ

  38. トリガーを設定するymlを追加 name: Publish to npm on: release: types: [created] jobs:

    build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: registry-url: 'https://registry.npmjs.org' - run: npm publish --access=public working-directory: Packages/com.yunoda.samplesdk env: NODE_AUTH_TOKEN: ${{secrets.PERSONAL_TOKEN}} • secrets.PERSONAL_TOKENは後 述のトークン設定が必要 • working-directory: からデプロイ 対象にするディレクトリを指定できま す • ファイル名は自由です • ※このymlではリリースを作るたびに 発火します
  39. アクションを設定したymlは .github/workflowsに追加

  40. アクセストークンを発効

  41. None
  42. • トークンの目的を明確にするため、 Nameに分かりやすい名前を入れるとい いです • Automationを選択すること!

  43. コピーしておく

  44. リポジトリにトークンを追加

  45. ① ②

  46. yml内からアクセスするための変数名 npmjsで発効したアクセストークン

  47. リリースする

  48. アクションが実行されたかを確認 デプロイに失敗 デプロイに成功

  49. パッケージ開発のはまりポイント

  50. インテリセンスが外れる asmdef名を変更したり移動させると、インテリセンスが効かなくなる ことがあります。 【対策】 • フォルダをReimportする • Library > ScriptAsemmblyを削除&プロジェクトを再起動

  51. 特定のコミットを導入したい 特定のコミットに遡る場合は、#ハッシュ値をつける。 ex. https://github.com/yunoda-3DCG/Sample-SDK.git#c60394b9e4a7ae8949f 57a16c2878e0d1482a3f5 特定のリリースに遡る場合は、#リリースタイトルをつけ る。 ex. https://github.com/yunoda-3DCG/Sample-SDK.git#v0.0.1

  52. サンプルシーンの配布 シーンファイルはPackages以下からは 開けません。 サンプルシーンなどを配布する場合 は、アセット以下にロードさせる必要が あります。

  53. package.jsonにサンプルボタンを追加 する。 インスペクターから設定できないので、 テキストエディターから追加してくださ い。 Sample~のようにチルダで隠ぺいする ケースが多いです。サンプルシーンの サイズが大きい場合はパッケージに含 めないほうがいいでしょう。 {

    "name": "com.yunoda.samplesdk", "version": "0.0.1", "displayName": "Sample SDK", --------略-------- "samples": [ { "displayName": "Import Sample Scenes", "path": "Samples" } ] }
  54. 開発場所はどこにする? 1. Packages以下で開発する 2. Add from Diskから開発する 3. Assets以下で開発する

  55. Packages以下で開発する場合 • 埋め込みパッケージ • もっともスタンダード(特別な事情がない限りはこ れがいいです) • package.jsonがインスペクターから編集でき る! •

    UnityPackage化できない....
  56. Add from Diskで開発する場合 • ローカルパッケージ • 別ディレクトリのフォルダをPackages以下にある ように扱う • パッケージのみをリポジトリにアップロードできる

    (=gitURLをシンプルにできる) • パッケージに含めないがgit管理しておきたい ファイルの扱いが難しい • UnityPackage化できない....
  57. Assets以下で開発する場合 • UnityPackage化できる! • package.jsonがインスペクターから編集できな い(バージョン更新がめんどう) • ルーティングが必要になるケースがあります ⇒Assets/~とPackages/~の二通り

  58. まとめ

  59. • UPM対応は難しくない! • npmjsへのアップすると楽 • パッケージ開発に正解はないので、と りあえず作ってみよう!

  60. ありがとうございました!