カテゴリー: Vision OS

  • 【Vision OS】AppIcon をApp上でも表示する。

    【Vision OS】AppIcon をApp上でも表示する。

    これは何?

    Vision OS の AppIcon をViewの中で呼び出す方法についてです。

    環境

    2024/7/5現在

    • VisionOS 1.1
    • XCode Version 15.4 (15F31d)

    やり方

    現状はまとめて取ってくるといったことができないようなので、
    下記のように別々にレイヤーを取得してZStackで重ねるしかないようです。

    ZStack {
                    Image("AppIcon/Back/Content"  )
                        .resizable()
                        .frame(width: 300, height: 300)
                        .scaledToFit()
                        .clipShape(Circle())
                        
                    Image("AppIcon/Middle/Content")
                        .resizable().frame(width: 300, height: 300)
                        .scaledToFit()
                        .clipShape(Circle())
                        
                        .offset(z: 10)
                    Image("AppIcon/Front/Content" )
                        .resizable()
                        .frame(width: 300, height: 300)
                        .offset(z: 20).scaledToFit()
                        .clipShape(Circle())
                }
                .padding(.top, 70)

    しかしこれだと、層にはなるものの球体に張り付いたような形にはなりません。
    どうしても実装したいならば、別ソフトでオブジェクトを作ってきて、シーンとして読み込むのが良さそうです。

    ⚠️ できなかったこと

    下記のような書き方できませんでした。(この書き方でそのまま球面になっているものが取得できれば本当にありがたかった……。)

    Image("AppIcon/AppIcon/Content")
    
    Image("AppIcon")

    参考

    https://stackoverflow.com/questions/78153249/how-to-render-a-visionos-icon-in-a-view

  • Vision OS 音量をコントロールする

    Vision OS 音量をコントロールする

    ❓ これは何

    VisionOS での音(AudioPlaybackController)を Slider を使って音量をコントロールする方法についてです。

    🪴 環境

    • sonoma 14.5(23F79)
    • Apple M1
    • 16GB

    🛠️ やり方

    今回は自然の音を再生するアプリを例に作っていきます。

    NatureEntity.swift

    import SwiftUI
    import RealityKit
    
    class NatureEntity: Entity {
        private var fireAudioController: AudioPlaybackController?
        
        @MainActor required init() {
            super.init()
        }
        
        init(fireAudio: AudioPlaybackController?, rainAudio: AudioPlaybackController?, insectAudio: AudioPlaybackController?) {
            super.init()
            self.fireAudioController = fireAudio
        }
        
        func updateGlobalVolume(_ volume: Double) {
            fireAudioController?.gain = volume
        }
    }
    

    続いて、Sliderでの操作部分の作成です。

    NatureControls.swift

    import SwiftUI
    
    struct NatureControls: View {
        @Binding var globalVolume: Float
        
        var body: some View {
            VStack {
                Text("Global Volume")
                Slider(value: $globalVolume, in: 0...1)
                    .padding()
            }
        }
    }

    最後に、これらをまとめて表示する部分です。

    SoundView.swift

    import SwiftUI
    import RealityKit
    
    struct SoundView: View {
        @State private var globalVolume: Double = -10
        @State private var natureEntity: NatureEntity?
    
        var body: some View {
            ZStack {
                RealityView { content in
                    let natureEntity = NatureEntity(fireAudio: nil) // 実際のオーディオコントローラーを渡す
                    content.add(natureEntity)
                    self.natureEntity = natureEntity
                }
                
                NatureControls(globalVolume: $globalVolume)
                    .onChange(of: globalVolume) { volume in
                        natureEntity?.updateGlobalVolume(volume)
                    }
                    .padding()
                    .background(Color.black.opacity(0.7))
                    .cornerRadius(10)
                    .padding()
            }
        }
    }

    これで、音量調整のできる機能が備わったと思います。

    ポイントは fireAudioController?.gain = volume という部分で、
    音量調整は gain で行うということです。Doubleで渡してあげたところうまくいきました。

Home
About
Blog
Works
Contact