using GameFramework.Sound; using SepCore.Definition; using SepCore.Entity; using SepCore.Utility; using UnityGameFramework.Runtime; namespace SepCore.Sound { public static class SoundExtension { private const float FadeVolumeDuration = 1f; private static int? s_MusicSerialId = null; public static int? PlayMusic(this SoundComponent soundComponent, int musicId, object userData = null) { soundComponent.StopMusic(); MusicConfig musicConfig = GameEntry.Luban.Get(musicId); if (musicConfig == null) { Log.Warning("Can not load music '{0}' from data table.", musicId.ToString()); return null; } PlaySoundParams playSoundParams = PlaySoundParams.Create(); playSoundParams.Priority = 64; playSoundParams.Loop = true; playSoundParams.VolumeInSoundGroup = 1f; playSoundParams.FadeInSeconds = FadeVolumeDuration; playSoundParams.SpatialBlend = 0f; s_MusicSerialId = soundComponent.PlaySound(AssetUtility.GetMusicAsset(musicConfig.AssetName), "Music", Constant.AssetPriority.MusicAsset, playSoundParams, null, userData); return s_MusicSerialId; } public static void StopMusic(this SoundComponent soundComponent) { if (!s_MusicSerialId.HasValue) { return; } soundComponent.StopSound(s_MusicSerialId.Value, FadeVolumeDuration); s_MusicSerialId = null; } public static int? PlaySound(this SoundComponent soundComponent, int soundId, EntityBase bindingEntity = null, object userData = null) { SoundConfig soundConfig = GameEntry.Luban.Get(soundId); if (soundConfig == null) { Log.Warning("Can not load sound '{0}' from data table.", soundId.ToString()); return null; } PlaySoundParams playSoundParams = PlaySoundParams.Create(); playSoundParams.Priority = soundConfig.Priority; playSoundParams.Loop = soundConfig.Loop; playSoundParams.VolumeInSoundGroup = soundConfig.Volume; playSoundParams.SpatialBlend = soundConfig.SpatialBlend; return soundComponent.PlaySound(AssetUtility.GetSoundAsset(soundConfig.AssetName), "Sound", Constant.AssetPriority.SoundAsset, playSoundParams, bindingEntity != null ? bindingEntity.Entity : null, userData); } public static int? PlayUISound(this SoundComponent soundComponent, int uiSoundId, object userData = null) { UISoundConfig uiSoundConfig = GameEntry.Luban.Get(uiSoundId); if (uiSoundConfig == null) { Log.Warning("Can not load UI sound '{0}' from data table.", uiSoundId.ToString()); return null; } PlaySoundParams playSoundParams = PlaySoundParams.Create(); playSoundParams.Priority = uiSoundConfig.Priority; playSoundParams.Loop = false; playSoundParams.VolumeInSoundGroup = uiSoundConfig.Volume; playSoundParams.SpatialBlend = 0f; return soundComponent.PlaySound(AssetUtility.GetUISoundAsset(uiSoundConfig.AssetName), "UISound", Constant.AssetPriority.UISoundAsset, playSoundParams, userData); } public static bool IsMuted(this SoundComponent soundComponent, string soundGroupName) { if (string.IsNullOrEmpty(soundGroupName)) { Log.Warning("Sound group is invalid."); return true; } ISoundGroup soundGroup = soundComponent.GetSoundGroup(soundGroupName); if (soundGroup == null) { Log.Warning("Sound group '{0}' is invalid.", soundGroupName); return true; } return soundGroup.Mute; } public static void Mute(this SoundComponent soundComponent, string soundGroupName, bool mute) { if (string.IsNullOrEmpty(soundGroupName)) { Log.Warning("Sound group is invalid."); return; } ISoundGroup soundGroup = soundComponent.GetSoundGroup(soundGroupName); if (soundGroup == null) { Log.Warning("Sound group '{0}' is invalid.", soundGroupName); return; } soundGroup.Mute = mute; GameEntry.Setting.SetBool( GameFramework.Utility.Text.Format(Constant.Setting.SoundGroupMuted, soundGroupName), mute); GameEntry.Setting.Save(); } public static float GetVolume(this SoundComponent soundComponent, string soundGroupName) { if (string.IsNullOrEmpty(soundGroupName)) { Log.Warning("Sound group is invalid."); return 0f; } ISoundGroup soundGroup = soundComponent.GetSoundGroup(soundGroupName); if (soundGroup == null) { Log.Warning("Sound group '{0}' is invalid.", soundGroupName); return 0f; } return soundGroup.Volume; } public static void SetVolume(this SoundComponent soundComponent, string soundGroupName, float volume) { if (string.IsNullOrEmpty(soundGroupName)) { Log.Warning("Sound group is invalid."); return; } ISoundGroup soundGroup = soundComponent.GetSoundGroup(soundGroupName); if (soundGroup == null) { Log.Warning("Sound group '{0}' is invalid.", soundGroupName); return; } soundGroup.Volume = volume; GameEntry.Setting.SetFloat( GameFramework.Utility.Text.Format(Constant.Setting.SoundGroupVolume, soundGroupName), volume); GameEntry.Setting.Save(); } } }