游戏开发中创建仅含常量值的职业数据结构的最佳实践
游戏职业数据结构的最佳实践方案
你的思路方向是对的——用统一类封装职业属性,再集中管理实例,但还有几个优化点能让代码更健壮、易维护:
使用只读属性保证数据不可变
职业的基础属性属于游戏常量,运行时不应该被随意修改。用只读属性封装字段,能避免意外篡改:public class InGameClass { public string ClassName { get; } public int StartingHP { get; } public string PicturePath { get; } public InGameClass(string className, int startingHP, string picturePath) { ClassName = className; StartingHP = startingHP; PicturePath = picturePath; } }用静态类集中管理职业实例
把存储职业的类改成静态类,避免不必要的实例化,同时将实例设为static readonly,防止运行时被替换:public static class InGameClasses { public static readonly InGameClass Mage = new InGameClass("Mage", 90, "Resources/Class/Mage"); public static readonly InGameClass Warrior = new InGameClass("Warrior", 100, "Resources/Class/Warrior"); }结合枚举实现快速索引(可选)
如果业务逻辑中需要频繁根据类型查找职业,可以新增枚举并搭配字典,让索引更直观:public enum ClassType { Mage, Warrior } public static class InGameClasses { private static readonly Dictionary<ClassType, InGameClass> _classMap = new() { { ClassType.Mage, new InGameClass("Mage", 90, "Resources/Class/Mage") }, { ClassType.Warrior, new InGameClass("Warrior", 100, "Resources/Class/Warrior") } }; public static InGameClass GetClass(ClassType type) => _classMap[type]; }从配置文件加载数据(进阶优化)
当职业数量增多或需要频繁调整属性时,把数据存到JSON/XML等配置文件,无需改代码重新编译:
示例配置文件(classes.json):[ { "ClassName": "Mage", "StartingHP": 90, "PicturePath": "Resources/Class/Mage" }, { "ClassName": "Warrior", "StartingHP": 100, "PicturePath": "Resources/Class/Warrior" } ]加载代码示例:
public static class InGameClasses { private static readonly Dictionary<string, InGameClass> _classMap = new(); static InGameClasses() { var jsonContent = File.ReadAllText("classes.json"); var classList = JsonSerializer.Deserialize<List<InGameClass>>(jsonContent); foreach (var cls in classList) { _classMap[cls.ClassName] = cls; } } public static InGameClass GetClass(string className) => _classMap[className]; }
内容的提问来源于stack exchange,提问作者Francesco Laghetti
相关产品推荐
相关产品推荐

