DCS/ruiyiweiUX/Assets/Scripts/Views/VolumeSettingPanel.cs

172 lines
4.6 KiB
C#
Raw Permalink Normal View History

2026-06-09 13:59:11 +08:00
using UnityEngine;
using UnityEngine.UI;
using TMPro;
/// <summary>
/// 音量设置面板
/// 提供系统音量调节功能
/// </summary>
public class VolumeSettingPanel : BasePanel
{
[Header("音量控制")]
public Slider VolumeSlider;
public TextMeshProUGUI VolumeText;
public Button TestSoundButton;
[Header("按钮")]
public Button HomeButton;
public Button ConfirmButton;
public Button BackButton;
private SettingsViewModel _vm;
private AudioSource _testAudioSource;
public override void Init()
{
_vm = new SettingsViewModel();
InitializeUI();
SetupAudioTest();
}
private void InitializeUI()
{
// 初始化滑块值
if (VolumeSlider != null)
{
VolumeSlider.minValue = 10;
VolumeSlider.maxValue = 100;
VolumeSlider.wholeNumbers = true;
VolumeSlider.value = Mathf.Clamp(_vm.Volume, 10, 100);
// 监听滑块变化
VolumeSlider.onValueChanged.AddListener(OnVolumeChanged);
}
// 初始化文本显示
int initialVolume = VolumeSlider != null ? (int)VolumeSlider.value : Mathf.Clamp(_vm.Volume, 10, 100);
UpdateVolumeText(initialVolume);
SyncMainPanelVolume(initialVolume);
// 按钮事件
if (HomeButton != null)
{
HomeButton.onClick.AddListener(() =>
{
ConfirmDialog.Show("确认", "是否返回主界面?", () =>
{
ReturnToHome();
});
});
}
if (ConfirmButton != null)
{
ConfirmButton.onClick.AddListener(ApplyAndBack);
}
if (BackButton != null)
{
BackButton.onClick.AddListener(() =>
ConfirmDialog.Show("确认", "是否返回设置界面?", () =>
{
ClosePanel();
ClosePanel();
})
);
}
if (TestSoundButton != null)
{
TestSoundButton.onClick.AddListener(PlayTestSound);
}
}
private void SetupAudioTest()
{
// 创建测试音频源
var audioGO = new GameObject("TestAudioSource");
audioGO.transform.SetParent(transform);
_testAudioSource = audioGO.AddComponent<AudioSource>();
// 加载测试音频clip如果存在
var testClip = Resources.Load<AudioClip>("Audio/DiDi");
if (testClip != null)
{
_testAudioSource.clip = testClip;
}
_testAudioSource.playOnAwake = false;
}
private void OnVolumeChanged(float value)
{
int volumePercent = (int)value;
UpdateVolumeText(volumePercent);
SyncMainPanelVolume(volumePercent);
// 实时更新测试音频源的音量
if (_testAudioSource != null)
{
_testAudioSource.volume = value / 100f;
}
// 可选:实时应用系统音量(但可能会造成频繁调用)
// 建议只在确认时应用,这里仅作预览
// Debug.Log($"VolumeSettingPanel: 音量预览 {volumePercent}%");
}
private void UpdateVolumeText(int volume)
{
if (VolumeText != null)
{
VolumeText.text = $"{volume}%";
}
}
private void SyncMainPanelVolume(int volumePercent)
{
var mainPanel = UIManager.Instance.GetPanel<MainPanel>();
if (mainPanel != null)
{
mainPanel.UpdateAudioVolume(volumePercent);
}
}
private void PlayTestSound()
{
if (_testAudioSource != null && _testAudioSource.clip != null)
{
_testAudioSource.Play();
}
else
{
// 如果没有测试音频,创建一个简单的提示音
Debug.Log($"播放测试音 - 当前音量: {VolumeSlider.value}%");
// 可以在这里集成系统提示音或生成简单音频
}
}
private void ApplyAndBack()
{
if (VolumeSlider != null)
{
int finalVolume = (int)VolumeSlider.value;
_vm.Volume = finalVolume;
SyncMainPanelVolume(finalVolume);
Debug.Log($"VolumeSettingPanel: 应用音量设置 {finalVolume}%");
}
ClosePanel();
}
void OnDestroy()
{
// 清理音频资源
if (_testAudioSource != null)
{
Destroy(_testAudioSource.gameObject);
}
}
}