Files
Continentis/Assets/Scripts/MainGame/Character/CharacterData/CharacterAttributeCollection.cs

81 lines
2.9 KiB
C#
Raw Normal View History

2026-03-20 11:56:50 -04:00
using System;
using Sirenix.OdinInspector;
using SLSUtilities.General;
using UnityEngine;
namespace Continentis.MainGame.Character
{
/// <summary>
/// 使用新版 SerializedDictionary 和 CharacterAttributePair 的全新配置集合类。
/// (目前不替换旧的 CharacterAttributesDefaultCollection请按需测试本版本
/// </summary>
[CreateAssetMenu(fileName = "CharacterAttributeCollection",
menuName = "Continentis/MainGame/Character/CharacterAttributeCollection", order = 1)]
public class CharacterAttributeCollection : ScriptableObject
{
[Title("Attributes新特性架构测试版")] [Tooltip("角色的通常属性:支持下拉菜单/手写自由切换的优雅 UI 交互!")]
public SerializedDictionary<string, float, CharacterAttributePair> originalAttributes;
[Tooltip("初始化时赋予给CurrentAttributes的属性\n" +
"留空则默认为0填数字则使用数字。")]
public SerializedDictionary<string, string> runtimeAttributes;
}
/// <summary>
/// 自定义的带有极简美学 UI 的字典序列化结构体。
/// 可以同时包含“下拉菜单安全输入”以及“纯手写高级输入”两种状态。
/// </summary>
[Serializable]
public struct CharacterAttributePair : ISerializedPair<string, float>
{
[SerializeField] [HideInInspector] public string attributeKey;
[SerializeField] [HideInInspector] private bool useManualInput;
[ShowInInspector]
[PropertyOrder(0)]
[HideIf("useManualInput")]
[HorizontalGroup("H")]
[HideLabel]
[ValueDropdown("@Continentis.MainGame.Base.EditorBaseCollection.GetCharacterAttributesDropdown($property)",
IsUniqueList = true, DropdownHeight = 400)]
[InlineButton("ToggleMode", Icon = SdfIconType.ListUl, Label = "")]
public string DropdownKey
{
get => attributeKey;
set => attributeKey = value;
}
[ShowInInspector]
[PropertyOrder(0)]
[ShowIf("useManualInput")]
[HorizontalGroup("H")]
[HideLabel]
[InlineButton("ToggleMode", Icon = SdfIconType.PencilSquare, Label = "")]
public string ManualKey
{
get => attributeKey;
set => attributeKey = value;
}
[PropertyOrder(10)] [HorizontalGroup("H", MarginLeft = 10, Width = 100)] [HideLabel]
public float attributeValue;
// 供 SLSUtilities.General 的接口实现
public string Key
{
get => attributeKey;
set => attributeKey = value;
}
public float Value
{
get => attributeValue;
set => attributeValue = value;
}
private void ToggleMode()
{
useManualInput = !useManualInput;
}
}
}