blogSynamonでは、VR空間に複数人が同時に接続可能で、多彩な標準機能を搭載している『NEUTRANS』という独自のVRシステムを開発しています。ビジネスなどの現場でも使いやすいよう、独自の機能や技術を日々追究しています。このブログでは、『NEUTRANS』開発の裏側にあるVR技術と、それを支えるUnityやC#といった技術の話を書いていきます。Managerこんにちは、株式会社Synamonのエンジニアの岡村(@Sokuhatiku)です。前回、任意のフォルダにPackage.jsonを定義することで、ローカルパス参照でUnityPackageManagerに載せることが出来る方法を書きました。その方法はローカルのファイルパスを直接指定してパッケージとして扱うというもので、バージョン管理やチーム内での共有のしやすさに難がありました。今回、その部分の解決策を見つけました。それと近いタイミングで、@kohki_nakajiさんに前回の記事を紹介して頂けて、さらに、今回の記事にも興味があると言って頂けたため、手順を纏めてみました。2018年8月14日おことわり※今回はUnityとnpmの狭間に自作パッケージを無理やりねじ込む所に焦点を当てている為、LAN内に公開する方法には触れていません。※今回紹介する方法はハックです。公式サポートされている機能ではないので、今後情報が古くなったり、利用できなくなる可能性が大いにあります。自作パッケージレジストリ前回、UnityPackageManager(以下、upm)はnpmの仕組みを利用しているという所まで調査できていました。upmとnpmのもつjsonを比べてみると非常によく似ていた為、npmのレジストリを立て、Nodeの代わりにUnityPackageを置けば、そこからダウンロード出来るのではないかという予想を立てました。そこで、Verdaccioというツールを利用して、ローカル環境にnpmレジストリを立ててみたところ、いくつかハマりどころがあったものの、最終的には上手くいきました。github.comVerdaccioは、npmのレジストリを好きな場所に立てる事ができるツールです。uplinkとして他のレジストリを設定した場合、自身が持っていないパッケージをそちらからダウンロードすることが出来るようになります。ハマりどころ先にハマりどころを紹介しておきます。upmはポート付きアドレスを認識しないVerdaccioを立てると4873番ポートで起動するのですが、そのままlocalhost:4873をUnityにレジストリとして設定しても、パッケージの読み込みに失敗します。簡単な解決方法は、verdaccio側に80番ポートで待受させることです。upmはスコープを認識しないnpmには@{ユーザー名}/{名前}というパッケージ名にする事でパッケージ名の重複を防ぐ、スコープという機能がありますが、これをupmは認識しません。不正なパッケージ名として弾かれてしまいます。VerdaccioのuplinkにUnityのレジストリを登録しないとプロジェクトオープンに失敗するUnityはプロジェクトを開く際に、パッケージの問い合わせを行います。その際、Unity側のパッケージが取得できなければ、ロード失敗になります。VerdaccioにUnityのレジストリを登録しているとパッケージのアップロードに失敗するVerdaccioは、パッケージのアップロード時に既存のパッケージを確認するのですが、Unityのレジストリが返してくるjsonを解釈できないらしく、エラーが出てアップロードが止まってしまいます。今回はその解決策として、unity公式のパッケージ名に必ず付いている、「com.unity」ドメインにのみuplinkを設定することで対処しています。(なので、com.unityでパッケージをアップロードしようとすると失敗します。GUIのAllタブに表示されるパッケージ一覧はどうやら別の手段で取得しているらしく、自作パッケージをアップロードしてもリストに表示されません。インストールにはmanifest.jsonを弄る必要があります。...さあ、これらを踏まえてレジストリを立てましょう。レジストリを立てる今回はnpmの事を知らない人向けに(僕もよく知らなかったので...)インストール方法から書いていこうと思います。環境はWindows10です。Verdaccioはnpmからインストールしますので、まずnpmを入手する必要があります。npmはNode.jsのパッケージマネージャーであり、Node.jsをインストールすると付いてきます。Node.jsNode.jsのインストールが終わったらnpmコマンドが使えるようになるので、コマンドプロンプトを開いてverdaccioをインストールします。verdaccionpmの提供するアプリ(Node)はデフォルトだとコマンドを叩いたディレクトリにインストールされますが、今回は-g引数を使い、PCのどこからでも触れるようグローバルインストールを行います。インストールが終わったら起動します。verdaccio何も設定をいじっていない状態なので、localhost:4873でアクセス出来るはずです。設定の変更Verdaccioを一度立ち上げたことで設定ファイルが作成されます。UnityPackageを配布するために、設定を変更しましょう。一度Verdaccioを落とします。設定ファイルは、%APPDATA%\verdaccio\config.yamlに生成されているはずです。ファイルを開き、次のように書き換えます。Unitypackage(リビジョンでどのように書き換えたか分かります。)完了したら、もう一度Verdaccioを起動しましょう。設定ファイルでポートを変更したので、今度はポート無しのlocalhostでアクセスできるようになります。次にアップロードするためのユーザーを作成します。http://localhost/User名、Password、Emailアドレスを順番に聞かれるので設定してください。このユーザー情報はVerdaccioのwebページにサインインするのに使うと共に、Verdaccioにパッケージをアップロードする際にも自動的に使用されます。パッケージのアップロードパッケージの作り方に関しては、前回の記事を参照してください。blogパッケージを作ったら、package.jsonのあるディレクトリに移動して、以下のコマンドを叩きます。"http://localhost/"これでパッケージのアップロードは完了です。後は、作ったパッケージをインポートしたいプロジェクトの、Packages\manifest.jsonを設定します。"http://localhost/"を追加してください。このようになるはずです(dependenciesの中身はプロジェクトによって異なります。"0.8.2"の部分を自作パッケージの名前とバージョンに変換してください。あと、"registry"の前のコンマを忘れずに!)以上です。これでUnityを起動すると、パッケージが読み込まれているはずです。バージョンを変えて複数回アップロードすると、UI上からバージョン切替も出来ます。2018年8月5日ちなみにアップロードしたパッケージの削除は以下のコマンドです。"http://localhost/"あとがき今回、自作パッケージのバージョン管理や、バージョン名でインストール(=ローカルにファイルをコピーしてくる必要が無い)まで解決することが出来ましたが、まだ問題点があります。個人的に大きいのはパッケージ間の依存関係を解決できない事です。パッケージ内のdependencyに他のパッケージを指定してもロードして貰えません。ここはupmの内部挙動のため、外からハックして解決するのは難しいのでは、と感じています。いえ、今回で、チーム内で前提アセットを配布+git管理するといった使い方はかなりやりやすくなったと思います。Unityの公式対応が待てない方は是非試してみてください。上手くいかなかったり、もっといい方法があれば是非教えてください。株式会社Synamonでエンジニアをしており...2019-05-21UnityアプリをRiftからGo/Questへ移植する人向けのTips集こんにちは。2アップデート手順覚書こんにちは。株式会社Synamonのエンジニアの岡村(@Sokuhatiku...2018-09-15LipSyncをDIYする(後編)こんにちは。株式会社Synamonでエンジニアをしております、渡...2018-09-15LipSyncをDIYする(前編)こんにちは。2アップデート手順覚書LipSyncをDIYする(後編)月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。