using UnityEngine; using BNG; using Normal.Realtime; using UnityEngine.Audio; using IO_MP; namespace Doctopedia.Megaphone { public class Megaphone : GrabbableEvents { DoctopediaRoomManager roomManager; [Header("Configuration")] [SerializeField] AudioMixerGroup megaphoneAudioMixerGroup; [SerializeField] float megaphoneVolumen = 1; [SerializeField] float megaphoneMinDistance = 5000; [SerializeField] float megaphoneMaxDistance = 20000; [Header("Components")] [SerializeField] GameObject soundWaveEffect; [SerializeField] AudioSource sfxAudioSource; bool initialized = false; bool isBeeingUsed; bool isSpeaking; bool isOn; float speakTime = 0.75f; float speakTimer; RealtimeAvatarVoice realtimeAvatarVoice; AudioSource voiceAudioSource; AudioMixerGroup defaultAudioMixerGroup; float defaultVoiceVolume = 0.5f; float defaultVoiceMinDistance; float defaultVoiceMaxDistance; MegaphoneSync sync; private void Start() { sync = GetComponent(); roomManager = DoctopediaRoomManager.Instance; soundWaveEffect.SetActive(false); } private void OnEnable() { roomManager = DoctopediaRoomManager.Instance; } //// Update is called once per frame //void Update() //{ // if (isBeeingUsed) // { // if (realtimeAvatarVoice != null) // if (realtimeAvatarVoice.voiceVolume > 0.1f) // { // if (!isSpeaking) // { // isSpeaking = true; // soundWaveEffect.SetActive(true); // } // speakTimer = 0; // } // if (isSpeaking) // { // speakTimer += Time.deltaTime; // if (speakTimer >= speakTime) // { // isSpeaking = false; // soundWaveEffect.SetActive(false); // } // } // } //} public override void OnGrab(Grabber grabber) { if(roomManager == null) // Can not be initialized if the Megaphone comes from a player inventory { roomManager = DoctopediaRoomManager.Instance; } sync.SetCurrentUserID(roomManager.LocalClientID); } public override void OnRelease() { sync.RemoveCurrentUser(); } public override void OnTrigger(float triggerValue) { if (triggerValue > 0.1f) { if (!isOn) { SetOn(true); } } else { if (isOn) { SetOn(false); } } } internal void SetCurrentUserID(int value) { Debug.Log("Megaphone: SetCurrentUserID: " + value); if (value == -1) { RemovePlayerVoice(); isBeeingUsed = false; soundWaveEffect.SetActive(false); SetOn(false); } else { RemovePlayerVoice(); Player player = null; foreach (var p in roomManager.ConnectedPlayers) { if (p.RoomID == value) { player = p.Player; break; } } if (player != null) { SetPlayerVoice(player.Voice); } } } void RemovePlayerVoice() { if (voiceAudioSource != null) //Restore audiosource { voiceAudioSource.volume = defaultVoiceVolume; voiceAudioSource.minDistance = defaultVoiceMinDistance; voiceAudioSource.maxDistance = defaultVoiceMaxDistance; voiceAudioSource.outputAudioMixerGroup = defaultAudioMixerGroup; voiceAudioSource = null; } } void SetPlayerVoice(RealtimeAvatarVoice realtimeAvatarVoice) { this.realtimeAvatarVoice = realtimeAvatarVoice; voiceAudioSource = realtimeAvatarVoice.GetComponent(); if (voiceAudioSource != null) { defaultAudioMixerGroup = voiceAudioSource.outputAudioMixerGroup; defaultVoiceVolume = voiceAudioSource.volume; defaultVoiceMinDistance = voiceAudioSource.minDistance; defaultVoiceMaxDistance = voiceAudioSource.maxDistance; } } void SetOn(bool value) { isOn= value; Debug.Log("Megaphone: SetOn: " + value); sync.SetOn(value); } public void SetOnLocal(bool value) { Debug.Log("Megaphone: SetOnLocal: " + value); soundWaveEffect.gameObject.SetActive(value); if (value && !isBeeingUsed) { isBeeingUsed = true; if (voiceAudioSource != null) { voiceAudioSource.outputAudioMixerGroup = megaphoneAudioMixerGroup; voiceAudioSource.volume = megaphoneVolumen; voiceAudioSource.minDistance = megaphoneMinDistance; voiceAudioSource.maxDistance = megaphoneMaxDistance; } if (sfxAudioSource) { sfxAudioSource.Play(); } } else if (!value && isBeeingUsed) //Turn off { isBeeingUsed = false; if (voiceAudioSource != null) { voiceAudioSource.volume = defaultVoiceVolume; voiceAudioSource.minDistance = defaultVoiceMinDistance; voiceAudioSource.maxDistance = defaultVoiceMaxDistance; voiceAudioSource.outputAudioMixerGroup = defaultAudioMixerGroup; } } } internal void RemoveCurrentUser() { RemovePlayerVoice(); } } }