2.基本方法

2.基本方法


2.1 知识点

PlayerPrefs是什么

PlayerPrefs是Unity提供的可以用于存储读取玩家数据的公共类。

存储相关

PlayerPrefs的数据存储

  • PlayerPrefs的数据存储类似于键值对存储,一个键对应一个值。
  • 提供了存储3种数据的方法 int float string。
  • 键: string类型。
  • 值:int float string 对应3种API。

SetInt方法 SetFloat方法 SetString方法 存储数据

//设置由 key 标识的偏好的值。
PlayerPrefs.SetInt("myAge", 18);
PlayerPrefs.SetFloat("myHeight", 177.5f);
PlayerPrefs.SetString("myName", "林文韬");

Save方法 马上存储数据到硬盘中

//将所有修改的偏好写入磁盘。
//直接调用Set相关方法只会把数据存到内存里。
//当游戏结束时 Unity会自动把数据存到硬盘中。
//如果游戏不是正常结束的而是崩溃 数据是不会存到硬盘中的。
//只要调用该方法 就会马上存储到硬盘中。
PlayerPrefs.Save();

PlayerPrefs局限性

//PlayerPrefs是有局限性的 它只能存3种类型的数据。
//如果你想要存储别的类型的数据 只能降低精度 或者上升精度来进行存储。
bool sex = true;
PlayerPrefs.SetInt("sex", sex ? 1 : 0);

如果不同类型用同一键名进行存储 会进行覆盖

PlayerPrefs.SetInt("myAge", 18);
PlayerPrefs.SetFloat("myAge", 20.2f);//覆盖上一行存储的myAge数据

读取相关

注意:运行时只要你Set了对应键值对 即使你没有马上存储Save在本地 也能够读取出信息

GetInt方法 GetFloat方法 GetString方法 读取数据

//返回偏好设置文件中与 key 对应的值(如果存在)。
//int
int age = PlayerPrefs.GetInt("myAge");
print(age);//0 int类型的myAge被float类型的myAge覆盖 会返回int类型的默认值0
//读取数据相关的方法 可以传入第二个参数充当默认值
//前提是 如果找不到myAge对应的值 就会返回函数的第二个参数 默认值
age = PlayerPrefs.GetInt("myAge", 100);
print(age);//100
//float
float height = PlayerPrefs.GetFloat("myHeight", 1000f);
print(height);//177.5
//string
string name = PlayerPrefs.GetString("myName");
print(name);
//第二个参数 默认值 对于我们的作用
//就是 在得到没有的数据的时候 就可以用它来进行基础数据的初始化

HasKey方法 判断数据是否存在

//如果 key 在偏好中存在,则返回 true。
//主要用于有没有存在相同键的问题 而不是判空保护 因为就算没有也就返回默认值
if (PlayerPrefs.HasKey("myName"))
{
    print("存在myName对应的键值对数据");
}

删除数据

DeleteKey方法 删除指定键值对

//从偏好中删除 key 及其对应值。
PlayerPrefs.DeleteKey("myAge");

DeleteAll方法 删除所有存储的信息

//从偏好中删除所有键和值。请谨慎使用。
PlayerPrefs.DeleteAll();

总结

  • Set
  • Get
  • HasKey
  • Del

2.2 知识点代码

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

public class Lesson02_基本方法 : MonoBehaviour
{    
    void Start()
    {
        #region 知识点一 PlayerPrefs是什么

        //是Unity提供的可以用于存储读取玩家数据的公共类

        #endregion

        #region 知识点二 存储相关

        //PlayerPrefs的数据存储 类似于键值对存储 一个键对应一个值
        //提供了存储3种数据的方法 int float string
        //键: string类型 
        //值:int float string 对应3种API

        //SetInt方法 SetFloat方法 SetString方法 存储数据
        //设置由 key 标识的偏好的值。
        PlayerPrefs.SetInt("myAge", 18);
        PlayerPrefs.SetFloat("myHeight", 177.5f);
        PlayerPrefs.SetString("myName", "林文韬");

        //Save方法 马上存储数据到硬盘中
        //将所有修改的偏好写入磁盘。
        //直接调用Set相关方法 只会把数据存到内存里
        //当游戏结束时 Unity会自动把数据存到硬盘中
        //如果游戏不是正常结束的 而是崩溃 数据是不会存到硬盘中的
        //只要调用该方法 就会马上存储到硬盘中
        PlayerPrefs.Save();

        //PlayerPrefs局限性
        //PlayerPrefs是有局限性的 它只能存3种类型的数据
        //如果你想要存储别的类型的数据 只能降低精度 或者上升精度来进行存储
        bool sex = true;
        PlayerPrefs.SetInt("sex", sex ? 1 : 0);

        //如果不同类型用同一键名进行存储 会进行覆盖
        PlayerPrefs.SetInt("myAge", 18);
        PlayerPrefs.SetFloat("myAge", 20.2f);//覆盖上一行存储的myAge数据

        #endregion

        #region 知识点三 读取相关

        //注意:运行时只要你Set了对应键值对 即使你没有马上存储Save在本地 也能够读取出信息

        //GetInt方法 GetFloat方法 GetString方法 读取数据
        //返回偏好设置文件中与 key 对应的值(如果存在)。
        //int
        int age = PlayerPrefs.GetInt("myAge");
        print(age);//0 int类型的myAge被float类型的myAge覆盖 会返回int类型的默认值0
        //读取数据相关的方法 可以传入第二个参数充当默认值
        //前提是 如果找不到myAge对应的值 就会返回函数的第二个参数 默认值
        age = PlayerPrefs.GetInt("myAge", 100);
        print(age);//100
        //float
        float height = PlayerPrefs.GetFloat("myHeight", 1000f);
        print(height);//177.5
        //string
        string name = PlayerPrefs.GetString("myName");
        print(name);
        //第二个参数 默认值 对于我们的作用
        //就是 在得到没有的数据的时候 就可以用它来进行基础数据的初始化

        //HasKey方法 判断数据是否存在
        //如果 key 在偏好中存在,则返回 true。
        //主要用于有没有存在相同键的问题 而不是判空保护 因为就算没有也就返回默认值
        if (PlayerPrefs.HasKey("myName"))
        {
            print("存在myName对应的键值对数据");
        }

        #endregion

        #region 知识点四 删除数据

        //DeleteKey方法 删除指定键值对
        //从偏好中删除 key 及其对应值。
        PlayerPrefs.DeleteKey("myAge");

        //DeleteAll方法 删除所有存储的信息
        //从偏好中删除所有键和值。请谨慎使用。
        PlayerPrefs.DeleteAll();

        #endregion
    }

    //总结
    // Set
    // Get
    // HasKey
    // Del
}

2.3 练习题

现在有玩家信息类,有名字,年龄,攻击力,防御力等成员,为其封装两个方法,一个用来存储数据,一个用来读取数据

声明玩家类,添加存储和读取数据的方法

//玩家类
public class Player
{
    //成员变量
    public string name;
    public int age;
    public int atk;
    public int def;

    //这个变量 是一个 存储和读取的一个唯一key标识
    private string keyName;

    //构造函数的时候必须传一个唯一key标识
    public Player(string keyName)
    {
        this.keyName = keyName;
    }

    /// <summary>
    /// 存储数据
    /// </summary>
    public void Save()
    {
        //存储变量数据
        PlayerPrefs.SetString(keyName + "_name", name);
        PlayerPrefs.SetInt(keyName + "_age", age);
        PlayerPrefs.SetInt(keyName + "_atk", atk);
        PlayerPrefs.SetInt(keyName + "_def", def);

        //立即存储数据 防止游戏崩溃数据额丢失
        PlayerPrefs.Save();
    }

    /// <summary>
    /// 读取数据
    /// </summary>
    public void Load()
    {
        //读取数据,没有就给默认值
        name = PlayerPrefs.GetString(keyName + "_name", "未命名");
        age = PlayerPrefs.GetInt(keyName + "_age", 18);
        atk = PlayerPrefs.GetInt(keyName + "_atk", 10);
        def = PlayerPrefs.GetInt(keyName + "_def", 5);
    }
}

在Start函数里调用存储和读取

void Start()
{
    Player p1 = new Player("Player1");
    p1.Load();
    print(p1.name);
    print(p1.age);
    print(p1.atk);
    print(p1.def);

    p1.name = "林文韬";
    p1.age = 22;
    p1.atk = 40;
    p1.def = 10;
    //改了过后存储
    p1.Save();
}

现在在装备信息类,装备类中有id,数量两个成员。上一题的玩家类中包含一个List存储了拥有的所有装备信息。请在上一题的基础上,把装备信息的存储和读取加上

声明道具类,在玩家类添加道具相关的变量和方法

//道具类
public class Item
{
    public int id;
    public int num;
}

//玩家类
public class Player
{
    //成员变量
    public string name;
    public int age;
    public int atk;
    public int def;

    //拥有的装备信息
    public List<Item> itemList;

    //这个变量 是一个 存储和读取的一个唯一key标识
    private string keyName;

    //构造函数的时候必须传一个唯一key标识
    public Player(string keyName)
    {
        this.keyName = keyName;
    }

    /// <summary>
    /// 存储数据
    /// </summary>
    public void Save()
    {
        //存储变量数据
        PlayerPrefs.SetString(keyName + "_name", name);
        PlayerPrefs.SetInt(keyName + "_age", age);
        PlayerPrefs.SetInt(keyName + "_atk", atk);
        PlayerPrefs.SetInt(keyName + "_def", def);

        //存储有多少个装备
        PlayerPrefs.SetInt(keyName + "_itemListCount", itemList.Count);

        for (int i = 0; i < itemList.Count; i++)
        {
            //存储每一个装备的信息
            PlayerPrefs.SetInt(keyName + "_itemID" + i, itemList[i].id);
            PlayerPrefs.SetInt(keyName + "_itemNum" + i, itemList[i].num);
        }

        //立即存储数据 防止游戏崩溃数据额丢失
        PlayerPrefs.Save();

        Debug.Log($"Save keyName:{keyName} name:{name} age:{age} atk:{atk} def:{def} itemListCount:{itemList.Count}");
    }

    /// <summary>
    /// 读取数据
    /// </summary>
    public void Load()
    {
        //读取数据,没有就给默认值
        name = PlayerPrefs.GetString(keyName + "_name", "未命名");
        age = PlayerPrefs.GetInt(keyName + "_age", 18);
        atk = PlayerPrefs.GetInt(keyName + "_atk", 10);
        def = PlayerPrefs.GetInt(keyName + "_def", 5);

        //得到有多少个装备
        int itemListCount = PlayerPrefs.GetInt(keyName + "_itemListCount", 0);

        //初始化容器
        itemList = new List<Item>();
        Item item;
        for (int i = 0; i < itemListCount; i++)
        {
            item = new Item();
            item.id = PlayerPrefs.GetInt(keyName + "_itemID" + i);
            item.num = PlayerPrefs.GetInt(keyName + "_itemNum" + i);
            itemList.Add(item);
        }

        Debug.Log($"Load keyName:{keyName} name:{name} age:{age} atk:{atk} def:{def} itemListCount:{itemListCount}");
    }

    /// <summary>
    /// 添加道具方法
    /// </summary>
    /// <param name="item">添加的道具</param>
    public void AddItem(Item item)
    {
        bool isContainItem = IsContainItem(item);

        if (isContainItem)
        {
            //存在item就合并在一起
            AddItemNum(item);
            Debug.Log($"存在item:{item} item.id:{item.id} item.num:{item.num}");
        }
        else
        {
            itemList.Add(item);
            Debug.Log($"不存在item:{item} item.id:{item.id} item.num:{item.num}");
        }
    }

    /// <summary>
    /// 判断是否存在当前Item
    /// </summary>
    /// <param name="item"></param>
    /// <returns></returns>
    public bool IsContainItem(Item item)
    {
        foreach (Item curItem in itemList)
        {
            if (curItem.id == item.id)
            {
                return true;
            }
        }

        return false;
    }

    /// <summary>
    /// 添加已有道具数量
    /// </summary>
    /// <param name="item">添加的道具</param>
    public void AddItemNum(Item item)
    {
        foreach (Item curItem in itemList)
        {
            if (curItem.id == item.id)
            {
                curItem.num += item.num;
            }
        }
    }
}

在Start函数里调用增加装备

void Start()
{
    Player p2 = new Player("Player2");
    p2.Load();
    p2.name = "林文韬";
    p2.age = 22;
    p2.atk = 999;
    p2.def = 666;
    //改了过后存储
    p2.Save();

    Player p3 = new Player("Player3");
    p3.Load();
    p2.Save();

    //装备信息
    print(p2.itemList.Count);
    for (int i = 0; i < p2.itemList.Count; i++)
    {
        print("道具ID:" + p2.itemList[i].id);
        print("道具数量:" + p2.itemList[i].num);
    }

    //为玩家添加装备
    Item item = new Item();
    item.id = 1;
    item.num = 1;
    p2.AddItem(item);

    item = new Item();
    item.id = 2;
    item.num = 2;
    p2.AddItem(item);

    //添加装备后信息
    print(p2.itemList.Count);
    for (int i = 0; i < p2.itemList.Count; i++)
    {
        print("添加装备后道具ID:" + p2.itemList[i].id);
        print("添加装备后道具数量:" + p2.itemList[i].num);
    }

    p2.Save();
}

2.4 练习题代码

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

//道具类
public class Item
{
    public int id;
    public int num;
}

//玩家类
public class Player
{
    //成员变量
    public string name;
    public int age;
    public int atk;
    public int def;

    //拥有的装备信息
    public List<Item> itemList;

    //这个变量 是一个 存储和读取的一个唯一key标识
    private string keyName;

    //构造函数的时候必须传一个唯一key标识
    public Player(string keyName)
    {
        this.keyName = keyName;
    }

    /// <summary>
    /// 存储数据
    /// </summary>
    public void Save()
    {
        //存储变量数据
        PlayerPrefs.SetString(keyName + "_name", name);
        PlayerPrefs.SetInt(keyName + "_age", age);
        PlayerPrefs.SetInt(keyName + "_atk", atk);
        PlayerPrefs.SetInt(keyName + "_def", def);

        //存储有多少个装备
        PlayerPrefs.SetInt(keyName + "_itemListCount", itemList.Count);

        for (int i = 0; i < itemList.Count; i++)
        {
            //存储每一个装备的信息
            PlayerPrefs.SetInt(keyName + "_itemID" + i, itemList[i].id);
            PlayerPrefs.SetInt(keyName + "_itemNum" + i, itemList[i].num);
        }

        //立即存储数据 防止游戏崩溃数据额丢失
        PlayerPrefs.Save();

        Debug.Log($"Save keyName:{keyName} name:{name} age:{age} atk:{atk} def:{def} itemListCount:{itemList.Count}");
    }

    /// <summary>
    /// 读取数据
    /// </summary>
    public void Load()
    {
        //读取数据,没有就给默认值
        name = PlayerPrefs.GetString(keyName + "_name", "未命名");
        age = PlayerPrefs.GetInt(keyName + "_age", 18);
        atk = PlayerPrefs.GetInt(keyName + "_atk", 10);
        def = PlayerPrefs.GetInt(keyName + "_def", 5);



        //得到有多少个装备
        int itemListCount = PlayerPrefs.GetInt(keyName + "_itemListCount", 0);

        //初始化容器
        itemList = new List<Item>();
        Item item;
        for (int i = 0; i < itemListCount; i++)
        {
            item = new Item();
            item.id = PlayerPrefs.GetInt(keyName + "_itemID" + i);
            item.num = PlayerPrefs.GetInt(keyName + "_itemNum" + i);
            itemList.Add(item);
        }

        Debug.Log($"Load keyName:{keyName} name:{name} age:{age} atk:{atk} def:{def} itemListCount:{itemListCount}");
    }

    /// <summary>
    /// 添加道具方法
    /// </summary>
    /// <param name="item">添加的道具</param>
    public void AddItem(Item item)
    {
        bool isContainItem = IsContainItem(item);

        if (isContainItem)
        {
            //存在item就合并在一起
            AddItemNum(item);
            Debug.Log($"存在item:{item} item.id:{item.id} item.num:{item.num}");
        }
        else
        {
            itemList.Add(item);
            Debug.Log($"不存在item:{item} item.id:{item.id} item.num:{item.num}");
        }    
    }

    /// <summary>
    /// 判断是否存在当前Item
    /// </summary>
    /// <param name="item"></param>
    /// <returns></returns>
    public bool IsContainItem(Item item)
    {
       foreach(Item curItem in itemList)
        {
            if(curItem.id == item.id)
            {
                return true;
            }
        }

        return false;
    }

    /// <summary>
    /// 添加已有道具数量
    /// </summary>
    /// <param name="item">添加的道具</param>
    public void AddItemNum(Item item)
    {
        foreach (Item curItem in itemList)
        {
            if (curItem.id == item.id)
            {
                curItem.num += item.num;
            }
        }
    }
}

public class Lesson02_练习题 : MonoBehaviour
{
    void Start()
    {
        #region 练习题一
        //现在有玩家信息类,有名字,年龄,攻击力,防御力等成员
        //现在为其封装两个方法,一个用来存储数据,一个用来读取数据

        Player p1 = new Player("Player1");
        p1.Load();
        print(p1.name);
        print(p1.age);
        print(p1.atk);
        print(p1.def);

        p1.name = "林文韬";
        p1.age = 22;
        p1.atk = 40;
        p1.def = 10;
        //改了过后存储
        p1.Save();

        #endregion

        #region 练习题二
        //现在有装备信息类,装备类中有id,数量两个成员。
        //上一题的玩家类中包含一个List存储了拥有的所有装备信息。
        //请在上一题的基础上,把装备信息的存储和读取加上

        Player p2 = new Player("Player2");
        p2.Load();
        p2.name = "林文韬";
        p2.age = 22;
        p2.atk = 999;
        p2.def = 666;
        //改了过后存储
        p2.Save();

        Player p3 = new Player("Player3");
        p3.Load();
        p2.Save();

        //装备信息
        print(p2.itemList.Count);
        for (int i = 0; i < p2.itemList.Count; i++)
        {
            print("道具ID:" + p2.itemList[i].id);
            print("道具数量:" + p2.itemList[i].num);
        }

        //为玩家添加装备
        Item item = new Item();
        item.id = 1;
        item.num = 1;
        p2.AddItem(item);

        item = new Item();
        item.id = 2;
        item.num = 2;
        p2.AddItem(item);


        //添加装备后信息
        print(p2.itemList.Count);
        for (int i = 0; i < p2.itemList.Count; i++)
        {
            print("添加装备后道具ID:" + p2.itemList[i].id);
            print("添加装备后道具数量:" + p2.itemList[i].num);
        }

        p2.Save();

        #endregion
    }
}


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

×

喜欢就点赞,疼爱就打赏