Unity3d_用PlayerPrefs保存和读取数组

因为做的项目是移动平台上的小游戏,所以用不到数据库什么比较大型的存储,所以就选择unity自带的存储PlayerPrefs。


PlayerPrefs自带的函数:

      PlayerPrefsX.SetVector3
      PlayerPrefsX.GetVector3
      PlayerPrefsX.SetIntArray
      PlayerPrefsX.GetIntArray
      PlayerPrefsX.SetFloatArray
      PlayerPrefsX.GetFloatArray
      PlayerPrefsX.SetStringArray
      PlayerPrefsX.GetStringArray

但是发现若是要存储数组之类的信息比较麻烦,然后在网上找到了这篇文章。


原文:http://blog.csdn.net/jbjwpzyl3611421/article/details/11113215


我只学过C#编程,就单独取一段出来:

// Contribution (Created CSharp Version) 10/2010: Daniel P. Rossi (DR9885)
// Contribution (Created Bool Array) 10/2010: Daniel P. Rossi (DR9885)
// Contribution (Made functions public) 01/2011: Bren

using UnityEngine;
using System;

public static class PlayerPrefsX
{
    #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
}


暂时对int型数组的使用率比较高,但是这里面的函数不太够用,所以自己加了几个(写得不好,有什么更好的实现方式请指出,谢谢):

        /// <summary>
	/// Gets the length of the int array.
	/// </summary>
	/// <returns>The int array length.</returns>
	/// <param name="key">Key.</param>
	public static int GetIntArrayLength(string key)
	{
		if (PlayerPrefs.HasKey(key))
		{
			return PlayerPrefs.GetString(key).Split("|"[0]).Length;
		}
		
		return 0;
	}

<pre name="code" class="csharp">        /// <summary>
	/// Adds the int in int array.
	/// </summary>
	/// <returns><c>true</c>, if int in int array was added, <c>false</c> otherwise.</returns>
	public static bool AddIntInIntArray(string key, int num, int value)
	{
		//此函数不是很高效,仍需改进
		if (PlayerPrefs.HasKey (key) && num >= 0) 
		{
			string[] stringArray = PlayerPrefs.GetString(key).Split("|"[0]);//将字符串去“|”,保存在字符串数组中
			int iStringArrayLength = stringArray.Length;//记录字符串数组的长度
			
			int[] intArray;
			if(num < iStringArrayLength)
			{
				//				return ChangeIntInIntArray(key, num, value);
				//当所给的num小于等于字符串数组长度时,根据对应num修改其值
				intArray = new int[iStringArrayLength];
				for (int i = 0; i < iStringArrayLength; i++)
				{
					if(i == num)
						intArray[i] = value;
					else
						intArray[i] = Convert.ToInt32(stringArray[i]);
				}
			}else
			{
				//当所给的num大于字符串数组长度时,最后一位赋值,空缺处补0
				intArray = new int[num];
				for (int i = 0; i < num; i++)
				{
					if(i < iStringArrayLength)
						intArray[i] = Convert.ToInt32(stringArray[i]);
					else if(i == num - 1)
						intArray[i] = value;
					else
						intArray[i] = 0;
				}
			}

			//将int数组转入一个字符串中
			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;
		}
		
		return false;
	}


 

<pre name="code" class="csharp">        /// <summary>
	/// Changes the int in Int Array.
	/// </summary>
	/// <returns><c>true</c>, if int in array was changed, <c>false</c> otherwise.</returns>
	public static bool ChangeIntInIntArray(string key, int num, int value)
	{
		if (PlayerPrefs.HasKey (key) && num >= 0) 
		{
			string[] stringArray = PlayerPrefs.GetString(key).Split("|"[0]);
			int iStringArrayLength = stringArray.Length;
			
			if(num > iStringArrayLength - 1)
				return false;
			
			int[] intArray = new int[iStringArrayLength];
			for (int i = 0; i < iStringArrayLength; i++)
			{
				if(i == num)
					intArray[i] = value;
				else
					intArray[i] = Convert.ToInt32(stringArray[i]);
			}
			
			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;
			
		} else
			return false;
	}


 

<pre name="code" class="csharp">        /// <summary>
	/// Gets the int in int array.
	/// </summary>
	/// <returns>The int in int array.</returns>
	public static int GetIntInIntArray(string key, int num)
	{
		if (PlayerPrefs.HasKey(key))
		{
			string[] stringArray = PlayerPrefs.GetString(key).Split("|"[0]);
			
			if(num > stringArray.Length - 1)
				return 0;
			
			for (int i = 0; i < stringArray.Length; i++)
				if(i == num)
					return Convert.ToInt32(stringArray[i]);
		}
		
		return 0;
	}


 差不多就这么多了,补充了获取数组里的单个值,改变数组中的单个值,添加数组里的单个值,获取数组长度函数,写的不好,但是还是比较实用的。 




  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值