以吃鸡手游为例,游戏的参数分为操作、音频、社交等等模块,每个模块数据的管理对应一个model实例,这些model实例保存于一个单例settingManager中以便获取:
public class SettingManager
{
private BattleSettingModel battleSettingModel_;
private BasicSettingModel basicSettingModel_;
private DrugSettingModel drugSettingModel_;
//。。。
private static SettingManager instance;
public static SettingManager Instance {
get {
if (instance == null) {
instance = new SettingManager();
}
return instance;
}
}
//。。。
}
例如一个basicSettingModel,管理游戏的基本设置,在该类中,使用
Dictionary<BasicSettingType, BasicSettingItem> basicItemsDic
来保存参数类型到参数数据的映射,用
public object GetSettingItemValue(BasicSettingType settingType) {
return basicItemsDic[settingType].settingValue.value;
}
以及
public bool UpdateSettingItemValue(BasicSettingType settingType, object value)
{
if (basicItemsDic[settingType].settingValue.value.Equals(value) == false) {
SettingValue settingValue = basicItemsDic[settingType].settingValue;
settingValue.value = value;
settingValue.Write(settingType.ToString());//写入到本地文件
if (this.OnControlBasicTypeChangedDelegate != null) {
this.OnControlBasicTypeChangedDelegate(settingType);
}
return true;
} else {
return false;
}
}
进行数据的读写,注意basicItemsDic只是一个运行时暂存的数据结构,真正的数据保存于本地或者远程服务器。在model初始化时,我们会将basicItemsDic通过本地或远程获取的手段赋值:
public BasicSettingModel() {
foreach (BasicSettingType type in Enum.GetValues(typeof(BasicSettingType))) {
basicItemsDic[type] = new BasicSettingItem(type, new SettingValueEnum());
}
ParseSettingFromLocal();
}
在上述UpdateSettingItemValue的时候,不仅会更改basicItemsDic的内容,还会进一步修改本地或者远程服务器数据,这里通过
settingValue.Write(settingType.ToString())
的方式写入到本地,实际上本地文件的读写调用的是UnityEngine.PlayerPrefs。如:
public class SettingValueFloat : SettingValue
{
public override void Write(string key)
{
PlayerPrefs.SetFloat(key, (float)value);
}
public override void Read(string key)
{
value = PlayerPrefs.GetFloat(key);
}
}
包括代码中ParseSettingFromLocal()也是通过这种方式读取数据的。