3.不同平台的存储位置

3.不同平台的存储位置


3.1 知识点

PlayerPrefs存储的数据存在哪里?

在不同平台上,PlayerPrefs存储的位置会有所不同:

Windows

在Windows操作系统下,PlayerPrefs存储在注册表中的以下位置:

HKCU\Software\[公司名称]\[产品名称]

其中,公司名称和产品名称是在Unity的“Project Settings”中的Player栏设置的名称。

你可以通过以下步骤找到对应路径,并修改存储的值:

  1. 运行 regedit
  2. 找到 HKEY_CURRENT_USER
  3. 在其中找到 SOFTWARE
  4. 在其中找到 Unity
  5. 在其中找到 UnityEditor
  6. 在其中找到 公司名称
  7. 在其中找到 产品名称

Android

在Android操作系统下,PlayerPrefs存储在以下位置:

/data/data/包名/shared_prefs/pkg-name.xml

iOS

在iOS操作系统下,PlayerPrefs存储在以下位置:

/Library/Preferences/[应用ID].plist

PlayerPrefs数据唯一性

PlayerPrefs中不同数据的唯一性是由key决定的,不同的key决定了不同的数据。如果在同一项目中不同数据的key相同,会造成数据丢失。因此,要保证数据不丢失,需要建立一个保证key唯一的规则。


3.2 练习题

将知识点一中的练习题,改为可以支持存储多个玩家信息

// 略 详见Lesson2基本方法练习题

要在游戏中做一个排行榜功能,排行榜主要记录玩家名(可重复),玩家得分,玩家通关时间,请用PlayerPrefs存储读取排行榜相关信息

创建排行榜类和排行榜单条信息类,添加读取存储添加单条信息逻辑

/// <summary>
/// 排行榜多条具体信息
/// </summary>
public class RankListInfo
{
    //排行榜单条信息列表 
    public List<RankInfo> rankList;

    //初始化的时候就是读取数据
    public RankListInfo()
    {
        Load();
    }

    /// <summary>
    /// 新加排行榜信息
    /// </summary>
    public void Add(string name, int score, int time)
    {
        rankList.Add(new RankInfo(name, score, time));
    }

    //存储数据
    public void Save()
    {
        //存储有多少条数据
        PlayerPrefs.SetInt("rankListCount", rankList.Count);
        for (int i = 0; i < rankList.Count; i++)
        {
            RankInfo info = rankList[i];
            PlayerPrefs.SetString("rankInfo" + i, info.playerName);
            PlayerPrefs.SetInt("rankScore" + i, info.playerScore);
            PlayerPrefs.SetInt("rankTime" + i, info.playerTime);
        }
    }

    //读取数据
    private void Load()
    {
        int rankListCount = PlayerPrefs.GetInt("rankListCount", 0);
        rankList = new List<RankInfo>();
        for (int i = 0; i < rankListCount; i++)
        {
            RankInfo info = new RankInfo(PlayerPrefs.GetString("rankInfo" + i),
                                          PlayerPrefs.GetInt("rankScore" + i),
                                          PlayerPrefs.GetInt("rankTime" + i));
            rankList.Add(info);
        }
    }
}

/// <summary>
/// 排行榜单条信息
/// </summary>
public class RankInfo
{
    public string playerName;
    public int playerScore;
    public int playerTime;

    public RankInfo(string name, int score, int time)
    {
        playerName = name;
        playerScore = score;
        playerTime = time;
    }
}

在Start函数中创建排行榜,添加信息打印保存

void Start()
{
    //初始化一个排行榜
    RankListInfo rankListInfo = new RankListInfo();
    print(rankListInfo.rankList.Count);
    
    //打印排行榜所有信息
    for (int i = 0; i < rankListInfo.rankList.Count; i++)
    {
        print("姓名" + rankListInfo.rankList[i].playerName);
        print("分数" + rankListInfo.rankList[i].playerScore);
        print("时间" + rankListInfo.rankList[i].playerTime);
    }
    
    //添加排行榜单条信息保存
    rankListInfo.Add("林文韬", 100, 99);
    rankListInfo.Save();
}

3.3 练习题代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region 练习题二

/// <summary>
/// 排行榜多条具体信息
/// </summary>
public class RankListInfo
{
    //排行榜单条信息列表 
    public List<RankInfo> rankList;

    //初始化的时候就是读取数据
    public RankListInfo()
    {
        Load();
    }

    /// <summary>
    /// 新加排行榜信息
    /// </summary>
    public void Add(string name, int score, int time)
    {
        rankList.Add(new RankInfo(name, score, time));
    }

    //存储数据
    public void Save()
    {
        //存储有多少条数据
        PlayerPrefs.SetInt("rankListCount", rankList.Count);
        for (int i = 0; i < rankList.Count; i++)
        {
            RankInfo info = rankList[i];
            PlayerPrefs.SetString("rankInfo" + i, info.playerName);
            PlayerPrefs.SetInt("rankScore" + i, info.playerScore);
            PlayerPrefs.SetInt("rankTime" + i, info.playerTime);
        }
    }

    //读取数据
    private void Load()
    {
        int rankListCount = PlayerPrefs.GetInt("rankListCount", 0);
        rankList = new List<RankInfo>();
        for (int i = 0; i < rankListCount; i++)
        {
            RankInfo info = new RankInfo(PlayerPrefs.GetString("rankInfo" + i),
                                          PlayerPrefs.GetInt("rankScore" + i),
                                          PlayerPrefs.GetInt("rankTime" + i));
            rankList.Add(info);
        }
    }
}

/// <summary>
/// 排行榜单条信息
/// </summary>
public class RankInfo
{
    public string playerName;
    public int playerScore;
    public int playerTime;

    public RankInfo(string name, int score, int time)
    {
        playerName = name;
        playerScore = score;
        playerTime = time;
    }
}

#endregion

public class Lesson03_练习题 : MonoBehaviour
{
    void Start()
    {
        #region 练习题一 
        //将基本方法中的练习题,改为可以支持存储多个玩家信息

        //略 详见Lesson2基本方法练习题
        #endregion

        #region 练习题二
        //要在游戏中做一个排行榜功能
        //排行榜主要记录玩家名(可重复),玩家得分,玩家通关时间
        //请用PlayerPrefs存储读取排行榜相关信息

        //初始化一个排行榜
        RankListInfo rankListInfo = new RankListInfo();
        print(rankListInfo.rankList.Count);

        //打印排行榜所有信息
        for (int i = 0; i < rankListInfo.rankList.Count; i++)
        {
            print("姓名" + rankListInfo.rankList[i].playerName);
            print("分数" + rankListInfo.rankList[i].playerScore);
            print("时间" + rankListInfo.rankList[i].playerTime);
        }

        //添加排行榜单条信息保存
        rankListInfo.Add("林文韬", 100, 99);
        rankListInfo.Save();

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏