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
-
Activation (Triangle/Y)
- DiapasonListeningHandler.StartListeningMode()
- Désactive les inputs de mouvement
- Active l'objet diapason
-
Phase de Concentration
- Joue le son de respiration
- Attend la durée de concentration
- Prépare le mode écoute
-
Mode Écoute Actif
- Curseur souris visible
- Camera pan sur les bords
- Raycast continu vers objets
- Vignette activée
- Atténuation audio ambiante
-
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
-
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
// 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
intensity = Lerp(minIntensity, maxIntensity, 1 - distance/maxDistance)
Pattern de Vibration
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:
- Ajouter champ
AudioEmitterDatadans AudioListenable - Loader les paramètres depuis le ScriptableObject
- 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