📱

Lightship ARDK 3.0 で、使用する Subsystem をもう少し自由に切り替えてみるメモ

2023/11/03に公開

Depth以外の項目を自由に切り替えたい

この度のメジャーアップデート(ver.3.0.0)により、ARFoundationと併用できるようになった「Lightship ARDK」。
https://nianticlabs.com/news/lightship3
https://zenn.dev/bison/articles/36c3f6dbe64027

「Prefer LiDAR if Available(LiDAR搭載端末ではLiDARの計測した深度を優先する)」 といった便利な設定項目もついていて嬉しいのですが、残念ながらDepth以外の項目については「Enabled」のトグルしかなく、「ネイティブのSubsystemを使用するか、ARDKのSubsystemを使用するか」 の二択でしか切り替えられません。

そんな中、アプリを作っていたら 「基本はネイティブのXRMeshSubsystem、ネイティブのサポートがない場合はARDKのXRMeshSubsystemを使用したい」 という状況に陥ったので、(力技だけど)Package本体に少し修正を加えて対処しました。その対処法と該当箇所を備忘録程度にメモ。

やり方

修正対象のコード

Niantic Lightship AR Plugin に含まれるNativeLoaderHelper.csの中でXRSemanticsSubsystem XRPersistentAnchorSubsystem XROcclusionSubsystem XRScanningSubsystem XRMeshSubsystemなどの切り替えを行っているようなので、このあたりを修正します。

NativeLoaderHelper.cs(抜粋)
if (settings.UseLightshipMeshing)
{
  // our C# "ghost" creates our meshing module to listen to Unity meshing lifecycle callbacks
  loader.DestroySubsystem<XRMeshSubsystem>();
  var meshingProvider = new LightshipMeshingProvider(LightshipUnityContext.UnityContextHandle);
  // Create Unity integrated subsystem
  loader.CreateSubsystem<XRMeshSubsystemDescriptor, XRMeshSubsystem>(_meshingSubsystemDescriptors,
    "LightshipMeshing");
}

PackageCacheからPackagesへコピーしてカスタムパッケージにする

NativeLoaderHelper.csはデフォルトではPackageCacheフォルダ以下にあるのですが、PackageCacheフォルダにあるファイルは、ふとしたタイミングでグローバルキャッシュから復元されて元に戻ってしまうという仕様があるようです。
https://someiyoshino.info/entry/2021/12/26/180355
そのため、Packagesフォルダにコピーして、カスタム可能にしてから修正する必要があります。

  1. [Project]/Library/PackageCache/com.nianticlabs.lightship@xxxxx をコピーし
  2. [Project]/Packages/com.nianticlabs.lightship として配置して
  3. Package Managerで確認しCustomと表示されていたら成功です。

コードを修正

該当箇所を修正します。
今回の場合は、loader.GetLoadedSubsystem<XRMeshSubsystem>()でロード済みのXRMeshSubsystemを取得し、その有無を確認することで条件分岐させました。

NativeLoaderHelper.cs(修正後)
if (settings.UseLightshipMeshing && loader.GetLoadedSubsystem<XRMeshSubsystem>() == null)
{
  // our C# "ghost" creates our meshing module to listen to Unity meshing lifecycle callbacks
  loader.DestroySubsystem<XRMeshSubsystem>();
  var meshingProvider = new LightshipMeshingProvider(LightshipUnityContext.UnityContextHandle);
  // Create Unity integrated subsystem
  loader.CreateSubsystem<XRMeshSubsystemDescriptor, XRMeshSubsystem>(_meshingSubsystemDescriptors,
    "LightshipMeshing");
}

これで無事、 「基本はネイティブのXRMeshSubsystem、ネイティブのサポートがない場合はARDKのXRMeshSubsystemを使用」 という形で切り替えられるようになりました!

おわり

その場しのぎの対症療法ではありますが。
誰かの参考になれば!🙏

Discussion