Zenn
Closed60

AndroidおよびAndroidXRのお勉強

にー兄さんにー兄さん

概要

ネイティブAndroidXRで色々やるためにもまずはAndroidのお勉強をしたいと思った

にー兄さんにー兄さん

Android StudioのKeybindをVSのものにしたんだけど、
なぜかCtrl+Spaceで入力言語が切り替わっちゃってCode Completionが効かないので困って
Win Copilot君に聞いてみたら正解を教えてくれた、すごいなマジで

にー兄さんにー兄さん

mutableStateを使ってpaddingを制御するところまで

にー兄さんにー兄さん

Composeのpreview、interactive modeなるものがあるの初めて知った
emulatorがなくてもstateを使った状態変化をシミュレートできるのすごく便利

にー兄さんにー兄さん

自作の簡単なミニアプリみたいなものを、一つのアプリに集約したプロジェクトにするといいかも

  • じゃんけん
  • 3目並べ
にー兄さんにー兄さん

Jetpack XR SDKの中に、下記が入ってるというイメージらしい

  • Jetpack Compose for XR
  • Material Design for XR
  • Jetpack SceneCore
  • ARCore for Jetpack XR
にー兄さんにー兄さん

なんとなくComposeの勉強をしてきたため、Compose for XRは気になるかも
ここ深ぼってみようかな

にー兄さんにー兄さん

androidXR自体、普通のアプリも動くけど
Compose for XRではspatial panelsとかorbitalsという専用のComposableを提供していたり
Volumeコンポーネントを使えばSceneCoreのエンティティとかを召喚できるのかな

にー兄さんにー兄さん

Spatial ~~なComposableは、android.xr.composable.spatialモジュールの中に入っていそう
https://developer.android.com/reference/kotlin/androidx/xr/compose/spatial/package-summary

  • Orbiter
  • Spatial Dialog
  • Spatial Elevation
  • Spatial Popup
  • Subspace

あーでも、SpatialPanelとかないな?

にー兄さんにー兄さん

これらは@SpatialComposableアノテーションがされていて、子オブジェクトにもまたSpatialComposableをとるようなもの

にー兄さんにー兄さん

あと、なんとなくglTFの読み込みについても調べてみた

まず、おそらくSubspace?の中にVolumeコンポーザブルを入れて、
Volumeは最後の引数にEntityを受け取れる

そのEntityを継承したGltfModelEntityをここにツッコめば良さそうで、
GltfModelEntityのファクトリにはGltfModelが必要そう
そして、こいつはurlを受け取ってcreateが非同期に実行される感じみたい

https://developer.android.com/reference/kotlin/androidx/xr/scenecore/GltfModel
https://developer.android.com/reference/kotlin/androidx/xr/scenecore/GltfModelEntity
https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/package-summary#Volume(androidx.xr.compose.subspace.layout.SubspaceModifier,kotlin.String,kotlin.Function1)

にー兄さんにー兄さん

いや、VolumeはEntityを受け取らないな
onVolumeEntityという、Entityがavailableになったらそれを受け取れるコールバックを登録する感じだな

では肝心のENtityはどこに渡せばいいんだろう?

にー兄さんにー兄さん

samplesにある通り、基本的にはHello Android XRとCodelabsのサンプルが参考になるだろうなぁ
あとはXRのテンプレートか
https://developer.android.com/develop/xr/samples

にー兄さんにー兄さん

あと、FullSpaceになったときにscondaryCardListがmovableになってるのも参考になりそう

にー兄さんにー兄さん

codelabsのやつはこういう構造になっていて
Home Spaceの時はScaffoldの中が表示されるが、
Full Spaceの時はSubspaceが表示されるような挙動が気がする

そしてsubspaceの中のSpatialPanelにmovableのモディファイヤがついてるので動かせる

にー兄さんにー兄さん

なんかLocalSession.currentでエラーになるなぁと思ったら、なんかSceneCoreがimportで参照できないな

にー兄さんにー兄さん

堀さんのメモを参考に、Hello Android XRの依存を確認し、
それを参考にして依存関係を設定した

参考元とはちょっと記述方法が違うけど、まずはlibs.versions.tomlにscenecoreへの参照を追加

androidx-xr-scenecore = { group = "androidx.xr.scenecore", name = "scenecore", version.ref = "xrCompose" }
にー兄さんにー兄さん

そしてappモジュールについてのbuild.gradle.ktsにも追加

  implementation(libs.androidx.xr.scenecore)
にー兄さんにー兄さん

この記述方法慣れないけど、tomlに書かれたエイリアスでgradleファイルに依存を追加するんだな

にー兄さんにー兄さん

これでLocalSession.currentが動くようになったので、ドキュメントに従って3Dモデルを読み込んでみる
https://developer.android.com/develop/xr/jetpack-xr-sdk/add-3d-models#place-3d

にー兄さんにー兄さん

コピペで依存設定したら普通に大丈夫そうだった

しかし、await()はsuspendで動くらしいので、launchしなければ

にー兄さんにー兄さん

コルーチンのlaunchについては、HelloAndroidXRを参考にこんな感じで書いてみた

にー兄さんにー兄さん

なんかよくわからないけど、GltfModelEntity.createのメソッド定義が違うな?

もしかしたらバージョン問題かもしれない
Codelabsはalpha01だけど、ドキュメント的にはadded in alpha02と書いてある

にー兄さんにー兄さん

ん-、alpha02に上げたけど、以前GltfModelEntity.createの定義が変わらないなぁ

このスクラップは2ヶ月前にクローズされました
ログインするとコメントできます