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
相关产品推荐
相关产品推荐

