Skip to main content

visionos-patterns

visionOS platform patterns: scene types, RealityKit, spatial gestures, hand tracking, entity interaction. Use when building visionOS-specific features, handling spatial input, or implementing Vision Pro app patterns. Triggers: visionOS, Vision Pro, RealityKit, spatial, immersive, hand tracking, eye tracking.

Informations de source

Dépôt
moasq/nanowave
Dernière activité de la source
15 mars 2026 à 20:51
Langue détectée de SKILL.md
anglais
Étoiles
32
Forks
9

Options d'installation

Le prompt qui vérifie d'abord la source est sélectionné par défaut. Vous pouvez passer à une commande directe ou télécharger une copie locale.

Vérifiez les fichiers source

Lisez SKILL.md et les fichiers associés affichés par SkillsMP avant de décider de l'installer.

Affichage de SKILL.md

SKILL.md
Instructions source · Aperçu en lecture seule
name
visionos-patterns
description
visionOS platform patterns: scene types, RealityKit, spatial gestures, hand tracking, entity interaction. Use when building visionOS-specific features, handling spatial input, or implementing Vision Pro app patterns. Triggers: visionOS, Vision Pro, RealityKit, spatial, immersive, hand tracking, eye tracking.
# visionOS Platform Patterns ## Three Scene Types 1. **Windows** — 2D SwiftUI content in a glass panel (default) 2. **Volumes** — 3D content in a bounded box 3. **Immersive Spaces** — full spatial experience around the user ## RealityKit Entity Loading ```swift import RealityKit // In a RealityView RealityView { content in if let entity = try? await Entity(named: "Scene", in: realityKitContentBundle) { // Add collision and input for interaction entity.components.set(CollisionComponent(shapes: [.generateBox(size: [0.1, 0.1, 0.1])])) entity.components.set(InputTargetComponent()) content.add(entity) } } ``` ## Entity Interaction Entities need `CollisionComponent` + `InputTargetComponent` for user interaction: ```swift RealityView { content in let sphere = ModelEntity(mesh: .generateSphere(radius: 0.1)) sphere.components.set(CollisionComponent(shapes: [.generateSphere(radius: 0.1)])) sphere.components.set(InputTargetComponent()) content.add(sphere) } update: { content in // Update entities } .gesture( TapGesture() .targetedToAnyEntity() .onEnded { value in // Handle tap on entity } ) ``` ## Spatial Gestures ```swift // Tap gesture on entities .gesture( TapGesture() .targetedToAnyEntity() .onEnded { value in handleTap(on: value.entity) } ) // Drag gesture on entities .gesture( DragGesture() .targetedToAnyEntity() .onChanged { value in value.entity.position = value.convert(value.location3D, from: .local, to: .scene) } ) ``` ## ARKit in Immersive Spaces ARKit is only available in Full Space (not Shared Space): ```swift ImmersiveSpace(id: "full-immersive") { RealityView { content in // ARKit features available here } } .immersionStyle(selection: .constant(.full), in: .full) ``` ## Observable Pattern Use `@Observable` over `ObservableObject`: ```swift @Observable class AppModel { var items: [Item] = [] var selectedItem: Item? var isImmersive = false } // In App @State private var model = AppModel() WindowGroup { ContentView() .environment(model) } ``` ## Concurrency MainActor by default in Swift 6.2. Use detached Tasks for background work: ```swift // Already on MainActor by default func loadData() { Task.detached { let data = await fetchData() await MainActor.run { self.items = data } } } ``` ## Hover and Focus Eye tracking drives hover states automatically: ```swift Button("Action") { } .hoverEffect() // Required for all interactive elements .hoverEffect(.highlight) // Highlight variant .hoverEffect(.lift) // Lift variant ``` ## Widgets visionOS 26 widgets are spatial — they snap to walls and tables: ```swift // Standard WidgetKit implementation works // visionOS renders them as spatial glass panels ``` ## Deprecated API Alternatives - Use `.foregroundStyle()` not `.foregroundColor()` - Use `.clipShape(.rect(cornerRadius:))` not `.cornerRadius()` - Use `@Observable` not `ObservableObject` ## NOT Available on visionOS - No camera access (enterprise API only) - No haptic feedback (CoreHaptics) - No HealthKit - No direct gaze data (privacy protected) - No `UIScreen.main` - No MapKit with full map view - No NFC or Bluetooth LE scanning - No App Clips - No share extensions - No Safari extensions ## Rules 1. Three scene types: Windows (default), Volumes (3D bounded), Immersive Spaces (full spatial) 2. Entities need `CollisionComponent` + `InputTargetComponent` for interaction 3. ARKit only works in Full Space immersive experiences 4. Use `@Observable` over `ObservableObject` 5. ALL interactive elements MUST have `.hoverEffect()` 6. Use spatial gestures (`.targetedToAnyEntity()`) for 3D interaction 7. MainActor by default — use `Task.detached` for background work 8. Use `.foregroundStyle()` not `.foregroundColor()` 9. Use `.clipShape(.rect(cornerRadius:))` not `.cornerRadius()`
Voir sur GitHub