DCS/ruiyiweiUX/Assets/Scripts/UI/BaseSettingPanel.cs

279 lines
7.8 KiB
C#
Raw Permalink Normal View History

2026-06-09 13:59:11 +08:00
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System.Collections.Generic;
/// <summary>
/// 通用设置面板基类
/// 提供标准化的设置面板布局和功能
/// </summary>
public abstract class BaseSettingPanel : BasePanel
{
[Header("面板标题")]
public TextMeshProUGUI TitleText;
public TextMeshProUGUI SubtitleText;
[Header("设置项容器")]
public Transform SettingsContainer;
public GameObject SettingItemPrefab;
[Header("标准按钮")]
public Button HomeButton;
public Button ConfirmButton;
public Button BackButton;
public Button ResetButton;
protected SettingsViewModel _viewModel;
protected List<SettingItemComponent> _settingItems = new List<SettingItemComponent>();
public override void Init()
{
_viewModel = new SettingsViewModel();
SetupTitle();
SetupStandardButtons();
CreateSettingItems();
LoadCurrentValues();
}
/// <summary>
/// 设置面板标题
/// </summary>
protected virtual void SetupTitle()
{
if (TitleText != null)
TitleText.text = GetPanelTitle();
if (SubtitleText != null)
SubtitleText.text = GetPanelSubtitle();
}
/// <summary>
/// 设置标准按钮事件
/// </summary>
protected virtual void SetupStandardButtons()
{
if (HomeButton != null)
{
HomeButton.onClick.AddListener(() =>
{
OnHomeButtonClicked();
ClosePanel();
UIManager.Instance.ShowPanel<MainPanel>();
});
}
if (ConfirmButton != null)
{
ConfirmButton.onClick.AddListener(() =>
{
if (ValidateAndApplySettings())
{
OnConfirmButtonClicked();
ClosePanel();
}
});
}
if (BackButton != null)
{
BackButton.onClick.AddListener(() =>
{
OnBackButtonClicked();
ClosePanel();
});
}
if (ResetButton != null)
{
ResetButton.onClick.AddListener(() =>
{
ResetToDefaults();
OnResetButtonClicked();
});
}
}
/// <summary>
/// 创建设置项
/// </summary>
protected virtual void CreateSettingItems()
{
if (SettingsContainer == null) return;
var settingConfigs = GetSettingConfigurations();
foreach (var config in settingConfigs)
{
var settingItem = CreateSettingItem(config);
if (settingItem != null)
{
_settingItems.Add(settingItem);
}
}
}
/// <summary>
/// 创建单个设置项
/// </summary>
protected virtual SettingItemComponent CreateSettingItem(SettingConfig config)
{
GameObject itemGO;
if (SettingItemPrefab != null)
{
itemGO = Instantiate(SettingItemPrefab, SettingsContainer);
}
else
{
// 如果没有预制体,创建基础设置项
itemGO = CreateBasicSettingItem();
}
var settingItem = itemGO.GetComponent<SettingItemComponent>();
if (settingItem == null)
{
settingItem = itemGO.AddComponent<SettingItemComponent>();
}
// 配置设置项
ConfigureSettingItem(settingItem, config);
return settingItem;
}
/// <summary>
/// 配置设置项
/// </summary>
protected virtual void ConfigureSettingItem(SettingItemComponent item, SettingConfig config)
{
item.SetInfo(config.Title, config.Description, config.Icon);
switch (config.Type)
{
case SettingType.Slider:
var slider = item.CreateSlider(config.MinValue, config.MaxValue, config.CurrentValue, config.WholeNumbers);
item.OnSliderChanged.AddListener((value) => OnSettingChanged(config.Key, value));
break;
case SettingType.Toggle:
var toggle = item.CreateToggle(config.CurrentValue > 0);
item.OnToggleChanged.AddListener((value) => OnSettingChanged(config.Key, value));
break;
case SettingType.InputField:
var input = item.CreateInputField(config.Placeholder, config.StringValue);
item.OnInputChanged.AddListener((value) => OnSettingChanged(config.Key, value));
break;
case SettingType.Dropdown:
var dropdown = item.CreateDropdown(config.Options, (int)config.CurrentValue);
item.OnDropdownChanged.AddListener((value) => OnSettingChanged(config.Key, value));
break;
case SettingType.Button:
var button = item.CreateButton(config.ButtonText);
item.OnButtonClicked.AddListener(() => OnSettingButtonClicked(config.Key));
break;
}
}
/// <summary>
/// 创建基础设置项GameObject
/// </summary>
protected virtual GameObject CreateBasicSettingItem()
{
var itemGO = new GameObject("SettingItem", typeof(RectTransform));
itemGO.transform.SetParent(SettingsContainer, false);
// 设置布局
var rect = itemGO.GetComponent<RectTransform>();
rect.anchorMin = new Vector2(0, 1);
rect.anchorMax = new Vector2(1, 1);
rect.sizeDelta = new Vector2(0, 60);
return itemGO;
}
/// <summary>
/// 验证并应用设置
/// </summary>
protected virtual bool ValidateAndApplySettings()
{
// 默认返回true子类可以重写进行验证
return true;
}
/// <summary>
/// 重置为默认值
/// </summary>
protected virtual void ResetToDefaults()
{
var configs = GetSettingConfigurations();
foreach (var config in configs)
{
OnSettingChanged(config.Key, config.DefaultValue);
}
LoadCurrentValues();
}
/// <summary>
/// 加载当前值到UI
/// </summary>
protected virtual void LoadCurrentValues()
{
// 子类实现具体的值加载逻辑
}
// 抽象方法 - 子类必须实现
protected abstract string GetPanelTitle();
protected abstract string GetPanelSubtitle();
protected abstract List<SettingConfig> GetSettingConfigurations();
// 虚方法 - 子类可以重写
protected virtual void OnSettingChanged(string key, object value) { }
protected virtual void OnSettingButtonClicked(string key) { }
protected virtual void OnHomeButtonClicked() { }
protected virtual void OnConfirmButtonClicked() { }
protected virtual void OnBackButtonClicked() { }
protected virtual void OnResetButtonClicked() { }
public virtual void ClosePanel()
{
UIManager.Instance.HidePanel<BaseSettingPanel>();
}
}
/// <summary>
/// 设置项配置
/// </summary>
[System.Serializable]
public class SettingConfig
{
public string Key;
public string Title;
public string Description;
public Sprite Icon;
public SettingType Type;
public float MinValue;
public float MaxValue;
public float CurrentValue;
public float DefaultValue;
public bool WholeNumbers;
public string StringValue;
public string Placeholder;
public string[] Options;
public string ButtonText;
}
/// <summary>
/// 设置类型
/// </summary>
public enum SettingType
{
Slider,
Toggle,
InputField,
Dropdown,
Button
}