Lightship ARDK 3.0 で、使用する Subsystem をもう少し自由に切り替えてみるメモ
Depth以外の項目を自由に切り替えたい
この度のメジャーアップデート(ver.3.0.0)により、ARFoundationと併用できるようになった「Lightship ARDK」。
「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
などの切り替えを行っているようなので、このあたりを修正します。
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
フォルダにあるファイルは、ふとしたタイミングでグローバルキャッシュから復元されて元に戻ってしまうという仕様があるようです。
そのため、Packages
フォルダにコピーして、カスタム可能にしてから修正する必要があります。
-
[Project]/Library/PackageCache/com.nianticlabs.lightship@xxxxx
をコピーし -
[Project]/Packages/com.nianticlabs.lightship
として配置して - Package Managerで確認し
Custom
と表示されていたら成功です。
コードを修正
該当箇所を修正します。
今回の場合は、loader.GetLoadedSubsystem<XRMeshSubsystem>()
でロード済みのXRMeshSubsystem
を取得し、その有無を確認することで条件分岐させました。
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