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

Unity泛型SettingGroup遍历类型转换问题及可扩展设置需求

解决方案

核心问题在于SettingGroup基类未定义Init方法,导致无法直接在非泛型的SettingGroup实例上调用该方法。以下是两种可行的修复方案:

方案一:给基类SettingGroup添加抽象Init方法

修改SettingGroup基类,将泛型类中的Init方法抽象到基类,这样遍历字典时无需转换类型即可直接调用:

修改后的SettingGroup基类

public abstract class SettingGroup : ScriptableObject
{
    // 定义抽象Init方法,强制子类实现
    public abstract void Init();
}

泛型SettingGroup无需额外修改

原泛型类已实现Init方法,现在在SettingsManager中可直接调用:

private void LoadDefaultSetting()
{
    foreach (var pair in _settingDictionary)
    {
        pair.Value.Init();
    }
}

方案二:通过反射调用泛型Init方法

若不想修改基类结构,可通过反射调用泛型类的Init方法:

private void LoadDefaultSetting()
{
    foreach (var pair in _settingDictionary)
    {
        var initMethod = pair.Value.GetType().GetMethod("Init");
        initMethod?.Invoke(pair.Value, null);
    }
}

额外优化建议

  • 简化_settingDictionary的键值对定义,直接用设置类的Type作为键,更准确:
    public void Init()
    {
        _settingDictionary = new Dictionary<Type, SettingGroup>
        {
            { typeof(AudioSettings), _audioSettings },
            { typeof(VideoSettings), _videoSettings }
        };
    }
    
  • 在SettingsSO中添加CopyDataTo抽象方法,确保所有子类实现数据复制逻辑:
    public abstract class SettingsSO : ScriptableObject
    {
        public string Description;
        public abstract void CopyDataTo(SettingsSO target);
    }
    
    以AudioSettings为例实现该方法:
    public override void CopyDataTo(SettingsSO target)
    {
        if (target is AudioSettings audioTarget)
        {
            audioTarget.MusicEnabled = MusicEnabled;
            audioTarget.SoundEnabled = SoundEnabled;
            audioTarget.MusicVolume = MusicVolume;
            audioTarget.SoundVolume = SoundVolume;
        }
    }
    

内容的提问来源于stack exchange,提问作者Aleksei Burov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:09:12