日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Unity学习笔记--数据持久化之PlayerPrefs的使用

發布時間:2023/11/20 windows 36 coder
生活随笔 收集整理的這篇文章主要介紹了 Unity学习笔记--数据持久化之PlayerPrefs的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據持久化

PlayerPrefs相關

PlayerPrefs是Unity游戲引擎中的一個類,用于在游戲中存儲和訪問玩家的偏好設置和數據。它可以用來保存玩家的游戲進度、設置選項、最高分數等信息。PlayerPrefs將數據存儲在本地文件中,因此可以在游戲重新啟動時保持數據的持久性。

//PlayerPrefs的數據存儲 類似于鍵值對存儲 一個鍵對應一個值
//提供了存儲3種數據的方法 int float string
//鍵: string類型 
//值:int float string 對應3種API

PlayerPrefs.SetInt("myAge", 18);
PlayerPrefs.SetFloat("myHeight", 177.5f);
PlayerPrefs.SetString("myName", "TonyChang");

//直接調用Set相關方法 只會把數據存到內存里
//當游戲結束時 Unity會自動把數據存到硬盤中
//如果游戲不是正常結束的 而是崩潰 數據是不會存到硬盤中的
//只要調用該方法 就會馬上存儲到硬盤中
PlayerPrefs.Save();

//PlayerPrefs是有局限性的 它只能存3種類型的數據
//如果你想要存儲別的類型的數據 只能降低精度 或者上升精度來進行存儲
bool sex = true;
PlayerPrefs.SetInt("sex", sex ? 1 : 0);

//如果不同類型用同一鍵名進行存儲 會進行覆蓋
PlayerPrefs.SetFloat("myAge", 20.2f);

//注意 運行時 只要你Set了對應鍵值對
//即使你沒有馬上存儲Save在本地
//也能夠讀取出信息

//int
int age = PlayerPrefs.GetInt("myAge");
print(age);
//前提是 如果找不到myAge對應的值 就會返回函數的第二個參數 默認值
age = PlayerPrefs.GetInt("myAge", 100);
print(age);

//float
float height = PlayerPrefs.GetFloat("myHeight", 1000f);
print(height);

//string
string name = PlayerPrefs.GetString("myName");
print(name);

//第二個參數 默認值 對于我們的作用
//就是 在得到沒有的數據的時候 就可以用它來進行基礎數據的初始化

//判斷數據是否存在
if( PlayerPrefs.HasKey("myName") )
{
    print("存在myName對應的鍵值對數據");
}

//刪除指定鍵值對
PlayerPrefs.DeleteKey("myAge");
//刪除所有存儲的信息
PlayerPrefs.DeleteAll();

PlayerPrefs中存儲的數據存儲在哪里?

PC端: PlayerPrefs 存儲在 HKCU\Software[公司名稱][產品名稱] 項下的注冊表中
其中公司和產品名稱是 在“Project Settings”中設置的名稱。

安卓: /data/data/包名/shared_prefs/pkg-name.xml

PlayerPrefs中數據的唯一性,PlayerPrefs中數據的唯一性是由key決定的,不同的key決定了不同的數據,同一個項目中如果不同數據key相同會造成數據丟失,要保證數據名稱命名的唯一性規則。

優點:使用簡單

缺點:存儲數據類型有限、安全性差(直接找到在設備上的存儲的位置查看設置)

PlayerPrefs存儲工具類:

為了方便進行數據的存儲,使用PlayerPrefs中進行存儲方法的設置的存??!

主要實現功能是數據的讀和數據的取~ 通過反射進行數據類型的獲取,利用PlayerPrefs進行數據存儲。

using System;
using System.Collections;
using System.Reflection;
using UnityEngine;

namespace Framwork
{
    /// <summary>
    /// Playerprefs 存儲類
    /// </summary>
    public class PlayerPrefsManager
    {
        private static PlayerPrefsManager instance=new PlayerPrefsManager();

        public static PlayerPrefsManager Instance => instance;

        private PlayerPrefsManager()
        {
           
        }

        /// <summary>
        /// 存取數據的方法
        /// </summary>
        /// <param name="obj">數據實體</param>
        /// <param name="name">數據名稱</param>
        public void SaveData(object data, string keyName)
        {
            Type type = data.GetType();
            FieldInfo[] infos = type.GetFields();
            string tempKey="null";
            FieldInfo tempInfo = null;
            for (int i = 0; i < infos.Length; i++)
            {
                //獲取數據數據類型
                tempInfo = infos[i];
                Debug.Log("Types==="+tempInfo);
                //類的名字+類的類型 + 數據內容名字+數據類型
                //作為存儲的keyName鍵
                tempKey = keyName + "_" + type.Name + "_" + tempInfo.Name
                            + "_" + tempInfo.FieldType.Name;
                SaveValue(tempInfo.GetValue(data),tempKey);
            }
            //進行值的獲取
           //tempInfo.GetValue(data);
            PlayerPrefs.Save();
        }
        /// <summary>
        /// 讀取數據的類型
        /// </summary>
        /// <param name="type">要讀取的數據類型</param>
        /// <param name="name">要讀取的數據名稱</param>
        /// <returns>返回數據實體</returns>
        public object LoadData(Type type, string name)
        {
            //獲取數據中的類型
            FieldInfo[] infos = type.GetFields();
            //創建存儲數據信息的實體
            object data = Activator.CreateInstance(type);
            string tempName = null;
            FieldInfo tempInfo = null;
            for (int i = 0; i < infos.Length; i++)
            {
                tempInfo = infos[i];//數據結構中的數據名稱
                tempName = name + "_" + type.Name + "_" +tempInfo.Name+"_"
                    +tempInfo.FieldType.Name;//數據結構中的數據名稱類型
                //裝載的容器  容器中的數據 
                //進行數據裝載
                tempInfo.SetValue(data,LoadValue(tempInfo.FieldType,tempName));
            }
            return data;
        }

        /// <summary>
        /// 進行具體的類型數據的存儲
        /// </summary>
        /// <param name="data"></param>
        /// <param name="keyName"></param>
        private void SaveValue(object value, string keyName)
        {
            Type fieldType = value.GetType();
            if (fieldType == typeof(int))
            {
                Debug.Log("存儲int"+value);
                PlayerPrefs.SetInt(keyName,(int)value);
            }else if (fieldType == typeof(float))
            {
                Debug.Log("存儲float"+value);
                PlayerPrefs.SetFloat(keyName,(float)value);
            }else if (fieldType == typeof(string))
            {
                Debug.Log("存儲string"+value);
                PlayerPrefs.SetString(keyName,value.ToString());
            }
            //對于List存儲的設置
            //根據存儲的字段類型和IList是否是父子關系
            else if(typeof(IList).IsAssignableFrom(fieldType))
            {
                //父類裝子類
                IList list=value as IList;
                //存儲元素數量
                PlayerPrefs.SetInt(keyName,list.Count);
                Debug.Log("存儲List長度為"+list.Count);
                int index = 0;
                foreach (var obj in list)
                {
                    //存儲list列表中元素內容
                    //命名形式是 list名字+索引編號
                    //遞歸調用存儲
                    SaveValue(obj,keyName+index);
                    index++;
                }
            }else if (typeof(IDictionary).IsAssignableFrom(fieldType))
            {
                IDictionary dictionary = value as IDictionary;
                //存儲數據個數
                PlayerPrefs.SetInt(keyName,dictionary.Count);
                Debug.Log("存儲Dic長度為"+dictionary.Count);
                int index = 0;
                foreach (var key in dictionary.Keys)
                {
                    //存儲鍵
                    SaveValue(key,keyName+"_key_"+index);
                    //存儲值 
                    SaveValue(dictionary[key],keyName+"_value_"+index);
                    index++;
                }
            }//自定義數據類型的存儲 進行解析
            else 
            {
                SaveData(value,keyName);
            }
        }

        private object LoadValue(Type type, string name)
        {
            if (type == typeof(int))
            {
                return PlayerPrefs.GetInt(name,0);
            }else if (type == typeof(float))
            {
                return PlayerPrefs.GetFloat(name,0.0f);
            }else if (type == typeof(string))
            {
                return PlayerPrefs.GetString(name,"");
            }else if (typeof(IList).IsAssignableFrom(type))
            {
                //讀取列表
                int count = PlayerPrefs.GetInt(name);
                IList tempList=Activator.CreateInstance(type) as IList;
                for (int i = 0; i < count; i++)
                {
                    //獲取List中存儲元素的類型 type.GetGenericArguments()[0]
                    tempList.Add(LoadValue(type.GetGenericArguments()[0],name+i));
                }
                return tempList;
            }else if (typeof(IDictionary).IsAssignableFrom(type))
            {
                //進行對字典的讀取
                int count = PlayerPrefs.GetInt(name);
                IDictionary tempDictionary=Activator.CreateInstance(type) as IDictionary;
                for (int i = 0; i < count; i++)
                {
                    tempDictionary.Add(LoadValue(type.GetGenericArguments()[0], name + "_key_" + i),
                        LoadValue(type.GetGenericArguments()[1], name + "_value_" + i));
                }
                return tempDictionary;
            }
            else
            {
                //讀取自定義類成員的設置
                return LoadData(type, name);
            }
        }
    }
}

附:

測試腳本

using System.Collections.Generic;
using UnityEngine;

namespace Framwork
{
    //注意:
    //1 自定義數據結構類型中要有有效的無參構造函數
    
    public class PlayerInfo
    {
        public int age;
        public string name;
        public float height;
        public int sex;//0是女 1是男

        public ItemInfo ItemInfo;
        //list存儲測試
        public List<int> list;
        public Dictionary<int, string> dic;
        
    }

    public class ItemInfo
    {
        public int stu_no;//學號
        public int stu_class;//班級

        public ItemInfo()
        {
            
        }
        public ItemInfo(int no,int classNo)
        {
            stu_no = no;
            stu_class = classNo;
        }
    }
    /// <summary>
    /// 測試類
    /// </summary>
    public class TestPlayerPrefsTest:MonoBehaviour
    {
        private PlayerInfo playerInfo;
        private PlayerInfo playerInfo1;
        private void Start()
        {
             //讀取數據
             playerInfo = new PlayerInfo();         
            // Type fieldType = playerInfo.GetType();
             playerInfo.age = 18;
             playerInfo.name = "TonyChang";
             playerInfo.height = 175.8f;
             playerInfo.sex = 1;
             playerInfo.ItemInfo = new ItemInfo(2001, 2);

             playerInfo.list = new List<int>(){1,5,6,8};
             playerInfo.dic = new Dictionary<int, string>();
             playerInfo.dic.Add(1,"Tony");
             playerInfo.dic.Add(2,"Jeny");
             playerInfo.dic.Add(3,"JayChou");

             //進行數據保存
             PlayerPrefsManager.Instance.SaveData(playerInfo,"Player1");
             
             playerInfo1 = PlayerPrefsManager.Instance.LoadData(typeof(PlayerInfo), "Player1") as PlayerInfo;

             Debug.Log("age=="+playerInfo1.age);
             Debug.Log("name=="+playerInfo1.name);
             Debug.Log("sex=="+playerInfo1.sex);
             Debug.Log("List[1]=="+playerInfo1.list[1]);
             Debug.Log("Dic[1]=="+playerInfo1.dic[1]);
        }
    }
}

總結

以上是生活随笔為你收集整理的Unity学习笔记--数据持久化之PlayerPrefs的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。