見出し画像

Apple Vision Proアプリケーション開発(3)

前回記事で紹介した、空間にメモを配置するアプリの制作で工夫した点の続きを紹介します。
今回は「標準ウインドウや操作音」についてです。


開発記事一覧

  1. Apple Vision Proアプリケーション開発

  2. Apple Vision Proアプリケーション開発(2)


メモウインドウの開閉

フルイマーシブ空間のアプリでも VisionOS 標準のウインドウを表示することができます。これによりメモ画面を SwiftUI で効率よく構築できます。

以下は付箋ピンがタップされた場合に、 `openWindow` でウインドウを開くコードの抜粋です。ここでは開くメモウインドウを1つに限定したかったため、先に `dismissWindow` を呼んでいます。
しかし当時は `dismissWindow` 直後に `openWindow` すると前のWindowが開いていた位置に新しい Window を表示する挙動をしていたため、 ここでは 250 ms の遅延を入れています。

struct StickyNoteRealityView: View {
    @Environment(AppState.self) private var appState

    @Environment(\.openWindow) private var openWindow
    @Environment(\.dismissWindow) private var dismissWindow
    @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace

    :
    :
    var body: some View {
        RealityView { content in
        :
        :
        .gesture(
            SpatialTapGesture(count: 1)
                .targetedToAnyEntity()
                .onEnded { value in

        .gesture(
            SpatialTapGesture(count: 1)
                .targetedToAnyEntity()
                .onEnded { value in
                    // 付箋ピンの場合の処理
                    if (value.entity.name == ObjectIdentifier.stickyPin) {
                        AudioServicesPlaySystemSound(SystemSound.SCREEN_SHARING_STARTED)
                        let pinEntity = value.entity as! ModelEntity
                        Task {
                            dismissWindow(id: UIIdentifier.noteWindow)
                            try! await Task.sleep(for: .milliseconds(250))
                            let linkId = pinEntity.getLinkId() as! String?
                            if linkId != nil {
                                openWindow(id: UIIdentifier.noteWindow, value: linkId!)
                                showTargetPlane = false
                            }
                        }
                    }
                    :

操作音について

視線とハンドジェスチャによる操作は、特に開発中は、ハンドジェスチャによるタップイベントが認識されないためプログラムが動作しないのか、タップイベントは入力されていてその先のプログラムに不具合があるのか切り分けが難しく困ることがあります。
そのような時はタップのようなユーザー操作に対して操作音を付けると判別が容易になります。

デバッグ目的で、完成度に拘らないのであれば下記のように`AudioServicesPlaySystemSound` を使ってシステム音を鳴らすことができます。

        :
        .gesture(
            SpatialTapGesture(count: 1)
                .targetedToAnyEntity()
                .onEnded { value in
                    AudioServicesPlaySystemSound(SystemSound.SCREEN_SHARING_STARTED)
                :

参考情報など

3回に渡りお送りしてきましたが、次回は別の記事を投稿予定です。


株式会社ギガ・システム

ギガ・システムはシステム開発を専門とし、
基本設計からインフラ構築までトータルサポートを提供しています。
最新技術への挑戦を続け、医療機器ソフトウェア、IoT、クラウド技術をはじめとし、Vision Proを用いたMR技術への取り組みも進めています。
お客様のニーズに柔軟に対応するため、常に進化を続けています。

空間コンピューティングデバイスを含む最新技術のソリューションにご興味のある方からのお問い合わせ、お待ちしております。

お問い合わせ先

https://www.giga-system.co.jp/contact


GIGA TechLINK Magazine

Apple Vision ProといったMRデバイスや新しい技術全般の情報をお届けします。


この記事が気に入ったらサポートをしてみませんか?