258 lines
6.8 KiB
Markdown
258 lines
6.8 KiB
Markdown
# 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
|