Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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": "[email protected]", "url": "https://www.hikky.life" } } ● package.jsonを置いた階 層以下が、パッケージとし て配布されます。 ● パッケージ名は逆ドメイン です。

Slide 8

Slide 8 text

これだけだとスクリプトを認識しない....

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

asmdefの配置例 SampleSDK ModuleA Runtime Editor yunoda.SampleSDK yunoda.SampleSDK.ModuleA yunoda.SampleSDK.ModuleA.EditorLayout ModuleB ModuleC 機能ごとにフォルダを切る エディタ拡張は”Editor”に入れる

Slide 13

Slide 13 text

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の設定項目 }

Slide 14

Slide 14 text

Define Constraints シンボルを設定することで、コード全体を 条件付きコンパイルできる。 コード全体が#if UNITY_EDITORで囲ま れる感じ。 Assembly Definition References 【重要!】 参照するasmdefを設定す る。 循環参照になるとエラーがでるので注 意。 Use GUIDs オンならIDで、オフならアセンブリ名で参 照先を記録。asmdefのnameを変更する と参照が切れるので、オンを推奨。 Use GUIDsが、オフの場合 Use GUIDsが、オンの場合

Slide 15

Slide 15 text

● 基本的にAny Platformで問題なし。 ● 動作するプラットフォームを区別したい場合 は、目的のものだけにチェックを入れる。 ● エディター拡張を含むasmdefはEditorに チェックを入れる。

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

npmjsでアカウント登録 https://www.npmjs.com/

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

npmjsへアップロードする $ npm login Username: # アカウント名 Password: # パスワード Email: (this IS public) # 登録したメールアドレス Enter one-time password from your authenticator app: # メールに届く二段階認証パス

Slide 29

Slide 29 text

$ cd [package.jsonがあるディレクトリ] $ npm publish ------- パッケージ内包物一覧が表示される ------- errorが出ていなければ成功

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

My Registriesに変更

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

npmjsの注意点 ● 72時間以内なら非公開化($ npm unpublish --force) が可能 ● 非公開化すると24時間は再登録できない ● フリープランだとプライベートなパッケージは作成 不可

Slide 35

Slide 35 text

npmjs以外の選択肢 ● yarn ● OpenUPM ● Github Packages ● Verdaccio

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

トリガーを設定する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ではリリースを作るたびに 発火します

Slide 39

Slide 39 text

アクションを設定したymlは .github/workflowsに追加

Slide 40

Slide 40 text

アクセストークンを発効

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

コピーしておく

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

① ②

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

リリースする

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

package.jsonにサンプルボタンを追加 する。 インスペクターから設定できないので、 テキストエディターから追加してくださ い。 Sample~のようにチルダで隠ぺいする ケースが多いです。サンプルシーンの サイズが大きい場合はパッケージに含 めないほうがいいでしょう。 { "name": "com.yunoda.samplesdk", "version": "0.0.1", "displayName": "Sample SDK", --------略-------- "samples": [ { "displayName": "Import Sample Scenes", "path": "Samples" } ] }

Slide 54

Slide 54 text

開発場所はどこにする? 1. Packages以下で開発する 2. Add from Diskから開発する 3. Assets以下で開発する

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

Add from Diskで開発する場合 ● ローカルパッケージ ● 別ディレクトリのフォルダをPackages以下にある ように扱う ● パッケージのみをリポジトリにアップロードできる (=gitURLをシンプルにできる) ● パッケージに含めないがgit管理しておきたい ファイルの扱いが難しい ● UnityPackage化できない....

Slide 57

Slide 57 text

Assets以下で開発する場合 ● UnityPackage化できる! ● package.jsonがインスペクターから編集できな い(バージョン更新がめんどう) ● ルーティングが必要になるケースがあります ⇒Assets/~とPackages/~の二通り

Slide 58

Slide 58 text

まとめ

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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