查看: 1624|回复: 1
打印 上一主题 下一主题

[其他] 数据保存和读取

[复制链接]
may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52336
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2016-8-29 21:12:16 |只看该作者 |倒序浏览
所有的游戏开发都离不开数据存储的操作,[color=rgb(85, 85, 85) !important]unity3d也不例外,下面向大家介绍一下Unity3D相关的数据存储方法。
PlayerPrefs是Unity系统自带的一种最简单的存储方式,以plist键值对方式存放,pc存放在注册表中,ios存放在plist中,而android存放在data文件夹/中。

PlayerPrefs类支持3中数据类型的保存和读取,浮点型,整形,和字符串型。

    分别对应的函数为:
    SetInt();保存整型数据;
    GetInt();读取整形数据;
    SetFloat();保存浮点型数据;
    GetFlost();读取浮点型数据;
    SetString();保存字符串型数据;
    GetString();读取字符串型数据;

这些函数的用法基本一致使用Set进行保存,使用Get进行读取。
因为 PlayerPrefs是已键值对的形式存储数据,我们在读写的过程都需要指定
一个键 对应一个值 ,所以如果有多个数据需要保存就会产生大量的代码,本人
在最近开发中写了一个小工具通过封装来解决多条数据保存,不到之处希望大家指出

代码如下:
  1. using UnityEngine;
  2. using System;
  3. using System.Reflection;
  4. /// <summary>
  5. /// 数据保存
  6. /// </summary>
  7. public static class PlayerPrefsExtend
  8. {
  9.     /// <summary>
  10.     /// 保存
  11.     /// </summary>
  12.     /// <param name="name"></param>
  13.     /// <param name="o"></param>
  14.     public static void Save(string name, object o)
  15.     {
  16.         Type t = o.GetType();
  17.         FieldInfo[] fiedls = t.GetFields();
  18.         for (int i = 0; i < fiedls.Length; i++)
  19.         {
  20.             string saveName = name + "." + fiedls[i].Name;
  21.             switch (fiedls[i].FieldType.Name)
  22.             {
  23.                 case "String":
  24.                     PlayerPrefs.SetString(saveName, fiedls[i].GetValue(o).ToString());
  25.                     break;
  26.                 case "Int32":
  27.                 case "Int64":
  28.                 case "Int":
  29.                 case "uInt":
  30.                     PlayerPrefs.SetInt(saveName, (int)fiedls[i].GetValue(o));
  31.                     break;
  32.                 case "Float":
  33.                     PlayerPrefs.SetFloat(saveName, (float)fiedls[i].GetValue(o));
  34.                     break;
  35.             }
  36.         }
  37.     }
  38.     /// <summary>
  39.     /// 读取
  40.     /// </summary>
  41.     /// <typeparam name="T"></typeparam>
  42.     /// <param name="name"></param>
  43.     /// <returns></returns>
  44.     public static T GetValue<T>(string name) where T : new()
  45.     {
  46.         T newObj = new T();

  47.         Type t = newObj.GetType();
  48.         FieldInfo[] fiedls = t.GetFields();
  49.         for (int i = 0; i < fiedls.Length; i++)
  50.         {
  51.             string saveName = name + "." + fiedls[i].Name;
  52.             switch (fiedls[i].FieldType.Name)
  53.             {
  54.                 case "String":
  55.                     fiedls[i].SetValue(newObj, PlayerPrefs.GetString(saveName));
  56.                     break;
  57.                 case "Int32":
  58.                 case "Int64":
  59.                 case "Int":
  60.                 case "uInt":
  61.                     fiedls[i].SetValue(newObj, PlayerPrefs.GetInt(saveName));
  62.                     break;
  63.                 case "Float":
  64.                     fiedls[i].SetValue(newObj, PlayerPrefs.GetFloat(saveName));
  65.                     break;
  66.             }
  67.         }
  68.         return newObj;
  69.     }
  70. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

0

主题

1

听众

2259

积分

中级设计师

Rank: 5Rank: 5

纳金币
512
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2016-8-29 21:35:01 |只看该作者
那請問如何應用? 有例子嗎?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-14 04:09 , Processed in 0.137559 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部