You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

游戏开发中创建仅含常量值的职业数据结构的最佳实践

游戏职业数据结构的最佳实践方案

你的思路方向是对的——用统一类封装职业属性,再集中管理实例,但还有几个优化点能让代码更健壮、易维护:

  • 使用只读属性保证数据不可变
    职业的基础属性属于游戏常量,运行时不应该被随意修改。用只读属性封装字段,能避免意外篡改:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:05:01