# Audio Listening System - Architecture ## Vue d'ensemble Le système d'écoute permet au joueur d'utiliser un diapason pour "écouter" les objets et découvrir des informations cachées à travers les sons et vibrations procéduraux. ## Structure des Fichiers ### Core Scripts **AudioListenable.cs** - Composant principal pour les objets écoutables - Génération audio procédurale basée sur le type de matériau - Gestion des vibrations de manette - Support pour audio statique custom **DiapasonListeningHandler.cs** - Gestionnaire central du mode écoute - Gère l'état de concentration du joueur - Contrôle la caméra avec pan et curseur - Raycast vers les objets écoutables - Atténuation sonore ambiante **ListeningVignetteEffect.cs** - Effet visuel de vignette pour l'état d'écoute - S'intègre avec URP Volume system - Transition smooth entre états ### Data Scripts **AudioEmitterData.cs** - ScriptableObject pour configurer les types d'émetteurs - Paramètres procéduraux (fréquences, harmoniques) - Settings de vibration - Courbes d'atténuation ### Extended Features **AudioListenableEvent.cs** - Ajoute des événements Unity aux objets écoutables - Support pour trigger une seule fois - Événements: OnListeningStarted, OnListeningStopped, OnFirstListen **ThroughWallListener.cs** - Permet de détecter des objets derrière un mur - Feedback audio différent selon ce qui est détecté - Peut highlight des objets importants **DiapasonDebugger.cs** - Outil de debugging pour le système - Affiche l'état du système en temps réel - Liste tous les objets écoutables - Gizmos visuels dans la Scene ### Editor Scripts **AudioListenableEditor.cs** - Custom Inspector pour AudioListenable - Boutons Quick Setup par type de matériau - Test en Play Mode **AudioListenableBatchSetup.cs** - EditorWindow pour configuration en masse - Setup par sélection - Setup par nom d'objet - Presets automatiques (walls, doors, etc.) ## Architecture ``` Player ├── DiapasonListeningHandler (Manager) │ ├── Input Handling │ ├── State Management (Concentrating/Listening) │ ├── Camera Control │ └── Raycast Detection │ ├── ListeningVignetteEffect (Visual) │ └── URP Volume Integration │ └── Audio Source (Player sounds) Scene Objects ├── AudioListenable (Core) │ ├── Procedural Audio Generation │ ├── Vibration System │ └── Distance Attenuation │ ├── AudioListenableEvent (Optional) │ └── UnityEvent Triggers │ └── ThroughWallListener (Optional) └── Behind-Wall Detection ``` ## Workflow de Fonctionnement 1. **Activation** (Triangle/Y) - DiapasonListeningHandler.StartListeningMode() - Désactive les inputs de mouvement - Active l'objet diapason 2. **Phase de Concentration** - Joue le son de respiration - Attend la durée de concentration - Prépare le mode écoute 3. **Mode Écoute Actif** - Curseur souris visible - Camera pan sur les bords - Raycast continu vers objets - Vignette activée - Atténuation audio ambiante 4. **Interaction avec Objet** - Clic gauche sur objet écoutable - Animation du diapason (Tap trigger) - AudioListenable.StartListening() - Génération du son procédural - Activation des vibrations 5. **Désactivation** (Triangle/Y à nouveau) - Arrêt de l'écoute - Restauration des inputs - Désactivation vignette - Restauration audio ambiant ## Types d'Émetteurs | Type | Fréquence | Usage | |------|-----------|-------| | Generic | 440 Hz | Objets par défaut | | Wall | 200 Hz | Murs, surfaces plates | | Wood | 300 Hz | Portes, meubles en bois | | Metal | 800 Hz | Objets métalliques | | Glass | 1200 Hz | Vitres, cristal | | Water | 220 Hz | Eau, liquides | | Stone | 250 Hz | Pierre, roche | | Mechanical | 500 Hz | Machines, mécanismes | | Electrical | 440 Hz | Équipements électriques | | Organic | 350 Hz | Matériaux vivants | ## Génération Audio Procédurale ### Algorithme de Base ```csharp // Pour chaque sample float sample = 0; // Ajoute les harmoniques for (int h = 0; h < harmonicCount; h++) { float harmFreq = baseFreq * harmonicMultipliers[h]; float harmAmp = harmonicAmplitudes[h]; sample += Sin(2π * harmFreq * time) * harmAmp; } // Ajoute le bruit sample += (Random() - 0.5) * noiseAmount; // Applique l'envelope sample *= Sin(π * time / duration); ``` ### Caractéristiques par Type **Metal**: Multiples harmoniques (2.1x, 3.8x, 5.2x) pour son métallique **Wood**: Peu d'harmoniques + bruit pour texture **Glass**: Harmoniques aiguës (1.5x, 2.7x, 4.2x) **Water**: Bruit dominant avec légère oscillation **Stone**: Bruit granuleux avec harmonique grave ## Système de Vibrations ### Intensité Basée sur Distance ```csharp intensity = Lerp(minIntensity, maxIntensity, 1 - distance/maxDistance) ``` ### Pattern de Vibration ```csharp pattern = |Sin(time * frequency)| finalIntensity = intensity * pattern ``` ### Contrôles Gamepad - Utilise `Gamepad.current.SetMotorSpeeds(low, high)` - Arrêt automatique à la fin de l'écoute - Arrêt au OnDisable du composant ## Intégration avec d'Autres Systèmes ### Input System - Utilise PlayerInputManager existant - Action "Diapason" ajoutée - Compatible avec système de toggle input ### Audio System - Un AudioSource sur le joueur pour sons système - AudioSource sur chaque AudioListenable - Spatial audio 3D - Custom attenuation curves ### Camera System - Contrôle temporaire de la caméra - Pan basé sur viewport position - Retour à l'état normal à la sortie ## Performance ### Optimisations - Génération audio on-demand (pas de pré-calcul) - AudioClips courts (0.5-2s) - Un seul objet écouté à la fois - Raycast avec LayerMask - Pas de Update() quand inactif ### Considérations - Génération procédurale légère - Vibrations: vérification gamepad chaque frame - Distance checks optimisés avec DistanceSqr ## Extension Future ### AudioEmitterData Integration Actuellement les presets existent mais ne sont pas utilisés par AudioListenable. Pour les intégrer: 1. Ajouter champ `AudioEmitterData` dans AudioListenable 2. Loader les paramètres depuis le ScriptableObject 3. Permettre override des paramètres individuels ### Visualisation Sonore - Particle systems pour ondes sonores - Shader effects sur objets écoutés - Indicateurs visuels pour objets importants ### Audio Avancé - Réverbération basée sur l'environnement - Occlusion sonore - Support multi-canal ## Troubleshooting Courant **Pas de son**: Vérifier AudioSource, layer, distance **Pas de vibration**: Vérifier gamepad connecté **Camera ne bouge pas**: Vérifier border size, références camera **Input ne répond pas**: Vérifier action assignée dans inputactions ## Références - Unity Input System: com.unity.inputsystem 1.17.0 - URP: com.unity.render-pipelines.universal 17.3.0 - Unity 6000.3 APIs