172 lines
4.6 KiB
C#
172 lines
4.6 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|