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