外观
Symbol
约 359 字大约 1 分钟
2026-03-14
核心定义
Symbol<T>为针对字符串的类型安全和高效比较的封装,同时其编辑器扩展能够改善在编辑器界面输入字符串的体验
核心代码
[Serializable]
public struct Symbol<T> : IEquatable<Symbol<T>> where T : struct
{
[SerializeField] private string id;
public Symbol(string id) => this.id = id;
public string Value => id;
public int Hash { get { EnsureInitialized(); return _hash; } }
public static implicit operator string(Symbol<T> symbol) => symbol.id ?? "";
}使用方法
定义新Symbol
在任何位置定义一个标记结构体(即空结构体定义)
public struct Fruit {}这意味着一种类型为Fruit的字符串Symbol就被定义了
使用Symbol
private Symbol<Fruit> _aFruit = new("Apple");SymbolProvider
为了减少策划在编辑器界面天天输错字符串的笨笨行为,SymbolProvider属性支持将某个类中的Symbol字段定义提交,所有被提交的定义可以在编辑器内快速选定。
[SymbolProvider(typeof(FsmId),group: KeyGameflow)]
public static class GameflowConstant
{
public const string KeyGameflow = "Gameflow";
public static readonly Symbol<FsmId> GameflowFsmId = new(KeyGameflow);
public static readonly Symbol<FsmId> SomeOtherFsmId = new("OtherFsm");
}SymbolSelector
用于将某个Symbol字段标记为编辑器内可选择
[SerializeField,SymbolSelector]
private Symbol<FsmId> stateMachineId = new("DefaultFSM");[AttributeUsage(AttributeTargets.Field)]
public class SymbolSelectorAttribute : PropertyAttribute
{
public string[] TargetGroups { get; }
public bool AllowManualInput { get; set; }
public SymbolSelectorAttribute(params string[] targetGroups) => TargetGroups = targetGroups;
}- 若
TargetGroup为空,默认可选择该类型全部提交项 - 若
AllowManualInput开启,则字段右侧会出现+号,允许手动输入字符串
编辑器内效果

更新日志
2026/4/16 11:07
查看所有更新日志
e4055-Merge pull request #12 from azaneNH37/doc于