代码很简单没有难度,都有注解,随便 康一康 就会了。
使用 ScriptableObject 类来再Unity编辑器情况下进行基础数据存储
注意:ScriptableObject 只能在Unity编辑器条件下进行动态存储 打包之后是无法进行数据保存的
也就是说打包之后 ScriptableObject 文件只具有可读性
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///
/// 数据存储
///
[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;
///
/// 数据持久化存储
///
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)));
}
}
///
/// 数据删除单个
///
public void DeleteKeyData(string _DeleteKey)
{
//从首选项中删除键及其相应的值
PlayerPrefs.DeleteKey(_DeleteKey);
}
///
/// 数据删除所有
///
public void DeleteKeyData()
{
//从首选项中删除所有键和值 谨慎使用
PlayerPrefs.DeleteAll();
}
#region 数据存储
///
/// 数据存储 string
///
///
///
public void StorageData(string _DataKey, string _DataValue)
{
//设置由键标识的首选项的值 数据存储在磁盘
PlayerPrefs.SetString(_DataKey, _DataValue);
//数据存储在文件
_DataStorage._String = _DataValue;
//将所有修改的首选项写入磁盘
PlayerPrefs.Save();
}
///
/// 数据存储 float
///
///
///
public void StorageData(string _DataKey, float _DataValue)
{
//设置由键标识的首选项的值 数据存储在磁盘
PlayerPrefs.SetFloat(_DataKey, _DataValue);
//数据存储在文件
_DataStorage._Float = _DataValue;
//将所有修改的首选项写入磁盘
PlayerPrefs.Save();
}
///
/// 数据存储 int
///
///
///
public void StorageData(string _DataKey, int _DataValue)
{
//设置由键标识的首选项的值 数据存储在磁盘
PlayerPrefs.SetInt(_DataKey, _DataValue);
//数据存储在文件
_DataStorage._Int = _DataValue;
//将所有修改的首选项写入磁盘
PlayerPrefs.Save();
}
///
/// 数据查询带类型
///
///
///
///
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
///
/// 数据查询
/// 添加新数据
///
///
///
///
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;
}
}
}
///
/// 枚举类型添加
///
public enum KeyTypeStrAdd
{
_String,
_Float,
_Int,
}
}
Unity 持久化存储示例场景: 下载链接.
暂时先这样吧,如果有时间的话就会更新,实在看不明白就留言,看到我会回复的。
路漫漫其修远兮,与君共勉。