Files
Ipseity-Demo/Assets/Unheimlich_POC/Scripts/Audio/README.md
T

6.8 KiB

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

// 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:

  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