天天看點

手遊中遊戲設定的加載、存儲方式

以吃雞手遊為例,遊戲的參數分為操作、音頻、社交等等子產品,每個子產品資料的管理對應一個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()也是通過這種方式讀取資料的。