本当にメモです
Apple Vision Proアプリ開発入門
ホロラボさんの本。Swift特化。教科書はVisionOSのバージョンが1だが、私は2でやったので色々詰まった。
Swiftのことを理解して、Tabletopkitも使えるようになればいいな〜と思いこの本を始めたが、難しくて私には無理かもしれない・・・と思った。
Chapter1~3
Digital Crownを2回押したら今出てるアプリとかが全部消えて現実空間が見えるようになった。知らなかった。
RealityComposerProから直接AVP実機にシーンを送れるの便利
用意されていた地球アセットが驚くほど精細。地形も反映されて雲まである。こんな地球初めてみた

RealityComposerProから高解像度のスクショや動画キャプチャをとれる。Macのデスクトップに保存されるので転送必要ないのは便利。
1枚のスクショで3840 × 2160で7.6MBもあった
本体でスクショを撮ると1920x1080
拡張子が本では表示されてるけど、デフォルトは表示されない。設定変えた
xcode用のgithub copilot入れれた!
サジェストされるものが教科書通りになる
最近の不具合なのか?プレビューが見れない。結局毎回ビルドしたけど不便。GithubCopilot入れたせいなのか?
chapter 4 オブジェクトビューワー作成
Swiftには回転とかのアニメーションの関数がデフォルトであるのか〜
volumeのデフォルトサイズを変えても見た目変わらない。ずっと同じいい感じの大きさに自動になる
ドラッグジェスチャで3Dモデルを回転させるのにこんなにコードがいるのか・・・
chapter 5イマーシブでのロケットアプリ
リバーシなどのアプリにあった大きくするボタンみたいなのはボリュームモードからイマーシブスペースモードにしていたのか。周りに他のアプリが表示されなくなる以外に、実装していたら空間のここに固定!みたいなのもできる。
OS2の環境でやっているが、イマーシブモードのテンプレートのcontentviewがOS1の環境の本と全然違う。トグルが別ファイルに切り出されたのか
イマーシブスペースの原点はユーザーの足元
位置設定せずに物を置いたらそこに出てくる。
swiftでもタップに反応するためにはcollisionなどのコンポーネントを付与することが必要
nullじゃなくてnil
本と違う箇所が多くて脱落しかけたが、なんとかなった。
無料の個人アカウントだと3つまでしかデバイスにアプリをビルドできないという知見を得た
chapter 6RealityComposerPro
RCPでRenameがオブジェクトの選択肢になくなっている・・・
長押しか何回かクリックしたら変えられるからいいが
axes(axisの複数形)
マテリアルもオブジェクトと同列のオブジェクト扱いなのがUnityと違う
教科書はMaterial>Customだが私の環境ではMaterial>ShaderGraphという名前になっている

shadergraphによってオブジェクトの位置を変えれる
花火、煙、雨、雪、火花、Magicのパーティクルがあらかじめ用意されている

OS2ではAppModelが最初からある。じゃあこの本のAppModelはなんなんだ。元からあるAppModelの中身を置き換えじゃダメなのかな
AppModel関連でエラーが出て脱落
RCPで設定したものをXcodeから操作するのこんなに大変なのか・・・
Chapter7 ARKit!手でシューティング
オブジェクトを名前で管理する(嫌だ〜)
entityA、entityBはどこから来たんだ
またうまくいかなかった
Chapter8 ARKit!手でシューティング
空間認識!
ARKitのSceneReconstructionで現実環境のデータが渡ってきて、それを更新したり、コリジョンつけたりの処理は自分で書く必要がある><
@Published
ImageTrackingはWebARとかよりは全然精度いいけど微妙に揺れは発生している
ChapterRea9 Shareplay!
SharePlayを利用するには有料プログラムが必要!
ちゃんと有料アカウントをteamにしてないと、CapacityでGroupActivitiesを選べなかった
まずテストしやすくするため、iPhoneとVisionProでやりとりできる部分から実装するらしい。
iOSのシミュレーターを入れるのに8GBかかる・・・別にシミュレーターなくてもいい気もする
これでアクティビティのタイプを設定できる。ゲームや動画視聴などがあるらしい
/// グループアクティビティに関するメタデータ
struct SampleActivity: GroupActivity {
// アクティビティについて説明する情報の提供
var metadata: GroupActivityMetadata {
var data = GroupActivityMetadata()
data.title = "Sample App"
data.type = .generic
return data
}
}
$state
Cannot find 'manager' in scope
最後のサンプルアプリの解説は見る人が見ればすごく勉強になりそう。HappyBeamもそういえばShareplay要素あった
Apple Vision Proアプリ開発ガイド 〜visionOSではじめる空間コンピューティング実践集
2冊目!
Unityも含めて色々紹介されている。
1章以外は写経して1から作るというより、サンプルプロジェクトのコードなどの解説。
また公開されているサンプルコードにはコメントがないけど、本にはコメントがついているものもある。
導入
AVPのほかと違うところは「自然」
AVPは現実空間の形状を認識しているので、音の反響の仕方も空間に合わせている!?
ゴリラ腕問題という言葉初めて聞いた
第1章 ノーコード・ローコード
iPhoneやMacからusdzのファイルをAVPにAirDropで送って表示。逆はやってたけど確かにこの使い方も楽しい。スキャンした人形とかを送って空間に置いておくと癒し
OS2からはRealityKitでもSpatialTrackingSessionを利用したらARKitを使わなくても一部のトラッキングデータにアクセスできる。
もう一冊も含めていっぱいサンプルプロジェクトをビルドしていたら
Your maximum App ID limit has been reached. You may create up to 10 App IDs every 7 days.
と出た。
RealityComposerPro(以下RCP)でのノーコード実装。
自転させるのにもコリジョンやPhysicsMaterialが必要
Anchoringを使えばノーコードで手や指にオブジェクトを追従できる!便利!

AnchoringとARKitのハンドトラッキング両方あると動かない
RCPでの非表示は右クリックからdeactivate(下の方)

info.plistに書くNSHandsTrackingUsageDescriptionを誤字するとビルドは成功するが途中でPauseしてアプリが何も表示されない
ローコードというかRCP用のコンポーネントになるコードを著者が提供してくれてるので、それを使ってほぼローコードという感じだった。他でも使えそうなのでありがたい。
あとドラムのアプリは普通に楽しい。Questでもあるんだろうか?Questってちゃんとゲームになってないとリリースできなそうだからあういうシンプルなの逆にないのかな?
手に棒がくっついているので掴む動作も不要。でもやっぱり持つ系はコントローラーあった方が楽しいだろうな
第2章 SwiftUI
WWDCのデザイン系のセッションでの発表を忠実に独自アプリで解説してくれている感じでよかった!
swiftuiのチュートリアルを公式がだしてる。なお英語
Geminiはswift向けのライブラリ?を出している。これを使ってAI会話
サンプルプロジェクトはうまく動かなかった。APIを設定しないと入力UIとかも出ないのだろうか?
ただインプットフィールドだけの入力UIめっちゃかっこいい。未来感ある。
3DモデルとUIもVstackなどで並べ替えできる
@Environmentは複数のViewの階層間でデータを共有するための強力なツール
第3章 ARKit
ARKitを使った空間に置くタイマーアプリ
Realitykitで空間をタップするにはメッシュが必要。でも広い空間だと壁とかがないのでタップする対象がない。なので目の前にメッシュを追従させている
os1.1時点だとAVPのARKitで取れるデータは5種類
・手の位置
・ImageTracking
・周囲の形状
・周囲の平面
・WorldTracking(端末の位置、回転)
(ちなみにホロラボ本も含め2冊ともやると全部網羅できる↑)
現在の時間を渡して今の位置を取得する。未来の時間を渡して予測データを取得することもできるらしい!ただし重い
Update関数みたいなの使わずに1秒間に90回呼び出すというのを手動?でしている。
AVPは基本90Hz
spatialTapGesture()で、「物をタップしたらXX」を実行みたいなのができる
UserDefaultsで端末内にデータを保存できる。(UnityのPlayerPrefs的なもの?)
ローカル通知はデフォルトはアプリがバックグラウンドの時しか送信されないが、アクティブな時にも表示できるようにできる
ScenePhaseでアプリがアクティブか非表示になっているか取得できる
第4章 Sunny Tune
Volumeのサイズは単位がmmだがコンテンツの位置はm単位
Volumeには余白があるからギリギリに置いても表示されない
ボリュームのサイズをユーザーの操作で変更できるようになった
.defaultWorldScaling(.dynamic)
設定したらオブジェクトのサイズも追従させることもできる
windowはユーザーの方を常に向く(WidgetSmithもこのせいで時計とかが壁に沿わないのか〜)
Volumeはデフォルトだと床と水平のまま動く。
ユーザーの方を向かせることもできるようになった.volumeWorldAligment(.adaptive)
シェーダーグラフでカメラ位置を取得できる!
天気や風の強さ向などはWeatherKitなるものから取得している
SunnyTuneの木は1日かけて大きくなって、翌日にはまた新しい木になっていたらしい。知らなかった。時間経過を示している
木の成長はL-systemというアルゴリズム
第5章 Unity
何も設定せずにCanvasだけ置いたらUnityのあの背景も一緒に表示されるWindow
Spaceはうまく動かないらしい
WorldCanvasのボタンにboxcolliderをつけてゲームオブジェクトと同じようにタップを扱っている
Demissionの値は同じ値を入れないと歪む
Unboundedの時はVolumeCameraが初期の描画位置になる
またYが地面の0位置になる。
spatialPointState.targetObjectでタップしたオブジェクトを取得できる
SpatialPointerPhase.Beganだとタップを始めたということ
こちらが詳しい
XRHandsパッケージを入れてハンドトラッキング
Upper Limb Visibilityが手がコンテンツをオクルージョンするかに関わっているらしい。

内容と関係ないけどUnity2022でcom.unity.polyspatial.visionosパッケージを入れて、その後やっぱりUnity6にしよう!と思ってアップデートして、Volumeシーンを作ってアップデートしたらIL2cPP系のエラーが出た。
Unity6とPolySpatialのバージョンがあっていないのが問題だったっぽい。
PolySpatial系のパッケージを全部2.0.4を指定して入れ直したらUnityではビルドできた。でもXcodeではエラーでて結局ビルド成功せず
第6章 Unityでできることできないこと
最適化されたアニメーションはサポート外。
カリングが利用できない。裏側を描画できない
SwiftUIをUnityで利用できる。UIだけじゃなくてVisionOSならではの機能も利用できる?
文字入力できないんだ!
現状PolySpatial単体では文字入力に対応していないために、SwiftUIを介して入力するというものを実現しました。
最後に
勉強になった。RCPは使ってみようという気持ちになれた。Unity周りは素直に参考になる!