using System.Collections; using System.Collections.Generic; using Kill.Bluetooth; using Kill.Bluetooth.Protocol; using Kill.Core; using Kill.Managers; using Kill.UI.Components; using UnityEngine.UI; using UnityEngine; using System; using Unity.VisualScripting; namespace Kill.UI.Pages { public class VideoAndSoundSetting : MonoBehaviour { public Switch videoSwitch; public Switch soundSwitch; public MutiSelectPage videoLengthSelect; public MutiSelectPage soundEffectSelect; public Slider volumeSlider; public Text videoLengthValueText; public Text soundEffectValueText; public Text volumeValueText; // 视频时长选项:3秒、5秒、10秒 private List videoLengthKeyList = new List { "100180", "100181", "100182" }; private List videoLengthStrList = new List(); private List videoLengthValueList = new List { 0x03, 0x05, 0x0A }; // 音效类型选项 private List soundEffectKeyList = new List { "100183", "100184", "100185", "100186", "100187" }; private List soundEffectStrList = new List(); private List soundEffectValueList = new List { SoundEffectType.Hello, SoundEffectType.Goodbye, SoundEffectType.Test, SoundEffectType.BIU, SoundEffectType.Main }; private MultimediaControl multimediaSetting; private Action callback; public void Init(Action callback) { this.callback = callback; InitLanguageText(); ReadMultimediaSettings(); UIManager.Instance.RegisterBackAction(Back); volumeSlider.onValueChanged.RemoveAllListeners(); volumeSlider.onValueChanged.AddListener(OnVolumeChanged); } /// /// 初始化语言文本 /// private void InitLanguageText() { videoLengthStrList.Clear(); foreach (var key in videoLengthKeyList) { videoLengthStrList.Add(LanguageManager.Instance.GetLanguage(key)); } soundEffectStrList.Clear(); foreach (var key in soundEffectKeyList) { soundEffectStrList.Add(LanguageManager.Instance.GetLanguage(key)); } } /// /// 读取多媒体设置 /// private void ReadMultimediaSettings() { if (DataManager.Instance.hasWifi && !DataManager.Instance.hasBluetooth) { MultimediaConfigFromServer(); return; } LoadingUI.Show(); BLECommunicationManager.Instance.ReadMultimediaControl((setting) => { Loom.QueueOnMainThread(() => { multimediaSetting = setting; UpdateUI(); }); }); } /// /// 写入多媒体设置 /// private async void WriteMultimediaSetting() { if (DataManager.Instance.hasWifi && !DataManager.Instance.hasBluetooth) { LoadingUI.Show(); bool success = await HomePageCtrl.Instance.SendBleCommandByWifiAsync( BLEConstants.CMD_MULTIMEDIA_CONTROL, multimediaSetting.ToBytes()); if (success) { SyncMultimediaConfig(); UpdateUI(); } else { ReadMultimediaSettings(); } return; } LoadingUI.Show(); BLECommunicationManager.Instance.WriteMultimediaControl(multimediaSetting, (success) => { Loom.QueueOnMainThread(() => { if (success) { SyncMultimediaConfig(); UpdateUI(); } else { ReadMultimediaSettings(); } }); }); } private void MultimediaConfigFromServer() { var config = DataManager.Instance.deviceConfig; multimediaSetting = new MultimediaControl { VideoRecordEnable = config?.video_record_enable ?? false, RecordDuration = config?.record_duration ?? 0x05, SoundEnable = config?.sound_enable ?? true, SoundType = DeviceConfig.ParseServerEnum(config?.sound_type, SoundEffectType.Hello), Volume = config?.volume ?? 10 }; UpdateUI(); } private void SyncMultimediaConfig() { var config = DataManager.Instance.deviceConfig; config.video_record_enable = multimediaSetting.VideoRecordEnable; config.record_duration = multimediaSetting.RecordDuration; config.sound_enable = multimediaSetting.SoundEnable; config.sound_type = DeviceConfig.ToServerString(multimediaSetting.SoundType); config.volume = multimediaSetting.Volume; } /// /// 更新UI显示 /// private void UpdateUI() { // 更新视频录制开关 videoSwitch.Init(multimediaSetting.VideoRecordEnable, OnVideoSwitchChanged); // 更新音效开关 soundSwitch.Init(multimediaSetting.SoundEnable, OnSoundSwitchChanged); // 更新视频时长显示 int videoLengthIndex = GetVideoLengthIndexFromValue(multimediaSetting.RecordDuration); if (videoLengthValueText != null && videoLengthIndex >= 0 && videoLengthIndex < videoLengthStrList.Count) { videoLengthValueText.text = videoLengthStrList[videoLengthIndex]; } // 更新音效类型显示 int soundEffectIndex = GetSoundEffectIndexFromValue(multimediaSetting.SoundType); if (soundEffectValueText != null && soundEffectIndex >= 0 && soundEffectIndex < soundEffectStrList.Count) { soundEffectValueText.text = soundEffectStrList[soundEffectIndex]; } // 更新音量滑块 volumeSlider.value = multimediaSetting.Volume; volumeSlider.onValueChanged.RemoveAllListeners(); volumeSlider.onValueChanged.AddListener(OnVolumeChanged); if (volumeValueText != null) { volumeValueText.text = $"{multimediaSetting.Volume}"; } LoadingUI.Hide(); UIManager.Instance.RegisterBackAction(Back); } /// /// 视频录制开关变化 /// private void OnVideoSwitchChanged(bool isOn) { multimediaSetting.VideoRecordEnable = isOn; WriteMultimediaSetting(); } /// /// 音效开关变化 /// private void OnSoundSwitchChanged(bool isOn) { multimediaSetting.SoundEnable = isOn; WriteMultimediaSetting(); } Coroutine volumeChangeCoroutine; /// /// 音量滑块变化 /// private void OnVolumeChanged(float value) { byte volume = (byte)Mathf.Clamp(value, 0, 15); multimediaSetting.Volume = volume; if (volumeValueText != null) { volumeValueText.text = $"{volume}"; } if (volumeChangeCoroutine != null) { StopCoroutine(volumeChangeCoroutine); } volumeChangeCoroutine = StartCoroutine(CountDownAndWriteMultimediaSetting(0.5f)); } private IEnumerator CountDownAndWriteMultimediaSetting(float delay) { yield return new WaitForSeconds(delay); WriteMultimediaSetting(); } /// /// 音量滑块拖动结束 /// public void OnVolumeSliderEndDrag() { WriteMultimediaSetting(); } /// /// 点击视频时长设置 /// public void ClickVideoLength() { MutiSelectPage m = Instantiate(videoLengthSelect.gameObject, transform).GetComponent(); int currentIndex = GetVideoLengthIndexFromValue(multimediaSetting.RecordDuration); m.Init(currentIndex, OnVideoLengthSelected); m.gameObject.SetActive(true); UIManager.Instance.RegisterBackAction(m.Cancel); } /// /// 视频时长选择回调 /// private void OnVideoLengthSelected(int index) { if (index >= 0 && index < videoLengthValueList.Count) { multimediaSetting.RecordDuration = videoLengthValueList[index]; WriteMultimediaSetting(); } } /// /// 点击音效类型设置 /// public void ClickSoundEffect() { MutiSelectPage m = Instantiate(soundEffectSelect.gameObject, transform).GetComponent(); int currentIndex = GetSoundEffectIndexFromValue(multimediaSetting.SoundType); m.Init(currentIndex, OnSoundEffectSelected); m.gameObject.SetActive(true); UIManager.Instance.RegisterBackAction(m.Cancel); } /// /// 音效类型选择回调 /// private void OnSoundEffectSelected(int index) { if (index >= 0 && index < soundEffectValueList.Count) { multimediaSetting.SoundType = soundEffectValueList[index]; WriteMultimediaSetting(); } } /// /// 根据视频时长值获取选项索引 /// private int GetVideoLengthIndexFromValue(byte value) { for (int i = 0; i < videoLengthValueList.Count; i++) { if (videoLengthValueList[i] == value) { return i; } } // 默认值返回5秒(索引1) return 1; } /// /// 根据音效类型值获取选项索引 /// private int GetSoundEffectIndexFromValue(SoundEffectType value) { for (int i = 0; i < soundEffectValueList.Count; i++) { if (soundEffectValueList[i] == value) { return i; } } // 默认值返回Hello(索引0) return 0; } public void Back() { callback?.Invoke(); Destroy(gameObject); } } }