Add stereo panning for player audio channels and expose StopVoice method

This commit is contained in:
Cviat 2026-01-23 12:40:19 +03:00
parent e3e091c8b6
commit d81fe842e0

View File

@ -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);
}
}
}