すぎしーのXRと3DCG

主にXR, Unity, 3DCG系の記事を投稿していきます。

【Unity】OculusIntegrationがPackageManager対応しやすくなりました!

概要

Oculus Integration SDK がいつの間にかUnity Package Managerに対応させやすくなっていたのでちょっと紹介します。

巷では、Oculus Quest向けのSplash Screen が指定可能になったことで話題でしたが、何気にPackageManager対応しやすくなったのも見過ごせないと思っています!

※Splash Screenについての公式ツイート

環境

  • Oculus Integration SDK 28.0 (1.60) 以降

追記

  • 2022/10/12
    • Meta公式によるPackage Manager対応

Meta公式によるPackage Manager対応 (2022/10/12 追記)

Meta公式からMeta XR Integration (旧Oculus Integration) v44 から Pacakge Managerによるインストール方法がアナウンスされています。

Import Individual SDKs from Unity Package Manager | Oculus Developers

レジストリhttps://npm.developer.oculus.com/ とのこと。

packages are hosted on Meta’s scoped registry: https://npm.developer.oculus.com/. 

現時点では基本機能 (Oculus/VR) のみのようですが、順次対応されるようです。

How Unity Package Manager Can Help You Manage Integration SDKs

Meta Quest Proの発表もあったので、対応が進められたのかもしれません。

こちらの記事を公開してから1年4ヶ月は経ってるので、あまり「そのうち」ではありませんでしたね(笑)

PackageManager対応方法

1. Oculus Integration パッケージ化専用のUnityプロジェクトを作成

  • パッケージ用のUnityのプロジェクトを作成

2. Oculus Integrationをインストール

  • Asset Store or アーカイブページ からOculusIntegrationをダウンロードおよびインストール
    • 必要なアセットにチェックを入れて "Import"

※今回は基本機能のみをインストールするため Oculus/VRのみ指定

3. gitignoreにOculus向け設定ファイルを追加

  • commitから除外するために.gitignoreにOculus向け設定ファイルを追加
    • パッケージ対応したOculusIntegrationを取り込むと自動的に生成されます
    • パッケージ側からは除外しておきましょう
# Oculus Assets
/[Aa]ssets/[Oo]culus/OculusProjectConfig.asset
/[Aa]ssets/[Oo]culus/OculusProjectConfig.asset.meta
/[Aa]ssets/Resources/OVRPlatformToolSettings.asset
/[Aa]ssets/Resources/OVRPlatformToolSettings.asset.meta

4. package.json を作成

  • Package Managerに対応させるため Assets/Oculus/package.json を作成
    • nameなどはプロジェクトに合わせて適宜修正してください
{
    "name": "com.tsgcpp.oculusintegration",
    "version": "1.61.0",
    "displayName": "OculusIntegration",
    "description": "The Oculus Integration SDK (private).",
    "unity": "2019.4",
    "keywords": [
        "oculus"
    ],
    "dependencies": {}
}

5. Assets/Oculusをcommit

  • .gitignore を commit
  • Assets/OculusAssets/Oculus.meta をcommit
    • package.jsonも併せてcommit

6. Private用のGitリポジトリにpush (任意)

※Publicにすると再配布になるため注意が必要

  • Private用のGitリポジトリにpushしましょう
    • Gitリポジトリにpushすることで、Git経由でPackage Managerで取り込みが可能となります

フォルダ構成

パッケージの取り込み方

  • 通常のPackageManagerでの取り込みと同様となります

Add package from git URL...

  • https://<git url>/<org>/<repository>.git?path=Assets/Oculus#<tag or branch> のように指定
    • i.e. https://github.com/tsgcpp/OculusIntegration.git?path=Assets/Oculus#1.61.0 (リポジトリ名: OculusIntegration, タグ名: 1.61.0 の場合)

Add package from disk...

  • Assets/Oculus/package.json を指定

取り込み後に設定ファイルが生成される



対応しやすくなった理由

そもそもなぜ対応が難しかったのか

Oculus Integration SDK 27.0 (1.59) 以前の話となります

  • 原因は Assets/Oculus/VR/Editor/OVRProjectConfig.cs
    • OculusProjectConfig.asset(Oculus向けの設定アセット) を自動生成するEditorスクリプト
  • 自動生成するパスの指定方法に問題があり、PackageManager経由で取り込んだ場合にエラーが発生
    • 端的に言うとOVRProjectConfig.csの親の親フォルダが生成先
  • PackageManagerで取り込んだ場合はAssets/以下ではなく、Packages/以下が生成対象となってしまっている
    • Packages/com.tsgcpp.oculusintegration/VR/Editor/OVRProjectConfig.cs に配置されているため
    • AssetDatabase.CreateAssetでScriptableObject(OVRProjectConfig)の生成先にPackages/以下を指定するとエラー (Assets/以下ではない場合にエラー)

暫定対応

Oculus Integration SDK 27.0 (1.59) 以前の話となります

  • Assets/Oculus以下のEditorフォルダすべてをunitypackageにExport
  • Assets/Oculus以下にあるEditorフォルダ以下をすべて削除
  • OculusIntegrationを使用するメインプロジェクトに上記unitypackageでEditor群を取り込み
    • OculusProjectConfig.assetを使用するにはEditor以下のスクリプトが必要なため

上記の方法で暫定的に対応することは可能でした。
ただ、Editorスクリプトのみ直接取り込む形となるため、結構残念な感じになってました。

PackageManagerで取り込まれた場合の考慮が28.0以降で追加

  • SDK 28.0 (1.60) で以下の考慮が追加されました
  • OVRPluginUpdaterStub.IsInsidePackageDistributionassetPath.StartsWith("Packages/" の判定を実施
  • Packages/以下だった場合は、Assets/Oculus/OculusProjectConfig.asset を生成先に変更
    private static string GetOculusProjectConfigAssetPath()
    {
        ...

        if (OVRPluginUpdaterStub.IsInsidePackageDistribution())
        {

つまり、PackageManagerで取り込まれた場合でもAssets/Oculus以下に設定ファイルが生成されるようになりました。
これがOculus IntegrationがPackageManager対応しやすくなった理由です!

PackageManager対応するメリット

「別に直接プロジェクトに取り込んでもよくない???」って思った方もいらっしゃると思いますので、
メリットについても補足しようと思います。

  • OculusIntegrationを管理するGitリポジトリを分割可能
    • GitHubなどの容量制限にひっかかるのを回避可能
    • OculusIntegrationは単体でもかなり容量が大きく、追加するアセットによってはあっさり100MBを超えます
    • Assets/Oculus/VRのみでも60MBあります (29.0の場合)
  • アセットのバージョン管理と更新が容易
    • Package Managerでアセットを取り込むと更新が容易になります(バージョンを更新するのみ)
      • Asset Store(unitypackage)で取り込んだ場合、一度アセットをすべて削除する必要がある場合が多い
    • hookされるEditorスクリプトがあるため再起動はどちらにしても推奨

雑感

今回はOculus関連にテーマを絞ってみました。
Oculus Quest2がかなり売れているので、OculusIntegrationの更新もかなり加速している感じがします。

もしかしたら、そのうちUnity Package ManagerでOculus Integrationが提供されるのかもしれませんね。

Unity向けだけじゃなくて、Unreal向けも加速しているような気がします。
Splash Screenも追加できるようになったので、これを機に追加しても良さそうですね。

みなさんのOculus向けアプリケーション開発の助けになれば幸いです。
それでは~。