unity PlayerPrefs類擴充

最近在寫一個app,需要做本地化的數據存儲。本來依據宣雨松的教程(Unity3D研究院之使用C#語言建立本地數據庫),利用sqlite做了個小型的本地化數據庫,在電腦端已經運行良好,可以到了手機上卻無法讀取、存儲數據庫。無奈,只好另尋它法。

Unity對於簡單的數據本地化存儲已經有 了PlayerPrefs類,該類使用方便,容易理解。 PlayerPrefs類以標準的“”鍵-值“方式存儲,類似Dictionary。但是, PlayerPrefs不能存儲數組,以下代碼對 PlayerPrefs進行了擴充,實現了存儲數組的功能,在實際中使用十分靈活。


using UnityEngine;
using System;

public static class Playerprefs
{
	#region Vector 3
	
	/// <summary>
	/// Stores a Vector3 value into a Key
	/// </summary>
	public static bool SetVector3(string key, Vector3 vector)
	{
		return SetFloatArray(key, new float[3] { vector.x, vector.y, vector.z });
	}
	
	/// <summary>
	/// Finds a Vector3 value from a Key
	/// </summary>
	public static Vector3 GetVector3(string key)
	{
		float[] floatArray = GetFloatArray(key);
		if (floatArray.Length < 3)
			return Vector3.zero;
		return new Vector3(floatArray[0], floatArray[1], floatArray[2]);
	}
	
	#endregion
	
	#region Bool Array
	
	/// <summary>
	/// Stores a Bool Array or Multiple Parameters into a Key
	/// </summary>
	public static bool SetBoolArray(string key, params bool[] boolArray)
	{
		if (boolArray.Length == 0) return false;
		
		System.Text.StringBuilder sb = new System.Text.StringBuilder();
		for (int i = 0; i < boolArray.Length - 1; i++)
			sb.Append(boolArray[i]).Append("|");
		sb.Append(boolArray[boolArray.Length - 1]);
		
		try { PlayerPrefs.SetString(key, sb.ToString()); }
		catch (Exception e) { return false; }
		return true;
	}
	
	/// <summary>
	/// Returns a Bool Array from a Key
	/// </summary>
	public static bool[] GetBoolArray(string key)
	{
		if (PlayerPrefs.HasKey(key))
		{
			string[] stringArray = PlayerPrefs.GetString(key).Split("|"[0]);
			bool[] boolArray = new bool[stringArray.Length];
			for (int i = 0; i < stringArray.Length; i++)
				boolArray[i] = Convert.ToBoolean(stringArray[i]);
			return boolArray;
		}
		return new bool[0];
	}
	
	/// <summary>
	/// Returns a Bool Array from a Key
	/// Note: Uses default values to initialize if no key was found
	/// </summary>
	public static bool[] GetBoolArray(string key, bool defaultValue, int defaultSize)
	{
		if (PlayerPrefs.HasKey(key))
			return GetBoolArray(key);
		bool[] boolArray = new bool[defaultSize];
		for (int i = 0; i < defaultSize; i++)
			boolArray[i] = defaultValue;
		return boolArray;
	}
	
	#endregion
	
	#region Int Array
	
	/// <summary>
	/// Stores a Int Array or Multiple Parameters into a Key
	/// </summary>
	public static bool SetIntArray(string key, params int[] intArray)
	{
		if (intArray.Length == 0) return false;
		
		System.Text.StringBuilder sb = new System.Text.StringBuilder();
		for (int i = 0; i < intArray.Length - 1; i++)
			sb.Append(intArray[i]).Append("|");
		sb.Append(intArray[intArray.Length - 1]);
		
		try { PlayerPrefs.SetString(key, sb.ToString()); }
		catch (Exception e) { return false; }
		return true;
	}
	
	/// <summary>
	/// Returns a Int Array from a Key
	/// </summary>
	public static int[] GetIntArray(string key)
	{
		if (PlayerPrefs.HasKey(key))
		{
			string[] stringArray = PlayerPrefs.GetString(key).Split("|"[0]);
			int[] intArray = new int[stringArray.Length];
			for (int i = 0; i < stringArray.Length; i++)
				intArray[i] = Convert.ToInt32(stringArray[i]);
			return intArray;
		}
		return new int[0];
	}
	
	/// <summary>
	/// Returns a Int Array from a Key
	/// Note: Uses default values to initialize if no key was found
	/// </summary>
	public static int[] GetIntArray(string key, int defaultValue, int defaultSize)
	{
		if (PlayerPrefs.HasKey(key))
			return GetIntArray(key);
		int[] intArray = new int[defaultSize];
		for (int i = 0; i < defaultSize; i++)
			intArray[i] = defaultValue;
		return intArray;
	}
	
	#endregion
	
	#region Float Array
	
	/// <summary>
	/// Stores a Float Array or Multiple Parameters into a Key
	/// </summary>
	public static bool SetFloatArray(string key, params float[] floatArray)
	{
		if (floatArray.Length == 0) return false;
		
		System.Text.StringBuilder sb = new System.Text.StringBuilder();
		for (int i = 0; i < floatArray.Length - 1; i++)
			sb.Append(floatArray[i]).Append("|");
		sb.Append(floatArray[floatArray.Length - 1]);
		
		try
		{
			PlayerPrefs.SetString(key, sb.ToString());
		}
		catch (Exception e)
		{
			return false;
		}
		return true;
	}
	
	/// <summary>
	/// Returns a Float Array from a Key
	/// </summary>
	public static float[] GetFloatArray(string key)
	{
		if (PlayerPrefs.HasKey(key))
		{
			string[] stringArray = PlayerPrefs.GetString(key).Split("|"[0]);
			float[] floatArray = new float[stringArray.Length];
			for (int i = 0; i < stringArray.Length; i++)
				floatArray[i] = Convert.ToSingle(stringArray[i]);
			return floatArray;
		}
		return new float[0];
	}
	
	/// <summary>
	/// Returns a String Array from a Key
	/// Note: Uses default values to initialize if no key was found
	/// </summary>
	public static float[] GetFloatArray(string key, float defaultValue, int defaultSize)
	{
		if (PlayerPrefs.HasKey(key))
			return GetFloatArray(key);
		float[] floatArray = new float[defaultSize];
		for (int i = 0; i < defaultSize; i++)
			floatArray[i] = defaultValue;
		return floatArray;
	}
	
	#endregion
	
	#region String Array
	
	/// <summary>
	/// Stores a String Array or Multiple Parameters into a Key w/ specific char seperator
	/// </summary>
	public static bool SetStringArray(string key, char separator, params string[] stringArray)
	{
		if (stringArray.Length == 0) return false;
		try
		{ PlayerPrefs.SetString(key, String.Join(separator.ToString(), stringArray)); }
		catch (Exception e)
		{ return false; }
		return true;
	}
	
	/// <summary>
	/// Stores a Bool Array or Multiple Parameters into a Key
	/// </summary>
	public static bool SetStringArray(string key, params string[] stringArray)
	{
		if (!SetStringArray(key, "\n"[0], stringArray))
			return false;
		return true;
	}
	
	/// <summary>
	/// Returns a String Array from a key & char seperator
	/// </summary>
	public static string[] GetStringArray(string key, char separator)
	{
		if (PlayerPrefs.HasKey(key))
			return PlayerPrefs.GetString(key).Split(separator);
		return new string[0];
	}
	
	/// <summary>
	/// Returns a Bool Array from a key
	/// </summary>
	public static string[] GetStringArray(string key)
	{
		if (PlayerPrefs.HasKey(key))
			return PlayerPrefs.GetString(key).Split("\n"[0]);
		return new string[0];
	}
	
	/// <summary>
	/// Returns a String Array from a key & char seperator
	/// Note: Uses default values to initialize if no key was found
	/// </summary>
	public static string[] GetStringArray(string key, char separator, string defaultValue, int defaultSize)
	{
		if (PlayerPrefs.HasKey(key))
			return PlayerPrefs.GetString(key).Split(separator);
		string[] stringArray = new string[defaultSize];
		for (int i = 0; i < defaultSize; i++)
			stringArray[i] = defaultValue;
		return stringArray;
	}
	
	/// <summary>
	/// Returns a String Array from a key
	/// Note: Uses default values to initialize if no key was found
	/// </summary>
	public static String[] GetStringArray(string key, string defaultValue, int defaultSize)
	{
		return GetStringArray(key, "\n"[0], defaultValue, defaultSize);
	}
	
	#endregion
}

該類的使用和PlayerPrefs基本一致。下面是示例代碼。

         //存儲浮點型數組
         Playerprefs.SetFloatArray("array1",new float[] {0,1,2,3,4});
	//取出數組
	Playerprefs.GetFloatArray("array1");
該類沒有實現PlayerPrefs類的haskey特性,當需要知道是否已經存儲有某key的數組時,可以利用Playerprefs.GetFloatArray(”key“).Length == 0 來判斷。
擴充的PlayerPrefs可以存儲各種類型的數組,使用靈活方便,對於一些小的項目十分合適。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章