From d81fe842e0625dc76b1fbffb1f3eddfc58202d56 Mon Sep 17 00:00:00 2001 From: Cviat Date: Fri, 23 Jan 2026 12:40:19 +0300 Subject: [PATCH] Add stereo panning for player audio channels and expose StopVoice method --- Assets/Scripts/SoundManager.cs | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/Assets/Scripts/SoundManager.cs b/Assets/Scripts/SoundManager.cs index 36c094b4..10138468 100644 --- a/Assets/Scripts/SoundManager.cs +++ b/Assets/Scripts/SoundManager.cs @@ -127,11 +127,20 @@ public void PlayVoice(int playerId, AudioClip clip) { if (clip == null) return; AudioSource source = GetVoiceSource(playerId); - + // Прерываем предыдущую фразу, если нужно (для голоса это обычно желательно) source.Stop(); + ApplyPlayerPan(source, playerId); source.PlayOneShot(clip); } + + // Устанавливает 2D режим и панораму для маршрутизации в VoiceMeeter (player1 -> left, player2 -> right) + private void ApplyPlayerPan(AudioSource src, int playerId) + { + if (src == null) return; + src.spatialBlend = 0f; // 2D + src.panStereo = (playerId == 1) ? -1f : 1f; + } private AudioSource GetVoiceSource(int playerId) @@ -157,15 +166,23 @@ private void StopAllPlayerSounds(int playerId) GetVoiceSource(playerId).Stop(); GetEffectsSource(playerId).Stop(); } - - + // Публичный метод чтобы прекратить только голосовой канал указанного игрока + public void StopVoice(int playerId) + { + var src = GetVoiceSource(playerId); + if (src != null) + src.Stop(); + } + public void PlayShoot(int playerId) { if (shootSounds.Length != 0) { AudioClip clip = shootSounds[UnityEngine.Random.Range(0, shootSounds.Length)]; - GetEffectsSource(playerId).PlayOneShot(clip); + AudioSource src = GetEffectsSource(playerId); + ApplyPlayerPan(src, playerId); + GetEffectsSource(playerId).PlayOneShot(clip, 0.8f); } } @@ -174,7 +191,9 @@ public void PlayExplosion(int playerId) if (explosionSounds.Length != 0) { AudioClip clip = explosionSounds[UnityEngine.Random.Range(0, explosionSounds.Length)]; - GetEffectsSource(playerId).PlayOneShot(clip); + AudioSource src = GetEffectsSource(playerId); + ApplyPlayerPan(src, playerId); + GetEffectsSource(playerId).PlayOneShot(clip, 3.0f); } } @@ -183,7 +202,9 @@ public void PlayMiss(int playerId) if (missSounds.Length != 0) { AudioClip clip = missSounds[UnityEngine.Random.Range(0, missSounds.Length)]; - GetEffectsSource(playerId).PlayOneShot(clip); + AudioSource src = GetEffectsSource(playerId); + ApplyPlayerPan(src, playerId); + GetEffectsSource(playerId).PlayOneShot(clip, 0.5f); } } }