Unity3D教程:保存或读取数据组的方法
Unity3D界面功能操作讲解
Unity3D界⾯功能操作讲解原创⽂章如需转载请注明:转载⾃本⽂链接地址:Hierarchy 层次视图:层次视图(Hierarchy)包含了每⼀个当前场景的所有游戏对象(GameObject)。
其中⼀些是资源⽂件的实例,如3D模型和其他预制物体(Prefab)的实例。
您可以在层次结构视图中选择对象或者⽣成对象。
当在场景中增加或者删除对象,层次结构视图中相应的对象则会出现或消失。
Unity使⽤⽗对象的概念。
要想让⼀个游戏对象成为另⼀个的⼦对象,只需在层次视图中把它拖到另⼀个上即可。
⼀个⼦对象将继承其⽗对象的移动和旋转属性。
(在层级视图⾯板展开和折叠⽗对象来查看它的⼦对象,不会影响游戏。
)Scene View 场景视图:场景视图(Scene View)是交互式沙盒,可以使⽤它来选择和布置环境、玩家、摄像机、敌⼈和所有其他游戏对象。
在层次视图(Hierarchy)中选择某物体按下“F健(Frame Selected)”,可以在场景视图(Scene View)快速找到该物体。
Project ⼯程视图:每个Unity的项⽬包含⼀个资源⽂件夹。
此⽂件夹的内容呈现在项⽬视图。
这⾥存放着你游戏的所有资源,⽐如场景、脚本、三维模型、纹理、⾳频⽂件和预制组件。
如果你在项⽬视图⾥右击任何资源,你都可以在资源管理器中(在Mac系统中是Reveal in Finder)找到这些真正的⽂件本⾝。
重要提⽰:不要使⽤操作系统来移动项⽬资源,因为这将破坏与资源相关的⼀些元数据。
你应该始终使⽤项⽬视图来组织⾃⼰的资源。
要添加资源到你的项⽬中,你可以拖动操作系统的任何⽂件到项⽬视图,或者使⽤Assets » Import New Asset导⼊新资源。
你的资源现在可以在你的游戏中使⽤了。
有些游戏资源必须从Unity内部建⽴。
要做到这⼀点,使⽤Create下拉菜单,或通过右键然后点击 » Create来创建。
这将允许你添加脚本、预制物体(Prefab)、或⽂件夹让您的项⽬组织有序。
unity获取组件的方法
unity获取组件的方法Unity是一款非常强大的开发工具,可以让你快速创建游戏应用程序。
在Unity中,你可以使用组件来实现各种功能。
例如,你可以使用碰撞器组件来检测两个物体之间的碰撞,使用刚体组件来模拟物理效果,使用动画控制器组件来创建动画等。
因此,了解如何获取组件是非常重要的。
在这篇文章中,我将详细介绍Unity中获取组件的方法。
1. GetComponent方法GetComponent方法是Unity中最常用的获取组件的方法之一。
这个方法可以用于获取一个游戏对象上的任何组件。
例如,如果你想获取一张图片的SpriteRenderer组件,你可以使用以下代码:```c#SpriteRenderer spriteRenderer = gameObject.GetComponent<SpriteRenderer>();```这个代码片段将获取gameObject对象上的SpriteRenderer组件并将其存储在spriteRenderer变量中。
你还可以使用其他类型的组件。
例如,如果你想获取刚体组件,可以使用以下代码:4. GetComponentInChildren和GetComponentInParent方法的比较GetComponentInChildren方法将在当前游戏对象及其所有子对象中查找组件。
因此,如果你想搜索整个对象层次结构来查找组件,就可以使用这个方法。
在获取组件时,你可以使用GetComponentInChildren、GetComponentInParent或GetComponents方法。
这三种方法都可以实现类似的功能,但它们也有细微的差别。
GetComponentInParent方法只返回父级对象中的组件。
如果你想获取指定对象及其源代码层次中的所有组件,则必须使用GetComponents方法。
7. FindObjectsOfType方法FindObjectsOfType方法可以用于获取场景中所有指定类型的组件。
Unity面试题(含答案)
Unity面试题(含答案)史上最全的Unity面试题(持续更新总结。
)包含答案的Unity面试题这个是我刚刚整理出的Unity面试题,为了帮助大家面试,同时帮助大家更好地复习Unity知识点,如果大家发现有什么错误,(包括错别字和知识点),或者发现哪里描述的不清晰,请在下面留言,我会重新更新,希望大家共同来帮助开发者一:什么是协同程序?在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。
二:Unity3d中的碰撞器和触发器的区别?碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器三:物体发生碰撞的必要条件?两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体,而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。
四:请简述ArrayList和List的主要区别?####ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理)?装箱拆箱的操作(费时)?List是接口,ArrayList是一个实现了该接口的类,可以被实例化五:如何安全的在不同工程间安全地迁移asset数据?三种方法1.将Assets目录和Library目录一起迁移2.导出包,export Package3.用unity自带的assets Server功能六:OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生Awake –>OnEnable->Start,OnEnable在同一周期中可以反复地发生。
Unity3D保存游戏的几种方式
Unity3D保存游戏的⼏种⽅式1. playerpref2. 保存类定义⼀个Save类,当想保存游戏的时候,创建⼀个类,并赋值。
然后存储。
当想读取游戏是,先读取⽂件并⽣成⼀个类,然后再赋值到游戏属性。
using System.Collections;using System.Collections.Generic;using UnityEngine;[System.Serializable]public class Save{public List<int> livingTargetPositions = new List<int>();public List<int> livingMonsterTypes = new List<int>();public int shootNum = 0;public int score = 0;}//创建Save对象并存储当前游戏状态信息private Save CreateSaveGO(){//新建Save对象Save save = new Save();//遍历所有的target//如果其中有处于激活状态的怪物,就把该target的位置信息和激活状态的怪物的类型添加到List中foreach (GameObject targetGO in targetGOs){TargetManager targetManager = targetGO.GetComponent<TargetManager>();if (targetManager.activeMonster != null){save.livingTargetPositions.Add(targetManager.targetPosition);int type = targetManager.activeMonster.GetComponent<MonsterManager>().monsterType;save.livingMonsterTypes.Add(type);}}//把shootNum和score保存在Save对象中save.shootNum = UIManager._instance.shootNum;save.score = UIManager._instance.score;//返回该Save对象return save;}//通过读档信息重置我们的游戏状态(分数、激活状态的怪物)private void SetGame(Save save){//先将所有的targrt⾥⾯的怪物清空,并重置所有的计时foreach(GameObject targetGO in targetGOs){targetGO.GetComponent<TargetManager>().UpdateMonsters();}//通过反序列化得到的Save对象中存储的信息,激活指定的怪物for(int i = 0; i < save.livingTargetPositions.Count; i++){int position = save.livingTargetPositions[i];int type = save.livingMonsterTypes[i];targetGOs[position].GetComponent<TargetManager>().ActivateMonsterByType(type);}//更新UI显⽰UIManager._instance.shootNum = save.shootNum;UIManager._instance.score = save.score;//调整为未暂停状态UnPause();}2.1. 保存到⼆进制⽂件using System.IO;using System.Runtime.Serialization.Formatters.Binary;//⼆进制⽅法:存档和读档private void SaveByBin() {//序列化过程(将Save对象转换为字节流)Save save = CreateSaveGO(); //创建Save对象并保存当前游戏状态BinaryFormatter bf = new BinaryFormatter(); //创建⼀个⼆进制格式化程序FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt"); //创建⼀个⽂件流bf.Serialize(fileStream, save); //⽤⼆进制格式化程序的序列化⽅法来序列化Save对象,参数:创建的⽂件流和需要序列化的对象fileStream.Close(); //关闭流//如果⽂件存在,则显⽰保存成功if (File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt")) { UIManager._instance.ShowMessage("保存成功"); } } private void LoadByBin() {if(File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt")) {//反序列化过程 //创建⼀个⼆进制格式化程序 BinaryFormatter bf = new BinaryFormatter();//打开⼀个⽂件流FileStream fileStream = File.Open(Application.dataPath + "/StreamingFile" + "/byBin.txt", FileMode.Open);//调⽤格式化程序的反序列化⽅法,将⽂件流转换为⼀个Save对象Save save = (Save)bf.Deserialize(fileStream);fileStream.Close(); //关闭⽂件流SetGame(save); UIManager._instance.ShowMessage(""); }else { UIManager._instance.ShowMessage("存档⽂件不存在"); } }2.2..JSON需要使⽤第三⽅库 LitJson.dllusing LitJson;//JSON:存档和读档private void SaveByJson(){Save save = CreateSaveGO();string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";//利⽤JsonMapper将save对象转换为Json格式的字符串string saveJsonStr = JsonMapper.ToJson(save);//将这个字符串写⼊到⽂件中//创建⼀个StreamWriter,并将字符串写⼊⽂件中StreamWriter sw = new StreamWriter(filePath);sw.Write(saveJsonStr);//关闭StreamWritersw.Close();UIManager._instance.ShowMessage("保存成功");}private void LoadByJson(){string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";if(File.Exists(filePath)){//创建⼀个StreamReader,⽤来读取流StreamReader sr = new StreamReader(filePath);//将读取到的流赋值给jsonStrstring jsonStr = sr.ReadToEnd();//关闭sr.Close();//将字符串jsonStr转换为Save对象Save save = JsonMapper.ToObject<Save>(jsonStr);SetGame(save);UIManager._instance.ShowMessage("");}else{UIManager._instance.ShowMessage("存档⽂件不存在");}}2.3.. XMLusing System.Xml;//XML:存档和读档private void SaveByXml(){Save save = CreateSaveGO();//创建XML⽂件的存储路径string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";//创建XML⽂档XmlDocument xmlDoc = new XmlDocument();//创建根节点,即最上层节点XmlElement root = xmlDoc.CreateElement("save");//设置根节点中的值root.SetAttribute("name", "saveFile1");//创建XmlElementXmlElement target;XmlElement targetPosition;XmlElement monsterType;//遍历save中存储的数据,将数据转换成XML格式for(int i = 0; i < save.livingTargetPositions.Count; i++){target = xmlDoc.CreateElement("target");targetPosition = xmlDoc.CreateElement("targetPosition");//设置InnerText值targetPosition.InnerText = save.livingTargetPositions[i].ToString();monsterType = xmlDoc.CreateElement("monsterType");monsterType.InnerText = save.livingMonsterTypes[i].ToString();//设置节点间的层级关系 root -- target -- (targetPosition, monsterType)target.AppendChild(targetPosition);target.AppendChild(monsterType);root.AppendChild(target);}//设置射击数和分数节点并设置层级关系 xmlDoc -- root --(target-- (targetPosition, monsterType), shootNum, score) XmlElement shootNum = xmlDoc.CreateElement("shootNum");shootNum.InnerText = save.shootNum.ToString();root.AppendChild(shootNum);XmlElement score = xmlDoc.CreateElement("score");score.InnerText = save.score.ToString();root.AppendChild(score);xmlDoc.AppendChild(root);xmlDoc.Save(filePath);if(File.Exists(Application.dataPath + "/StreamingFile" + "/byXML.txt")){UIManager._instance.ShowMessage("保存成功");}}private void LoadByXml(){string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";if(File.Exists(filePath)){Save save = new Save();//加载XML⽂档XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(filePath);//通过节点名称来获取元素,结果为XmlNodeList类型XmlNodeList targets = xmlDoc.GetElementsByTagName("target");//遍历所有的target节点,并获得⼦节点和⼦节点的InnerTextif(targets.Count != 0){foreach(XmlNode target in targets){XmlNode targetPosition = target.ChildNodes[0];int targetPositionIndex = int.Parse(targetPosition.InnerText);//把得到的值存储到save中save.livingTargetPositions.Add(targetPositionIndex);XmlNode monsterType = target.ChildNodes[1];int monsterTypeIndex = int.Parse(monsterType.InnerText);save.livingMonsterTypes.Add(monsterTypeIndex);}}//得到存储的射击数和分数XmlNodeList shootNum = xmlDoc.GetElementsByTagName("shootNum");int shootNumCount = int.Parse(shootNum[0].InnerText);save.shootNum = shootNumCount;XmlNodeList score = xmlDoc.GetElementsByTagName("score");int scoreCount = int.Parse(score[0].InnerText);save.score = scoreCount;SetGame(save);UIManager._instance.ShowMessage("");}else{UIManager._instance.ShowMessage("存档⽂件不存在");}}。
unity读取sqlserver表格的方法
一、介绍Unity和SQL ServerUnity是一款跨评台的游戏开发引擎,被广泛应用于游戏开发和虚拟现实领域。
而SQL Server是微软公司开发的关系型数据库管理系统,常用于存储和管理大量结构化数据。
本文将介绍在Unity中如何读取SQL Server中的表格数据。
二、Unity中读取SQL Server表格的方法1. 使用.NET数据库连接在Unity中可以使用.NET数据库连接来连接SQL Server数据库。
首先要在Unity中创建一个C#脚本,并且需要引用System.Data.SqlClient命名空间。
接着可以使用SqlConnection、SqlCommand等类来连接数据库并执行SQL语句。
例如:```string connectionString ="Server=myServerAddress;Database=myDatabase;UserId=myUsername;Password=myPassword;";SqlConnection connection = newSqlConnection(connectionString);string sql = "SELECT * FROM myTable"; SqlCommandmand = new SqlCommand(sql, connection); connection.Open();SqlDataReader dataReader =mand.ExecuteReader();while (dataReader.Read()){// 读取数据的操作}connection.Close();```2. 使用第三方插件除了自己编写数据库连接代码外,还可以使用一些第三方插件来简化在Unity中读取SQL Server表格的操作。
可以使用Unity Asset Store中的SQLite或者MySQL插件,这些插件可以提供更加便捷的数据库连接和操作方法。
unity3d怎么连接sqlserver数据库
unity3d怎么连接sqlserver数据库
虽然在Unity3D中能够通过PlayerPrefs类来保存和读取数据,但是⼀旦数据量增⼤,仅仅通过代码的⽅式存取数据,这样的⼯作量是⾮常⼤的。
那么如何通过使⽤Sql Server数据库来存取数据呢?其实过
程也⾮常简单,过程如下:
1、找到System.Data.dll⽂件,默认的地址是在C:\Program Files\Unity\Editor\Data\Mono\lib\mono\unity,这个根据你所安装的路径有关。
2、将该⽂件复制到你的⼯作空间下的Asset⽂件夹内
3、在你的编辑器中添加引⽤,我⽤的是VS
4、在命名空间内增加程序集
using System;
using System.Data;
using System.Data.SqlClient;
5、编写连接数据库代码
SqlConnection con = null; SqlDataAdapter sda = null; void Start() { string s = @"server=.;database=ConnectTest;uid=sa;pwd=123456"; //注意,这⾥必须使⽤SQL Server和Windows验证模式,否则会报错 con = new SqlConnection(s); con.
6、实验结果。
Unity3D文件读取
Unity3D⽂件读取Resources:是作为⼀个Unity3D的保留⽂件夹出现的,也就是如果你新建的⽂件夹的名字叫Resources,那么⾥⾯的内容在打包时都会被⽆条件的打到发布包中。
它的特点简单总结⼀下就是:1. 只读,即不能动态修改。
所以想要动态更新的资源不要放在这⾥。
2. 会将⽂件夹内的资源打包集成到.asset⽂件⾥⾯。
因此建议可以放⼀些Prefab,因为Prefab在打包时会⾃动过滤掉不需要的资源,有利于减⼩资源包的⼤⼩。
3. 主线程加载。
4. 资源读取使⽤Resources.Load()。
StreamingAssets:要说到StreamingAssets,其实和Resources还是蛮像的。
同样作为⼀个只读的Unity3D的保留⽂件夹出现。
不过两者也有很⼤的区别,那就是Resources⽂件夹中的内容在打包时会被压缩和加密。
⽽StreamingAsset⽂件夹中的内容则会原封不动的打⼊包中,因此 StreamingAssets主要⽤来存放⼀些⼆进制⽂件。
下⾯也同样做⼀个简单的总结:1. 同样,只读不可写。
2. 主要⽤来存放⼆进制⽂件。
3. 只能⽤过WWW类来读取。
AssetBundle:关于AssetBundle的介绍已经有很多了。
简⽽⾔之就是把prefab或者⼆进制⽂件封装成AssetBundle⽂件(也是⼀种⼆进制)。
但是也有硬伤,就是在移动端⽆法更新脚本。
下⾯简单的总结下:1. 是Unity3D定义的⼀种⼆进制类型。
2. 最好将prefab封装成AseetBundle,不过上⾯不是才说了在移动端⽆法更新脚本吗?那从Assetbundle中拿到的Prefab上挂的脚本是不是就⽆法运⾏了?也不⼀定,只要这个prefab上挂的是本地脚本,就可以。
3. 使⽤WWW类来下载。
PersistentDataPath:看上去它只是个路径呀,可为什么要把它从路径⾥⾯单独拿出来介绍呢?因为它的确蛮特殊的,这个路径下是可读写。
Unity3D访问Access数据库教程
学IT技能上我学院网Unity3D访问Access数据库教程Access数据库是一个轻量级的数据库,以前在学习.net应用开发的的时候相信大家都了解过。
在pc的软件开发中,很多时候,我们存储的数据量不会很大的情况都会选择他,主要他轻量级,容易部署。
更多Access的问题,可以去微软的官网查看。
在U3D中要访问Access数据库,我们需要用到两个dll,System.Data.dll和System.EnterpriseServices.dll,缺一不可。
我们找到这两个dll放到u3d的Plugins文件夹下面。
下面我们创建一个Access数据库版本是07样式是*.accdb(03版本的Access数据库的样式为*.mdb)在我们进行code的时候,要根据不同的版本进行判断啦,对于不同的Access 数据库版本,我们要对应不懂的文件后缀名。
要不然会提示你数据库文件是未知文件。
下面是读取Access的一个demo,其他的修改,添加数据都是在修改他的sql语句啦,相关的知识,可以查看Access在.net中如何对Access进行CURD操作的。
简单的代码如下:学IT技能上我学院网学IT技能上我学院网学IT技能上我学院网学IT技能上我学院网学IT技能上我学院网下一步,我们生成exe文件.执行完毕之后,我们打开生成的程序截图如下:学IT技能上我学院网为什么会出现这个问题。
我在u3d里面看到了他的显示啊,如下:其实呢,我们在部署的时候,要把数据库文件,copy到生成的文件夹下就可以啦!再次运行程序,查看效果。
如下:学IT技能上我学院网好,看到这里,你应该知道了,我今天重点要说的就是这个问题啦!下面是我在制作demo时,遇到的问题还有些是我特意测试需要注意的地方:注意:1. 一定要记住的是,访问Access数据库时,那两个dll缺一不可,缺少就会出现问题。
2. 在带有dll动态链接库的项目,要在打包时设置他的API兼容层级为.NET 2.0。
unity3D保存游戏数据和载入游戏数据
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游戏开发之游戏场景的切换与持久化简单数据的储存
持久化简单的数据储存在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的皮肤,将华文仿宋拖动到箭头所指向的方向。
unity3d-高频率面试题目(单选)
unity3d-高频率面试题目(单选)unity3d-高频率面试题目(单选)选择题(共50题,每题2分)1、NavMeshAgent组件中的Speed指的是?答案:(A)A、导航移动最大速度B、移动速度和旋转速度C、加速度D、移动起始速度2、LeapMotion的核心脚本是?答案:(A)A、HandControllerB、GameControllerC、ControllerD、FingerController3、unity2D平台开发,碰撞方法是()答案:(D)A、OnCollisionEnter(Collision other)B、OnCollisionEnter(Collision2D other)C、OnCollisionEnter2D(Collision other)D、OnCollisionEnter2D(Collision2D other)4、Unity中使用LitJSON,将对象转换成字符串是用哪个方法?答案:(A)A、JsonMapper.T oJson()B、JsonMapper.ToObject()C、JsonMapper.T oGameObject()D、JsonMapper.ToString()5、物理更新一般放到哪个函数里面?答案:(D)A、OnEnableB、AwakeC、StartD、FixedUpdate6、Unity发布安卓程序,Sqlite数据库应该存在那个路径下?答案:(C)A、Application.dataPathB、Application.streamingAssetsPathC、Application.persistentDataPathD、Application.temporaryCachePath7、发布PC端程序,使用WWW加载本地文件,正确的URL是?答案:(C)A、/doc/11536e528f9951e79b89680203d8ce2f006 66515.html /XXXB、Application.streamingAssetsPath/XXXC、"file://"+Application.streamingAssetsPath+"/xxxx"D、以上都不对8、JSON格式比XML更小,更快,以下说法错误的是?答案:(B)A、数据在键值对中B、数据由分号分隔C、花括号保存对象D、方括号保存数组9、外部引入的DLL需要放到哪个文件夹下?答案:(A)A、PluginsB、ResourcesC、PluginD、Resource10、使用导航系统,想要实现VR效果,船员爬上绳索,肯定需要设置那个属性?答案:(A)A、autoTraverseOffMeshLinkB、autoRepathC、autoBrakingD、currentOffMeshLinkData11、要使用IK,必须使用新版动画,除此之外还需要实现系统自带的什么函数?答案:(A)A、OnAnimatorIK(int layerIndex)B、OnAnimatorIK()C、OnIKAnimator(int layerIndex)D、OnIKAnimation()12、Unity3d提供了一个用于保存和读取数据的类是?答案:(A)A、PlayerPrefsB、ResourceC、DataSaveD、Players13、角色控制器(CharacterController)组件中自动使用重力的方法是?答案:(A)A、SimpleMoveB、MoveC、SimpleMove和MoveD、以上都不对14、Unity中的Light组件,那个属性可以实现图案投影?答案:(A)A、CookieB、FlareC、ShadowTypeD、Color15、移动相机动作最好在哪个函数里?答案:(B)A、UpdateB、LateUpdateC、FixedUpdateD、OnGUI16、物体自身旋转使用的函数是?答案:(C)A、Transform.RotateRound()B、Transform.RotateAt()C、Transform.Rotate()D、Transform.Rotated()17、关于烘焙导航网格,说法错误的是?答案:(C)A、表示为Static的物体才可以烘培B、Drop Height表示能跳下的高度C、Jump Distance表示能跳上的高度D、Agent Radius表示物体能通过的半径18、下列选项中,哪个选项表示从游戏开始到到现在所用的时间?答案:(A)A、Time.timeB、Time.deltaTimeC、Time.timeScaleD、Time.fixedTime19、物体发生碰撞的必要条件是?答案:(C)A、两个物体都有碰撞器即可B、都有刚体即可C、都有碰撞器,至少一个刚体D、都有刚体,至少一个碰撞体20、使用UGUI中的拖拽接口,需要引入那个命名空间?答案:(A)A、UnityEngine.EventSystemsB、UnityEngine.UIC、UnityEngine.EventsD、UnityEngine.Event21、关于动画系统中的融合树,描述错误的是?答案:(D)A、融合树的1D类型是指用一个参数控制融合树B、Blend Tree可以自动融合两个动作,实现自然过渡效果C、2D Simple Directional类型的融合树,在某一个方向上只能有一个状态D、融合树内部不能嵌套融合树22、关于Avatar,描述错误的是?答案:(C)A、Humanoid和Generic类型的模型,都需要AvatarB、Avatar是骨骼绑定的映射,是系统自动生成C、要使用新版动画,每一个人物模型都必须要有自己的AvatarD、Avatar配置不对,可能导致人物动画无法正常播放23、关于拖尾组件的描述错误的是?答案:(C)A、一般选用粒子效果的材质B、Time表示拖尾的生命周期C、Colors下面可以设置1个颜色D、Autodestruct 勾选后,物体一旦静止,将被自动销毁游戏物体24、关于四元数说法错误的是?答案:(C)A、能避免万向锁B、Quaternion.identity表示没有旋转C、Quaternion.LookRotation()方法不需要参数D、Quaternion.Slerp表示球形插值25、关于预设体,以下说法错误的是?答案:(D)A、空的预设体是白色,非空为蓝色B、反复需要实例化的物体通常设为预设体C、只要预设体原型发生改变,所有Prefab实例都会发生改变D、声音资源可以作为预设体26、Unity引擎自带的回调函数中OnEnable、Awake、Start哪个可能在同一个对象周期中反复的发生?答案:(A)A、OnEnableB、AwakeC、StartD、以上都不对27、导航系统中,想要实现路障效果,需要使用?答案:(A)A、NavMeshAgent和NavMeshObstacle组件B、NavMeshObstacle和OffMeshLink组件C、NavMeshAgent和OffMeshLink组件D、NavMeshAgent和NavMeshLayer组件28、关于射线,以下说法错误的是?答案:(C)A、射线可以用于物体检测B、射线有两个属性,direction和originC、Physics.RaycastAll()用于产生多条射线D、Physics.Raycast()方法可以用射线检测指定层29、关于Unity自己封装了一个Network类,主要用于状态同步,开启服务器的方法是?答案:(D)A、Network.StartServer()B、Network.Listen()C、Network.BeginServer()D、Network.InitializeServer()30、新版动画系统中,模型的Rig模块下,Animation Type不包括?答案:(C)A、HumanoidB、GenericC、NormalD、Legacy31、Sqlite数据库,ExecuteReader方法的作用是?答案:(C)A、连接数库库B、执行命令,返回第一行第一列的值C、执行命令,返回所有结果D、读取数据,返回所有数据,返回值为字符串数组32、UGUI中可以实现穿透效果的组件是?答案:(C)A、Canvas ScalerB、Graphic RaycasterC、Canvas GroupD、Canvas Mask33、LOD优化的是?答案:(C)A、内存B、CPUC、GPUD、以上都不对34、关于XML,描述错误的是?答案:(B)A、XML是可扩展标记语言,用于数据传输B、XML比JSON的可读性更高,占用资源更少C、XML只能有一个根节点D、XML 是W3C的举荐标准35、自动布局控件中,可以实现固定子元素宽高的控件是?答案:(B)A、Horizontal Layout GroupB、Grid Layout GroupC、Vertical Layout GroupD、Content Size Fitter36、关于协程,以下说法正确的是?答案:(A)A、方法的返回值必须为IenumeratorB、协程是多线程C、协程里面不能再次开启另一个协程D、yield return2;表示等待2帧37、LineRender组件不包含那个属性?答案:(D)A、SetColorB、SetVertexCountC、SetWidthD、SetLength38、光照贴图,描述错误的是?答案:(C)A、烘培完毕,可以删掉灯光B、优化的是GPU的DrawCallC、所有的灯光都可以烘培D、当场景很大时,全局烘培非常费时39、NetworkView默认情况下,不能同步什么属性?答案:(D)A、位置B、刚体C、动画D、脚本40、以下说法正确的是?答案:(A)A、TCP是基于连接的,保证数据正确性,不会丢包B、UDP是基本非连接的,保证了数据顺序,不会丢包C、Unity内部不能使用Socket 编程D、Socket可以发送字符串数据41、关于MVC描述错误的是?答案:(D)A、结构清晰B、减少耦合度C、容易理解、有利于标准化D、减少了代码量和工作量42、关于StreamingAssetsPath路径描述不正确的是?答案:(D)A、该路径在移动端可读不可写B、在安卓路径下是jar:file:///Application.dataPath/!/assetsC、在iOS路径下是Application.dataPath/Data/RawD、在Unity中可以通过Resources.Load()加载该路径下面的资源43、两个4KB的预设体,打包成一个Assetbundle之后,所占空间可能是多少?答案:(C)A、小于4KBB、大于8KBC、小于8KBD、12KB44、以下说法正确的是()答案:(B)A、Sprite Renderer支持的图片类型为TextureB、精灵编辑器Sprite Editor可以给图片添加borderC、使用图集会增加DrawCall值D、2D游戏无法控制层级关系45、下列选项中,可以找到隐藏物体的方法是?答案:(C)A、GameObject.FindWithTag()B、GameObject.Find()C、transform.Find()D、transform.FindWithTag()46、实现鼠标拉近人物模型,人物模型自动看向摄像机(时时)需要使用什么技术?答案:(B)A、遮罩技术B、动画头部IKC、动画事件D、动画融合47、Unity中鼠标的位置用屏幕的像素坐标表示,描述正确的是()答案:(C)A、左上?为坐标原点(0,0),右下?为(Screen.width,Screen.height)B、右上?为坐标原点(0,0),左下?为(Screen.width,Screen.height)C、左下?为坐标原点(0,0),右上?为(Screen.width,Screen.height)D、右下?为坐标原点(0,0),左上?为(Screen.width,Screen.height)48、关于动画系统中,要实现边走边换子弹的效果,描述错误的是?答案:(B)A、需要用到遮罩技术B、原有层的权重值需为1C、需要添加AvatarMaskD、在新建层中设置一个空的状态机49、使用导航系统,想获取到达目标点内包含的所有路径,需要用到?答案:(B)A、navMeshAgent.meshB、navMeshAgent.pathC、navMeshAgent.cornersD、navMeshAgent.points50、UGUI中的Canvas不包含那种渲染类型答案:(D)A、Screen Space-overlayB、Screen Space-CameraC、World SpaceD、Camera Space。
unity3d中文教程pdf
unity3d中文教程pdfunity3d是一款运行于 Windows平台的一款高性能嵌入式操作系统,是目前唯一支持Windows Logic和X86平台的嵌入式操作系统。
unity3d能够为用户提供全面、完整以及专业的软件开发和支持。
它可以为开发人员提供更加强大的图形界面和分布式系统环境,包括图形显示、用户界面、运行模式支持和安全措施等功能。
我们可以通过它来简化软件开发过程,提高应用程序效率。
可以使用各种设备获取您所需的文件,并且可以在 windows设备上运行。
系统还允许你使用多个操作系统来访问多个应用程序。
它也能够支持多种操作系统的扩展(包括 Windows、Linux OS/Unix)以及 Windows Phone应用软件!通过系统命令在整个软件包中调用到更小资源。
下面就给大家详细介绍下如何使用unity3d教程来进行安装和调试?1、将Unity3d安装到电脑上安装程序步骤如下:使用下载好的文件进行安装(电脑上没有Unity3d,所以使用win10操作系统的朋友需要重启电脑来进行安装);双击软件安装文件目录下的安装位置;双击鼠标右键点击“安装”,并选择“运行”,在“运行”中输入一个带有“config”的安装命令;输入“upsupport”将Unity3d安装到电脑上;请注意:在安装Unity3d前建议不要使用其他操作系统,以免影响到其他 OS应用程序;以免安装过程中出现意外情况导致不能正常运行;另外注意检查是否已成功进入安装状态(如果不完成安装就退出)!2、打开一个文件夹,里面有一个目录,可以查看是否有关于该文件的全部资料如果没有,可以右键点击当前文件夹,在弹出的窗口中选择文件夹名称。
如果已经找到这个名称,打开后需要对其重新命名,或者添加其他信息!如果还没有找到. dll文件夹,可以把. dll文件添加到该文件夹中,添加完后如果发现有文件,同样需要重新命名!如图:如果没有找到. dll文件夹名,我们就会找到. file目录下的文件夹,找到后可以删除文件夹中的. file 文件。
unity3d游戏开发之读取写入
前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在android平台中就无法正常的读写。
当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原来是他文件的路径写错了。
开发中往往一道很难的问题解开的时候发现原来真的非常的简单,哇咔咔。
刚好在MOMO的书中也有涉及到文件的读取与写入,那么本节我将书中的部分内容搬到博客中为大家讲解一下。
废话我就不多说了咱直奔主题,创建Text.cs脚本,直接挂在摄像机中。
代码中包括:创建文件、读取文件、删除文件。
Text.csing UnityEngine;ing System.Collections;ing System.IO;ing System.Collections.Generic;ing System;6.7.public class Text : MonoBehaviour {8.//文本中每行的内容9.ArrayList infoall;10.//皮肤资源,这里用于显示中文11.public GUISkin skin;12.void Start ()13.{14.15. //删除文件16. DeleteFile(Application.persistentDataPath,"FileName.txt");17.18. //创建文件,共写入3次数据19. CreateFile(Application.persistentDataPath,"FileName.txt","宣雨松MOMO");20. CreateFile(Application.persistentDataPath,"FileName.txt","宣雨松MOMO");21. CreateFile(Application.persistentDataPath ,"FileName.txt","宣雨松MOMO");22. //得到文本中每一行的内容23. infoall = LoadFile(Application.persistentDataPath,"FileName.txt");24.25.}26.27. /**28. * path:文件创建目录29. * name:文件的名称30. * info:写入的内容31. */32. void CreateFile(string path,string name,string info)33. {34. //文件流信息35. StreamWriter sw;36. FileInfo t = new FileInfo(path+"//"+ name);37. if(!t.Exists)38. {39.//如果此文件不存在则创建40.sw = t.CreateText();41. }42. else43. {44.//如果此文件存在则打开45. sw = t.AppendText();46. }47. //以行的形式写入信息48. sw.WriteLine(info);49. //关闭流50. sw.Close();51. //销毁流52. sw.Dispose();53. }54.55. /**56. * path:读取文件的路径57. * name:读取文件的名称58. */59. ArrayList LoadFile(string path,string name)60. {61. //使用流的形式读取62. StreamReader sr =null;63. try{64. sr = File.OpenText(path+"//"+ name);65. }catch(Exception e)66. {67. //路径与名称未找到文件则直接返回空68. return null;69. }70. string line;71. ArrayList arrlist = new ArrayList();72. while ((line = sr.ReadLine()) != null)73. {74. //一行一行的读取75. //将每一行的内容存入数组链表容器中76. arrlist.Add(line);77. }78. //关闭流79. sr.Close();80. //销毁流81. sr.Dispose();82. //将数组链表容器返回83. return arrlist;84. }85.86. /**87. * path:删除文件的路径88. * name:删除文件的名称89. */90.91. void DeleteFile(string path,string name)92. {93. File.Delete(path+"//"+ name);94.95. }96.97. void OnGUI()98. {99. //用新的皮肤资源,显示中文100. GUI.skin = skin;101. //读取文件中的所有内容102. foreach(string str in infoall)103. {104. //绘制在屏幕当中,哇咔咔!105. bel(str);106. }107.108. }109.110.}复制代码代码中头文件需要注意一下,涉及到IO读取文件。
unity3d 列表的linq用法
unity3d 列表的linq用法LINQ是Language-Integrated Query(语言集成查询)的缩写,它是一种强大的查询语言,用于在数据集合中检索、过滤和操作数据。
在Unity3D中,LINQ可用于操作游戏对象列表、组件列表、组件属性等。
下面将介绍Unity3D中列表的LINQ用法。
在Unity3D中,可以使用LINQ查询游戏对象列表、组件列表等。
以下是一些常见的LINQ用法示例:1. 查询游戏对象列表:```c# GameObject[] gameObjects =GameObject.FindObjectsOfType<GameObject>();IEnumerable<GameObject> filteredObjects =gameObjects.Where(obj => == "MyGameObject"); ```上述代码中,使用`FindObjectsOfType<GameObject>()`方法获取所有游戏对象,并使用LINQ查询过滤出名称等于"MyGameObject"的游戏对象。
2. 查询组件列表:```c# Component[] components =gameObject.GetComponentsInChildren<Component>(); IEnumerable<Component> filteredComponents =components.Where(comp => == "MyComponent"); ```上述代码中,使用`GetComponentsInChildren<Component>()`方法获取指定游戏对象子对象下的所有组件,并使用LINQ查询过滤出名称等于"MyComponent"的组件。
Unity3D教程:PlayerPrefs数据的存取
return(T)serializer.Deserialize(sr);
}else{
returndefault(T);
}
} Unity3D教程手册
publicstaticvoidSaveData(stringkey, T source){
print(PlayerPrefs.GetInt("Player Score"));
}
// Update is called once per frame
voidUpdate(){
}
}
Unity3D状态存储PlayerPrefs高级用法
usingUnityEngine;
usingSystem.Xml.Serialization;
DeleteAll就是删除所有数啦,PlayerPrefs.DeleteAll();
简单代码:
[html]view plaincopyprint?
usingUnityEngine;
usingSystem.Collections;
publicclasspref2:MonoBehaviour{
// Use this for initialization
XmlSerializer serializer=newXmlSerializer(typeof(T));
StringWriter sw=newStringWriter();
serializer.Serialize(sw, source);
PlayerPrefs.SetString(key, sw.ToString());
Unity3D中C#使用StreamReader类读取文件Unity3D教程手册
Unity3D中C#使用StreamReader类读取文件Unity3D教程手册Unity3D中C#使用StreamReader类读取文件文件。
在很多情况下,数据源是磁盘上的文件或网络的某些位置。
任何可以发送数据的位置都可以是数据源,比如网络应用程序、Web服务,甚至是控制台。
用来从文件中读取数据的类是StreamReader。
同StreamWriter一样,这是一个通用类,可以用于任何流。
StreamReader对象的创建方式非常类似于StreamWriter对象。
创建它的最常见方式是使用前面创建的FileStream对象:相关文章:Unity3D中C#使用StreamWriter类写入文件FileStream fs = newFileStream("test.txt",FileMode.Open);StreamReader sr = newStreamReader(fs);同StreamWriter一样,StreamReader类可以直接在包含具体文件路径的字符串中创建:StreamReader sr = newStreamReader("test.txt");using System;using System.Collections.Generic;using System.Text;using System.IO;class Program{static void Main(string[]args){try{FileStream aFile = newFileStream(@"c:\祝福.txt", FileMode.Open);StreamReader sr = newStreamReader(aFile);string strLine = sr.ReadLine();while(strLine != null){Console.WriteLine(strLine);strLine = sr.ReadLine();}sr.Close();}catch (IOException ex){Console.WriteLine(ex.Message);Console.ReadLine();return ;}Console.ReadKey();}}FileStream构造函数找不到该文件,就会抛出异常。
unity 解析3dtiles的方法
unity 解析3dtiles的方法一、啥是3D Tiles呢?3D Tiles是一种用于高效渲染大规模3D地理空间数据的开放标准。
就像是把一整个超级大的3D场景,像切蛋糕一样切成好多小块,这样方便我们在Unity里处理。
比如说我们要做一个超级大的城市地图的3D游戏场景,3D Tiles就能帮上大忙啦。
二、在Unity里准备工作。
1. 导入相关插件。
我们得去找找有没有合适的插件可以用来解析3D Tiles。
有些插件可能是专门为这个功能开发的,在网上搜一搜,找到靠谱的然后导入到Unity项目里。
这就像是给Unity装上一个专门解读3D Tiles密码的小助手。
2. 数据准备。
要确保我们有3D Tiles的数据。
这个数据可能是从一些专业的地理信息数据提供商那里得到的,或者是自己用一些工具生成的。
数据要是不对或者不完整,那后面的解析可就麻烦喽。
三、开始解析。
1. 读取数据。
在Unity里,我们要用代码去读取3D Tiles的数据。
这就好比我们要打开一个装满宝贝(3D Tiles数据)的盒子,得用对钥匙(代码)。
比如说我们可以用C#代码,通过一些文件读取的函数,把数据读进来。
就像这样:csharp.// 假设这里有个读取文件的函数。
var data = Read3DTilesData("your_file_path");2. 解析结构。
3D Tiles有它自己的结构,我们得把这个结构搞清楚。
它可能是分层级的,就像树一样,有根节点,有枝干节点。
我们要通过代码把这个结构一层一层剥开。
比如对于每一个节点,我们可以判断它是什么类型的节点,是包含几何数据的节点,还是只是一个管理节点。
csharp.foreach (var node in data.Nodes) {if (node.Type == "GeometryNode") {// 这里处理几何节点相关的事情。
} else {// 处理其他类型节点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Unity3D教程:保存或读取数据组的方法Posted on 2013年02月05日 by U3d / Unity3D 基础教程/被围观 195 次Unity本身有PlayerPrefs来做一些数据的保存和读取,也可以通过循环来做批量的读取或者保存,下面这个脚本可以方便的调用用来做上面批量的工作,比如读取一组文本数组数据和保存一组文本数组数据。
Unity3D教程:Unity3D实用小功能建议把这个脚本放在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+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: <ahref="/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;{ 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}。