如何为Enum枚举绑定Vector3Int类型的方向偏移值?
原生C#枚举(Enum)完全不支持存储Vector3Int这类非整数类型的自定义值,你设想的那种BOTTOM = new Vector3Int(...)的枚举写法,会直接触发编译器语法错误,根本无法通过编译。
之前在W3Schools看到的枚举自定义赋值逻辑,本质上都是给枚举成员替换底层的整数值:所有枚举的底层类型仅支持byte、int、long等整数类型,枚举成员的赋值要求是编译期可确定的整数常量,根本无法存储运行时才能生成的对象实例。你看到的
March=6这类写法,只是把原来默认从0开始自增的整数,改成了指定的6,后面的April自动顺延为7,本质上存的还是整数,不是自定义对象。
你想要“不用记数组索引、通过具名方向直接取对应偏移值”的开发体验完全可以实现,不需要硬写不符合语法的枚举代码,实际游戏开发中常用两种低侵入的方案:
方案1:静态类绑定方向与偏移值
直接将具名方向和对应的Vector3Int偏移作为静态只读值放在同一个静态类中管理,使用体验和你预期的几乎一致:
// 先定义纯枚举作为方向的统一标识,枚举值可以直接对应原数组的索引,保留原有数组的兼容性 public enum Direction { Bottom = 0, Left = 1, Top = 2, Right = 3 } // 静态映射类,统一管理方向对应的偏移值 public static class DirectionMap { // 直接具名定义每个方向的偏移,不需要再数数组索引找位置 public static readonly Vector3Int BottomOffset = new Vector3Int(0, -1, 0); public static readonly Vector3Int LeftOffset = new Vector3Int(-1, 0, 0); public static readonly Vector3Int TopOffset = new Vector3Int(0, 1, 0); public static readonly Vector3Int RightOffset = new Vector3Int(1, 0, 0); // 提供通过枚举快速查偏移的通用方法,兼容原有的数组调用逻辑 public static Vector3Int GetOffset(Direction dir) => dir switch { Direction.Bottom => BottomOffset, Direction.Left => LeftOffset, Direction.Top => TopOffset, Direction.Right => RightOffset, _ => Vector3Int.zero }; }
使用时不需要记任何索引,直接写DirectionMap.TopOffset即可拿到对应的Top方向偏移,和你预期的Directions.TOP调用体验完全一致。
方案2:给枚举扩展取值能力
如果你更习惯用枚举做方向的统一标识(比如做方向判断、遍历邻接方向的场景),可以给Direction枚举写扩展方法,把获取偏移的逻辑绑定到枚举类型上:
public static class DirectionExtension { public static Vector3Int GetOffset(this Direction direction) => direction switch { Direction.Bottom => new Vector3Int(0, -1, 0), Direction.Left => new Vector3Int(-1, 0, 0), Direction.Top => new Vector3Int(0, 1, 0), Direction.Right => new Vector3Int(1, 0, 0), _ => Vector3Int.zero }; }
使用时的调用逻辑为Direction.Top.GetOffset(),既保留了枚举的类型安全优势,又完全实现了“通过方向名直接取对应偏移”的需求,后续修改偏移值时也不用再调整数组索引,维护成本比硬写数组低很多。
内容的提问来源于stack exchange,提问作者caleidon

