Unity3D之PlayerPrefs数据的存取
- 格式:docx
- 大小:11.84 KB
- 文档页数:1
unity3d面试题及答案2.alpha blend 工作原理3.写光照计算中的diffuse的计算公式4.lod是什么,优缺点是什么5.两种阴影判断的方法工作原理6.MipMap是什么?作用?7.用u3d实现2d游戏,有几种方式?答:一种用UI实现(GUI,NGUI...),一种是采纳3d实体对象(plane),绘制在3d对象上,调整摄像机,采纳平行投影模式或那么固定视角。
8.u3d中碰撞器和触发器的区分?答:触发器只是碰撞器身上的一个属性,碰撞器是触发器的载体。
9.物体发生碰撞的须要条件答:需要检测碰撞的物体身上存在刚体组件(或被检测物体),也要碰撞器collider10.CharacterController和Rigidbody的区分11.物体发生碰撞时,有几个阶段,分别对应的函数答:摒除触发,有3种,OnCollisionEnter(),OnCollisionStay(); OnCollisionE*it()12.u3d中,几种施加力的方式,描述出来。
答:a)爆炸力(AddE*plosionForce(force : float, forcePos : Vector3,radius : float, upwards : float, mode : ForceMode)),应用一个力到刚体来模拟爆炸效果,就是在爆炸力中心坐标position,搜寻在radius范围内的刚体,对其释放力作用,超出radius范围的刚体不受力作用,爆炸力将随着刚体的距离线性减弱。
b)力AddForce(force : Vector3, mode : ForceMode),主要施力给一个刚,使其移动。
c)位置力AddForceAtPosition(force : Vector3, position : Vector3, mode : ForceMode), 在position施加一个力,施力的主体将会受到一个力和力矩。
playerprefs原理
PlayerPrefs是Unity游戏引擎中提供的一种数据存储方式,
它允许开发者在游戏运行过程中保存和读取玩家的偏好设置、游戏
进度、用户配置等数据。
PlayerPrefs基本原理是将数据以键值对
的形式保存在本地磁盘上,这些数据可以跨越游戏会话而持久存在,即使游戏被关闭再重新打开,这些数据也能够被恢复。
PlayerPrefs
是基于特定平台的本地存储系统,因此它并不适合用于存储大量数
据或敏感数据。
PlayerPrefs的工作原理是将数据写入到特定的本地文件中,
这个文件通常是一个XML文件或者类似的格式,数据以键值对的形
式存储在这个文件中。
当需要读取数据时,Unity会从这个文件中
读取相应的键值对,并将数据加载到内存中。
当需要保存数据时,Unity会将数据写入到这个文件中。
这种方式简单而高效,适用于
保存一些简单的玩家设置、游戏进度等数据。
PlayerPrefs的使用非常方便,开发者可以通过简单的API来
读取和保存数据,而不需要关心数据存储的具体细节。
但是需要注
意的是,由于PlayerPrefs是基于本地文件的存储方式,因此在一
些特定情况下可能会存在数据丢失或被篡改的风险,开发者需要在
使用PlayerPrefs时注意数据的完整性和安全性。
总的来说,PlayerPrefs的原理是基于本地文件的键值对存储方式,适用于保存简单的玩家偏好设置、游戏进度等数据,但需要注意数据的安全性和完整性。
Unity3D游戏开发数据持久化PlayerPrefs的⽤法详解⼩编今天研究了在Unity3D中的数据持久化问题。
数据持久化在任何⼀个开发领域都是⼀个值得关注的问题,⼩到⼀个应⽤中配置⽂件的读写,⼤到数据库的管理维护,都可以看到数据持久化的⾝影。
⼩编在《》这篇⽂章中曾介绍了博主在寒假期间开发的Xml4DB框架,这是⼀个基于Xml的轻量级数据持久化框架,可以采⽤⾯向对象的⽅式来处理数据。
数据持久化从某种意义上来说,就是序列化和反序列化化的过程。
在.NET中我们可以将对象序列化为Xml、Json、⼆进制。
然后通过反序列化重新获得对象。
同样,在Android中我们可以通过使⽤Preferences来存储键值型数据来实现数据持久化(当然还有其它的⽅式,这⾥只是为了强调键值型数据)。
那么,在Unity3D中如何实现数据持久化呢?请⼤家跟随我⼀起⾛进今天的⽂章:[Unity3D]Unity3D游戏开发之数据持久化PlayerPrefs的使⽤⾸先我们来看两段Unity3D中实现数据读写的简单代码吧://保存数据PlayerPrefs.SetString("Name",mName);PlayerPrefs.SetInt("Age",mAge);PlayerPrefs.SetFloat("Grade",mGrade)//读取数据mName=PlayerPrefs.GetString("Name","DefaultValue");mAge=PlayerPrefs.GetInt("Age",0);mGrade=PlayerPrefs.GetFloat("Grade",0F);通过上⾯两段代码,我们可以发现两点:1、Unity3D中的数据持久化是以键值的形式存储的,可以看作是⼀个字典。
Unity带有时效性的数据存储引言在Unity项目开发中,有时候会遇到带有时效性的数据存储,比如账号信息、token等,都是具有时效性的,这时候我们就需要在这些信息过期的时候将对应的信息作废。
实现这个功能怎么实现呢,还是利用Unity自带的PlayerPrefs功能来存储数据,只是在存储的时候,如果数据有时效性,我们需要给数据再存储一个对应的key值来记录时间。
获取数据的时候,如果数据有时效性,我们判断对应的时间戳来判定数据的有效性。
完整代码using;using;/// <summary>/// 本地数据缓存/// Playerprefs的封装/// </summary>public class LocalCache{/// <summary>/// 时间戳结尾/// </summary>public const string TimeEnd ="_TIMEEND";/// <summary>/// 获取缓存的string数据/// </summary>/// <param name="key"></param>/// <returns>返回结果可能为空</returns>public static string GetString(string key){string timeKey = key + TimeEnd;if(PlayerPrefs.HasKey(timeKey)){long time =long.Parse(PlayerPrefs.GetString(timeKey));if(CurrentTime()> time){//信息过期作废PlayerPrefs.DeleteKey(key);PlayerPrefs.DeleteKey(timeKey);return null;}else{return PlayerPrefs.GetString(key);}}else{return PlayerPrefs.GetString(key);}}/// <summary>/// 存储string/// </summary>/// <param name="key"></param>/// <param name="value"></param>/// <param name="time">小于等于0表示永久存储,其他表示有存储时间,单位毫秒(ms)</param>public static void SetString(string key,string value,int time =-1){PlayerPrefs.SetString(key,value);if(time >0){//存储对应的时间戳string timeKey = key + TimeEnd;double currentTime =CurrentTime();long endTime =(long)(currentTime + time);PlayerPrefs.SetString(timeKey, endTime.ToString());}}/// <summary>/// 获取缓存的string数据/// </summary>/// <param name="key"></param>/// <returns>返回结果可能为空</returns>public static int?GetInt(string key){string timeKey = key + TimeEnd;if(PlayerPrefs.HasKey(timeKey)){long time =long.Parse(PlayerPrefs.GetString(timeKey));if(CurrentTime()> time){//信息过期作废PlayerPrefs.DeleteKey(key);PlayerPrefs.DeleteKey(timeKey);return null;}else{return PlayerPrefs.GetInt(key);}}else{return PlayerPrefs.GetInt(key);}}/// <summary>/// 存储string/// </summary>/// <param name="key"></param>/// <param name="value"></param>/// <param name="time">小于等于0表示永久存储,其他表示有存储时间,单位毫秒(ms)</param>public static void SetInt(string key,int value,int time =-1)if(time >0){//存储对应的时间戳string timeKey = key + TimeEnd;double currentTime =CurrentTime();long endTime =(long)(currentTime + time);PlayerPrefs.SetString(timeKey, endTime.ToString());}}/// <summary>/// 获取缓存的string数据/// </summary>/// <param name="key"></param>/// <returns>返回结果可能为空</returns>public static float?GetFloat(string key){string timeKey = key + TimeEnd;if(PlayerPrefs.HasKey(timeKey)){long time =long.Parse(PlayerPrefs.GetString(timeKey));if(CurrentTime()> time){//信息过期作废PlayerPrefs.DeleteKey(key);PlayerPrefs.DeleteKey(timeKey);return null;}else{return PlayerPrefs.GetFloat(key);}}else{return PlayerPrefs.GetFloat(key);}}/// <summary>/// 存储string/// </summary>/// <param name="key"></param>/// <param name="value"></param>/// <param name="time">小于等于0表示永久存储,其他表示有存储时间,单位毫秒(ms)</param>public static void SetFloat(string key,float value,int time =-1)if(time >0){//存储对应的时间戳string timeKey = key + TimeEnd;double currentTime =CurrentTime();long endTime =(long)(currentTime + time);PlayerPrefs.SetString(timeKey, endTime.ToString());}}/// <summary>/// 获取当前时间的时间戳/// </summary>/// <returns></returns>public static double CurrentTime(){return(DateTime.Now -new DateTime(1970,1,1)).TotalMilliseconds;}}尾语这里实现的只是个小功能,但是平时多记录一些这种小功能,可以减少正式项目开发中的很多时间,毕竟这种小功能从开发到测试还是需要不少时间的。
unity3D保存游戏数据和载⼊游戏数据原视频地址:将代码挂在到任意空物体上,例如叫SaveGameManager需要两个按钮,分别添加点击事件,⽅法在下⽅代码中以下⽅法是保存背包⾥的数据,可以参考做出,保存⼈物个⼈信息数据,如⾦币数等1:保存游戏2:载⼊游戏1using System.Collections;2using System.Collections.Generic;3using UnityEngine;4using System.IO;//系统操作库5using System.Runtime.Serialization.Formatters.Binary;//调⽤⼆进制库67public class SaveDataManager : MonoBehaviour {8 [Header("我的背包")]9public Bag mybag;1011///<summary>12///保存游戏13///</summary>14public void SaveGame() {1516 print("点击了保存游戏按钮");1718//输出保存位置19 Debug.Log(Application.persistentDataPath);2021//判断如果不存在保存⽂件数据22if (!Directory.Exists(Application.persistentDataPath + "/game_SaveData")) {2324//创建游戏存储⽬录⽂件25 Directory.CreateDirectory(Application.persistentDataPath + "game_SaveData");26 }2728//实例化⼆进制转化⼯具29 BinaryFormatter f = new BinaryFormatter();3031//创建保存⽂件位置32 FileStream file = File.Create(Application.persistentDataPath + "game_SaveData/bag.txt");3334//将背包转换成json格式35var json = JsonUtility.ToJson(mybag);3637//序列化⽂件,转成⼆进制38 f.Serialize(file, json);3940 file.Close();//关闭⽂件句柄4142 print("数据以保存到:" + Application.persistentDataPath);43 }4445///<summary>46///加载游戏47///</summary>48public void LoadGame() {4950 print("点击了保存游戏按按钮");5152//实例化⼆进制转化类53 BinaryFormatter bf = new BinaryFormatter();5455//如果游戏保存⽬录存在56if (File.Exists(Application.persistentDataPath + "game_SaveData/bag.txt")) {5758//打开⽂件(路径,模式)59 FileStream file = File.Open(Application.persistentDataPath + "game_SaveData/bag.txt",FileMode.Open);6061//反序列化json(数据,位置)62 JsonUtility.FromJsonOverwrite((string)bf.Deserialize(file), mybag);6364//关闭⽂件句柄65 file.Close();66 }67 print("完成了保存数据操作");68 }69 }。
持久化简单的数据储存在unity3D 中提供了一个简单有效的方法,如果之前的你做过android的开发你unity3d中持久化数据的储存和Android非常的想象。
那么下面MOMO 将用一个简单有效的例子绍Unity3D中持久化数据。
出自狗刨学习网首先我们须要熟悉一下Unity3D中的PlayerPrefs这个类。
这个类中一共帮助我们封装了9个数据的储存与读取。
举一个例子1.Player Prefs.SetStr ing("key", "value");2.string str = Player Prefs.GetStr ing("key", "defaul e"));复制代码我们发现它是以键值对的形式进行储存与读取,每一个Key对应一个Value,储存过后通过K 之前储存的Value。
这里说一下GetString()方法中的第二个参数,它代表默认值。
意思是如果通过的Key没有找到对应的Value的话GetString()方法就会返回我们写的第二个参数的默认值。
怎么样感觉和Android完全一样哈。
Unity3D默认的字体的size 只有16 ,这就意味了放在iPhone4 (960 X 640)上字体会显示的的来源有很多,大家可以在互联网上下载,或者从自己的电脑中拷贝,在Mac电脑下字体放在Find 库-> Fonts我们可以看见电脑中存在了很多字体,我这里随便选一个,将华文仿宋.ttf 用鼠标拖动到Proj选中:华文仿宋FontSize 30 :毫无疑问是字体的大小,这里写30让字体几乎放大1倍。
Character: 设置字体的文字编码Unicode ASCLL编码Style:设置字体的风格,粗体斜体点击Cretae ->GUISkin 创建一个GUI的皮肤,将华文仿宋拖动到箭头所指向的方向。
必看的AR面试技巧如果我们留心,一些简单的AR程序已经走入了我们的手机。
比如,百度地图中已经增加了AR实景导航功能,以手机摄像头为影像捕获来源,导航软件已经可以在实景中直接标注你的行走路线。
如果你是学完AR技术,不妨看看这些必看的AR面试技巧。
AR面试技巧1.Rigidbody常用属性?Mass表示物体的质量,Drag表示平移阻力,Angular Drag旋转阻力,Use Gravity使用重力,Is Kinematic是否遵循运动学,Interpolate插值,Freeze Rotation冻结旋转。
AR面试技巧2.Collision Detection碰撞检测模式,默认状态时Discrete2.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?放在LateUPdate;否则会有空帧出现。
AR面试技巧3.如何实现游戏的暂停,加速和减速?正确的应该是timeScale不会影响Update和LateUpdate的执行速度。
因为FixedUpdate是根据时间来的,所以timeScale只会影响FixedUpdate 的速度。
AR面试技巧4.Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数。
PlayPrefs.SetInt,、、、、GetInt。
当然了,面试题不光是这几道题,千锋小编知识挑选了几个常用的面试题,由于篇幅限制,更多的面试题,有大家感兴趣的可以去找找答案,或者去找千锋的老师们也是没问题的啦,祝你好运!1.请简述unity游戏引擎的特性。
2.请简述你在unity中比较擅长的技术,并介绍这些技术是如何使用的。
3.请简述unity行业,从发展和市场两方面分析。
4.请列举出市场上比较出名的使用unity引擎开发的游戏(5款以上)。
5.请简述使用unity尹强进行开发容易遇到的一些问题。
6.请简述unity引擎可以用在哪些行业?7.请描述从从事d-x和unity两款引擎之间的区别。
Unity 中游戏的存档与读档在许多游戏中当我们因为⼀些问题⽆法接着进⾏游玩,我们都会选择保存,以便后⾯有空时,接着游玩。
接下来,我们会学习⼀些Unity 有关的存储⽅法。
⼀:Unity-PlayerPrefs(数据持久化这是Unity ⾃带的⽤于本地持久化保存与读取的类,采⽤的是键值对的⽅式来进⾏存储,⼀般通过键名来进⾏获取。
PlayerPrefs 有Int,float,string 类型。
保存数据PlayerPrefs.SetString(“Color”, color);PlayerPrefs.SetInt(“Number”, number);PlayerPrefs.SetFloat(“Class”, class);读取数据color = PlayerPrefs.GetString(“Color”, “red”);number = PlayerPrefs.GetInt(“Number”, 20);class = PlayerPrefs.GetFloat(“Class”, 1);其他⼀些⽅法PlayerPrefs.HasKey();//是否包含该键值对PlayerPrefs.DeleteAll();//删除所有键值对PlayerPrefs.DeleteKey();//删除某⼀个键值对⼆:Unity-Serialization(序列化)和Deserialization(反序列化在Unity 中我们也可以通过使⽤序列化来实现存储,我们将要存储的对象⽤序列化转化为字节流来进⾏存储,当我们需要⽤时我们通过反序列化将字节流转化为对象来进⾏读取。
常见的序列化⽅法:⼆进制,XML,Json.这三种⽅法各有千秋,以下是对这三种⽅法对⽐⼆进制⽅法:简单,但可读性差XML ⽅法:可读性强,但是⽂件庞⼤,冗余信息多JSON ⽅法:数据格式⽐较简单,易于读写,但是不直观,可读性⽐XML 差接下来我会讲解⼀些关于⼆进制的⽅法,关于XML 以及Json ⽅法我会放在下次来讲。
Unity3D中保存或读取数组的方法Unity本身有PlayerPrefs来做一些数据的保存和读取,也可以通过循环来做批量的读取或者保存,下面这个脚本可以方便的调用用来做上面批量的工作,比如读取一组文本数组数据和保存一组文本数组数据.建议把这个脚本放在Standard Assets目录下,这样可以按照下面的方法方便的调用它.现在包含了下面这些命令:PlayerPrefsX.SetVector3PlayerPrefsX.GetVector3PlayerPrefsX.SetIntArrayPlayerPrefsX.GetIntArrayPlayerPrefsX.SetFloatArrayPlayerPrefsX.GetFloatArrayPlayerPrefsX.SetStringArrayPlayerPrefsX.GetStringArray保存一个向量static function SetVector3 (key : string, value : Vector3) : boolean//尝试保存一个物体位置var player : GameObject;if (!PlayerPrefsX.SetVector3("PlayerPosition", player.transform.position))print("不能保存物体位置!");成功返回真,否则假(例如用Webplayer保存超过1M数据的时候)。
获得一个向量var player : GameObject;player.transform.position = PlayerPrefsX.GetVector3("PlayerPosition");如果读取的向量存在的话将会返回这个向量值。
保存一组整型数据//当保存Scores命名的分数时候创建一个10成员数组var myScores = new int[10];for (i = 0; i < myScores.Length; i++)myScores[i] = i+1;if (!PlayerPrefsX.SetIntArray("Scores", myScores))print("不能保存分数!");获得一组整型数据static function GetIntArray (key : string) : int[]如果存在将返回这组数据,否则将返回int[0];var scores = PlayerPrefsX.GetIntArray("Scores");static function GetIntArray (key : string, defaultValue : int, defaultSize : int) : int[]如果不存在这组数据,将返回指定长度的数组以及每个成员都会赋予默认值.其他函数的使用方法:static function SetFloatArray (key : string, value : float[]) : booleanstatic function GetFloatArray (key : string) : float[]static function GetFloatArray (key : string, defaultValue : float, defaultSize : int) : float[]static function SetStringArray (key : string, value : String[]) : booleanstatic function SetStringArray (key : string, value : String[], separator : char) : booleanstatic function GetStringArray (key : string) : string[]static function GetStringArray (key : string, separator : char) : string[]static function GetStringArray (key : string, defaultValue : String, defaultSize : int) : string[]static function GetStringArray (key : string, separator : char, defaultValue : String, defaultSize : int) : string[]该脚本的Javascript版:// Site of this script: <a href="/wiki/index.php?title=ArrayPrefs" target="_blank" rel="external">/wiki/index.php?title=ArrayPrefs</a>// Created by: Eric Haines (Eric5h5)// Contribution (Set/Get Vector3) 03/2010: Mario Madureira Fontes (fontmaster)static function SetVector3 (key : String, vector : Vector3) : boolean {return SetFloatArray(key, [vector.x, vector.y, vector.z]);}static function GetVector3 (key : String) : Vector3 {var floatArray = GetFloatArray(key);if (floatArray.Length < 3) {return Vector3.zero;}return Vector3(floatArray[0], floatArray[1], floatArray[2]);}static function SetIntArray (key : String, intArray : int[]) : boolean {if (intArray.Length == 0) return false;var sb = new System.Text.StringBuilder();for (i = 0; i < intArray.Length-1; i++) {sb.Append(intArray[i]).Append("|");}sb.Append(intArray[i]);try {PlayerPrefs.SetString(key, sb.ToString());}catch (err) {return false;}return true;}static function GetIntArray (key : String) : int[] {if (PlayerPrefs.HasKey(key)) {var stringArray = PlayerPrefs.GetString(key).Split("|"[0]);var intArray = new int[stringArray.Length];for (i = 0; i < stringArray.Length; i++) {intArray[i] = parseInt(stringArray[i]);}return intArray;}return new int[0];}static function GetIntArray (key : String, defaultValue : int, defaultSize : int) : int[] {if (PlayerPrefs.HasKey(key)) {return GetIntArray(key);}var intArray = new int[defaultSize];for (i = 0; i < defaultSize; i++) {intArray[i] = defaultValue;}return intArray;}static function SetFloatArray (key : String, floatArray : float[]) : boolean {if (floatArray.Length == 0) return false;var sb = new System.Text.StringBuilder();for (i = 0; i < floatArray.Length-1; i++) {sb.Append(floatArray[i]).Append("|");}sb.Append(floatArray[i]);try {PlayerPrefs.SetString(key, sb.ToString());}catch (err) {return false;}return true;}static function GetFloatArray (key : String) : float[] {if (PlayerPrefs.HasKey(key)) {var stringArray = PlayerPrefs.GetString(key).Split("|"[0]);var floatArray = new float[stringArray.Length];for (i = 0; i < stringArray.Length; i++) {floatArray[i] = parseFloat(stringArray[i]);}return floatArray;}return new float[0];}static function GetFloatArray (key : String, defaultValue : float, defaultSize : int) : float[] {if (PlayerPrefs.HasKey(key)) {return GetFloatArray(key);}var floatArray = new float[defaultSize];for (i = 0; i < defaultSize; i++) {floatArray[i] = defaultValue;}return floatArray;}static function SetStringArray (key : String, stringArray : String[], separator : char) : boolean {if (stringArray.Length == 0) return false;try {PlayerPrefs.SetString(key, String.Join(separator.ToString(), stringArray));}catch (err) {return false;}return true;}static function SetStringArray (key : String, stringArray : String[]) : boolean {if (!SetStringArray(key, stringArray, "\n"[0])) {return false;}return true;}static function GetStringArray (key : String, separator : char) : String[] {if (PlayerPrefs.HasKey(key)) {return PlayerPrefs.GetString(key).Split(separator);}return new String[0];}static function GetStringArray (key : String) : String[] {if (PlayerPrefs.HasKey(key)) {return PlayerPrefs.GetString(key).Split("\n"[0]);}return new String[0];}static function GetStringArray (key : String, separator : char, defaultValue : String, defaultSize : int) : String[] {if (PlayerPrefs.HasKey(key)) {return PlayerPrefs.GetString(key).Split(separator);}var stringArray = new String[defaultSize];for (i = 0; i < defaultSize; i++) {stringArray[i] = defaultValue;}return stringArray;}static function GetStringArray (key : String, defaultValue : String, defaultSize : int) : String[] {return GetStringArray(key, "\n"[0], defaultValue, defaultSize);}该脚本的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: Brenusing 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.T oString(), 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}。