赞
踩
代码很简单没有难度,都有注解,随便 康一康 就会了。
使用 ScriptableObject 类来再Unity编辑器情况下进行基础数据存储
注意:ScriptableObject 只能在Unity编辑器条件下进行动态存储 打包之后是无法进行数据保存的
也就是说打包之后 ScriptableObject 文件只具有可读性
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 数据存储
/// </summary>
[SerializeField]
[CreateAssetMenu(fileName = "New Item", menuName = "Inventory/New Item")]
public class DataStorage_ZH : ScriptableObject
{
public int _Int;
public string _String;
public float _Float;
}
DataPersistence_ZH 类 使用 PlayerPrefs里面的方法为主体进行编辑的
KeyTypeStrAdd 枚举类可以根据 具体内容进行自定义填充
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 数据持久化存储 /// </summary> public class DataPersistence_ZH : MonoBehaviour { [Header("数据")] public DataStorage_ZH _DataStorage; [Header("String 数据")] public InputField _TextStr; [Header("Float 数据")] public InputField _TextFloat; [Header("Int 数据")] public InputField _TextInt; //单例 public static DataPersistence_ZH _DataPersistence; private void Awake() { _DataPersistence = this; } void Update() { //存储 if (Input.GetKeyDown(KeyCode.Q)) { //Key值 加类型(名字/ 生长习性) StorageData(_DataStorage._String + nameof(_DataStorage._String), _TextStr.text,KeyTypeStrAdd._String); //StorageData(_DataStorage._String +"标题", "Name"); StorageData(_DataStorage._String + nameof(_DataStorage._Float), _TextFloat.text,KeyTypeStrAdd._Float); StorageData(_DataStorage._String + nameof(_DataStorage._Int), _TextInt.text,KeyTypeStrAdd._Int); } //查询 if (Input.GetKeyDown(KeyCode.E)) { //名字查询 StartCoroutine(InquireData(_DataStorage._String, nameof(_DataStorage._String))); //StartCoroutine(InquireData(_DataStorage._String, "标题")); StartCoroutine(InquireData(_DataStorage._String, nameof(_DataStorage._Float))); StartCoroutine(InquireData(_DataStorage._String, nameof(_DataStorage._Int))); } } /// <summary> /// 数据删除单个 /// </summary> public void DeleteKeyData(string _DeleteKey) { //从首选项中删除键及其相应的值 PlayerPrefs.DeleteKey(_DeleteKey); } /// <summary> /// 数据删除所有 /// </summary> public void DeleteKeyData() { //从首选项中删除所有键和值 谨慎使用 PlayerPrefs.DeleteAll(); } #region 数据存储 /// <summary> /// 数据存储 string /// </summary> /// <param 储存 Key 值="_DataKey"></param> /// <param 存储 Value 值="_DataValue"></param> public void StorageData(string _DataKey, string _DataValue) { //设置由键标识的首选项的值 数据存储在磁盘 PlayerPrefs.SetString(_DataKey, _DataValue); //数据存储在文件 _DataStorage._String = _DataValue; //将所有修改的首选项写入磁盘 PlayerPrefs.Save(); } /// <summary> /// 数据存储 float /// </summary> /// <param 储存 Key 值="_DataKey"></param> /// <param 存储 Value 值="_DataValue"></param> public void StorageData(string _DataKey, float _DataValue) { //设置由键标识的首选项的值 数据存储在磁盘 PlayerPrefs.SetFloat(_DataKey, _DataValue); //数据存储在文件 _DataStorage._Float = _DataValue; //将所有修改的首选项写入磁盘 PlayerPrefs.Save(); } /// <summary> /// 数据存储 int /// </summary> /// <param 储存 Key 值="_DataKey"></param> /// <param 存储 Value 值="_DataValue"></param> public void StorageData(string _DataKey, int _DataValue) { //设置由键标识的首选项的值 数据存储在磁盘 PlayerPrefs.SetInt(_DataKey, _DataValue); //数据存储在文件 _DataStorage._Int = _DataValue; //将所有修改的首选项写入磁盘 PlayerPrefs.Save(); } /// <summary> /// 数据查询带类型 /// </summary> /// <param 储存 Key 值="_DataKey"></param> /// <param 存储 Value 值="_DataValue"></param> /// <param 变量="_KeyType"></param> public void StorageData(string _DataKey, string _DataValue, KeyTypeStrAdd _KeyType) { switch (_KeyType) { case KeyTypeStrAdd._String: //设置由键标识的首选项的值 数据存储在磁盘 PlayerPrefs.SetString(_DataKey, _DataValue); //数据存储在文件 //_DataStorage._String = _DataValue; // 数据存储在文件 _DataStorage.GetType().GetField(_KeyType.ToString()).SetValue(_DataStorage, _KeyType.ToString()); //将所有修改的首选项写入磁盘 PlayerPrefs.Save(); break; case KeyTypeStrAdd._Float: //设置由键标识的首选项的值 数据存储在磁盘 PlayerPrefs.SetFloat(_DataKey, float.Parse(_DataValue)); 数据存储在文件 //_DataStorage._Float = float.Parse(_DataValue); //数据存储在文件 _DataStorage.GetType().GetField(_KeyType.ToString()).SetValue(_DataStorage, float.Parse(_DataValue)); //将所有修改的首选项写入磁盘 PlayerPrefs.Save(); break; case KeyTypeStrAdd._Int: //设置由键标识的首选项的值 数据存储在磁盘 PlayerPrefs.SetInt(_DataKey, (int)float.Parse(_DataValue)); 数据存储在文件 //_DataStorage._Int = (int)float.Parse(_DataValue); // 数据存储在文件 _DataStorage.GetType().GetField(_KeyType.ToString()).SetValue(_DataStorage, (int)float.Parse(_DataValue)); //将所有修改的首选项写入磁盘 PlayerPrefs.Save(); break; default: break; } } #endregion /// <summary> /// 数据查询 /// 添加新数据 /// </summary> /// <param 数据查询 Key 值="_DataKey"></param> /// <param 查询 Kry 值添加的字符="_StrKeyAdd"></param> /// <returns></returns> public IEnumerator InquireData(string _DataKey,string _StrKeyType) { //缓存值 string _InquireDataStr; //Float float _InquireDataFloat; //Int int _InquireDataInt; if (_DataKey != null) { //类型判断 switch (_StrKeyType) { //如果是 String 类型 case "_String": //如果存在 返回首选项文件中key对应的值 _InquireDataStr = PlayerPrefs.GetString(_DataKey + _StrKeyType); //数据返回 //_DataStorage.GetType().GetField(_StrKeyType).GetValue(_DataStorage); _TextStr.text = _InquireDataStr; yield return 0; break; //如果是 Float 类型 case "_Float": //如果存在 返回首选项文件中key对应的值 _InquireDataFloat = PlayerPrefs.GetFloat(_DataKey + _StrKeyType); 数据返回 //_DataStorage.GetType().GetField(_StrKeyType).GetValue(_DataStorage); _TextFloat.text = _InquireDataFloat.ToString(); yield return 0; break; //如果是 Int 类型 case "_Int": //如果存在 返回首选项文件中key对应的值 _InquireDataInt = PlayerPrefs.GetInt(_DataKey + _StrKeyType); 数据返回 //_DataStorage.GetType().GetField(_StrKeyType).SetValue(_DataStorage, _InquireDataInt); _TextInt.text = _InquireDataInt.ToString(); yield return 0; break; default: break; } } } /// <summary> /// 枚举类型添加 /// </summary> public enum KeyTypeStrAdd { _String, _Float, _Int, } }
Unity 持久化存储示例场景: 下载链接.
暂时先这样吧,如果有时间的话就会更新,实在看不明白就留言,看到我会回复的。
路漫漫其修远兮,与君共勉。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。