保存工程的信息:比如游戏进程中的位置信息,对抗双方的个人信息等:
方法1:使用xml文件:
xml文件要以UTF-8的格式存储;
但是这样做会使得programmer 可以从脚本中控制xml文件中的所有的字符,包括xml文件中的语法命令字符,因此会带来不安全隐患;
附上两段代码:
A 这一段是我自己写的,将一个xml文件按照字符串读入;
虽然unity3d中的string类型说明中讲到保存的是unicode characters,但是实际上当xml文件比较大的时候,如果保存成unicode,就读不出来,如果保存成UTF-8就不存在这个问题;
C#版本:
using UnityEngine; using System.Collections; using System.Xml; using System.Xml.Serialization; using System.IO; using System.Text; public class ReadXML: MonoBehaviour { //store the read in file WWW statusFile; //decide wether the reading of xml has been finished bool isReadIn = false; // Use this for initialization IEnumerator Start () {//不能用void,否则没有办法使用yield isReadIn = false; yield return StartCoroutine(ReadIn()); isReadIn = true; } IEnumerator ReadIn() { yield return statusFile = new WWW("file:///D:/unity/rotationAndcolor/Assets/information/testxml.xml");//注意路径的写法 } // Update is called once per frame void Update () { if(isReadIn) { string statusData = statusFile.data; print(statusData.Length); } } //get the parameters in the xml file void getPatameters(string _xmlString) { //_xmlString.[0] } void postParameters() { } } public class _GameSaveLoad: MonoBehaviour { // An example where the encoding can be found is at // http://www.eggheadcafe.com/articles/system.xml.xmlserialization.asp // We will just use the KISS method and cheat a little and use // the examples from the web page since they are fully described // This is our local private members Rect _Save, _Load, _SaveMSG, _LoadMSG; bool _ShouldSave, _ShouldLoad,_SwitchSave,_SwitchLoad; string _FileLocation,_FileName; public GameObject _Player; UserData myData; string _PlayerName; string _data; Vector3 VPosition; // When the EGO is instansiated the Start will trigger // so we setup our initial values for our local members void Start () { // We setup our rectangles for our messages _Save=new Rect(10,80,100,20); _Load=new Rect(10,100,100,20); _SaveMSG=new Rect(10,120,400,40); _LoadMSG=new Rect(10,140,400,40); // Where we want to save and load to and from _FileLocation=Application.dataPath; _FileName="SaveData.xml"; // for now, lets just set the name to Joe Schmoe _PlayerName = "Joe Schmoe"; // we need soemthing to store the information into myData=new UserData(); } void Update () {} void OnGUI() { //*************************************************** // Loading The Player... // ************************************************** if (GUI.Button(_Load,"Load")) { GUI.Label(_LoadMSG,"Loading from: "+_FileLocation); // Load our UserData into myData LoadXML(); if(_data.ToString() != "") { // notice how I use a reference to type (UserData) here, you need this // so that the returned object is converted into the correct type myData = (UserData)DeserializeObject(_data); // set the players position to the data we loaded VPosition=new Vector3(myData._iUser.x,myData._iUser.y,myData._iUser.z); _Player.transform.position=VPosition; // just a way to show that we loaded in ok Debug.Log(myData._iUser.name); } } //*************************************************** // Saving The Player... // ************************************************** if (GUI.Button(_Save,"Save")) { GUI.Label(_SaveMSG,"Saving to: "+_FileLocation); myData._iUser.x=_Player.transform.position.x; myData._iUser.y=_Player.transform.position.y; myData._iUser.z=_Player.transform.position.z; myData._iUser.name=_PlayerName; // Time to creat our XML! _data = SerializeObject(myData); // This is the final resulting XML from the serialization process CreateXML(); Debug.Log(_data); } } /* The following metods came from the referenced URL */ string UTF8ByteArrayToString(byte[] characters) { UTF8Encoding encoding = new UTF8Encoding(); string constructedString = encoding.GetString(characters); return (constructedString); } byte[] StringToUTF8ByteArray(string pXmlString) { UTF8Encoding encoding = new UTF8Encoding(); byte[] byteArray = encoding.GetBytes(pXmlString); return byteArray; } // Here we serialize our UserData object of myData string SerializeObject(object pObject) { string XmlizedString = null; MemoryStream memoryStream = new MemoryStream(); XmlSerializer xs = new XmlSerializer(typeof(UserData)); XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); xs.Serialize(xmlTextWriter, pObject); memoryStream = (MemoryStream)xmlTextWriter.BaseStream; XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); return XmlizedString; } // Here we deserialize it back into its original form object DeserializeObject(string pXmlizedString) { XmlSerializer xs = new XmlSerializer(typeof(UserData)); MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString)); XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); return xs.Deserialize(memoryStream); } // Finally our save and load methods for the file itself void CreateXML() { StreamWriter writer; FileInfo t = new FileInfo(_FileLocation+"//"+ _FileName); if(!t.Exists) { writer = t.CreateText(); } else { t.Delete(); writer = t.CreateText(); } writer.Write(_data); writer.Close(); Debug.Log("File written."); } void LoadXML() { StreamReader r = File.OpenText(_FileLocation+"//"+ _FileName); string _info = r.ReadToEnd(); r.Close(); _data=_info; Debug.Log("File Read"); } } // UserData is our custom class that holds our defined objects we want to store in XML format public class UserData { // We have to define a default instance of the structure public DemoData _iUser; // Default constructor doesn't really do anything at the moment public UserData() { } // Anything we want to store in the XML file, we define it here public struct DemoData { public float x; public float y; public float z; public string name; } }
js 版本
import System; import System.Collections; import System.Xml; import System.Xml.Serialization; import System.IO; import System.Text; // Anything we want to store in the XML file, we define it here class DemoData { var x : float; var y : float; var z : float; var name : String; } // UserData is our custom class that holds our defined objects we want to store in XML format class UserData { // We have to define a default instance of the structure public var _iUser : DemoData = new DemoData(); // Default constructor doesn't really do anything at the moment function UserData() { } } //public class GameSaveLoad: MonoBehaviour { // An example where the encoding can be found is at // http://www.eggheadcafe.com/articles/system.xml.xmlserialization.asp // We will just use the KISS method and cheat a little and use // the examples from the web page since they are fully described // This is our local private members private var _Save : Rect; private var _Load : Rect; private var _SaveMSG : Rect; private var _LoadMSG : Rect; //var _ShouldSave : boolean; //var _ShouldLoad : boolean; //var _SwitchSave : boolean; //var _SwitchLoad : boolean; private var _FileLocation : String; private var _FileName : String = "SaveData.xml"; //public GameObject _Player; var _Player : GameObject; var _PlayerName : String = "Joe Schmoe"; private var myData : UserData; private var _data : String; private var VPosition : Vector3; // When the EGO is instansiated the Start will trigger // so we setup our initial values for our local members //function Start () { function Awake () { // We setup our rectangles for our messages _Save=new Rect(10,80,100,20); _Load=new Rect(10,100,100,20); _SaveMSG=new Rect(10,120,200,40); _LoadMSG=new Rect(10,140,200,40); // Where we want to save and load to and from _FileLocation=Application.dataPath; // we need soemthing to store the information into myData=new UserData(); } function Update () {} function OnGUI() { // *************************************************** // Loading The Player... // ************************************************** if (GUI.Button(_Load,"Load")) { GUI.Label(_LoadMSG,"Loading from: "+_FileLocation); // Load our UserData into myData LoadXML(); if(_data.ToString() != "") { // notice how I use a reference to type (UserData) here, you need this // so that the returned object is converted into the correct type //myData = (UserData)DeserializeObject(_data); myData = DeserializeObject(_data); // set the players position to the data we loaded VPosition=new Vector3(myData._iUser.x,myData._iUser.y,myData._iUser.z); _Player.transform.position=VPosition; // just a way to show that we loaded in ok Debug.Log(myData._iUser.name); } } // *************************************************** // Saving The Player... // ************************************************** if (GUI.Button(_Save,"Save")) { GUI.Label(_SaveMSG,"Saving to: "+_FileLocation); //Debug.Log("SaveLoadXML: sanity check:"+ _Player.transform.position.x); myData._iUser.x = _Player.transform.position.x; myData._iUser.y = _Player.transform.position.y; myData._iUser.z = _Player.transform.position.z; myData._iUser.name = _PlayerName; // Time to creat our XML! _data = SerializeObject(myData); // This is the final resulting XML from the serialization process CreateXML(); Debug.Log(_data); } } /* The following metods came from the referenced URL */ //string UTF8ByteArrayToString(byte[] characters) function UTF8ByteArrayToString(characters : byte[] ) { var encoding : UTF8Encoding = new UTF8Encoding(); var constructedString : String = encoding.GetString(characters); return (constructedString); } //byte[] StringToUTF8ByteArray(string pXmlString) function StringToUTF8ByteArray(pXmlString : String) { var encoding : UTF8Encoding = new UTF8Encoding(); var byteArray : byte[] = encoding.GetBytes(pXmlString); return byteArray; } // Here we serialize our UserData object of myData //string SerializeObject(object pObject) function SerializeObject(pObject : Object) { var XmlizedString : String = null; var memoryStream : MemoryStream = new MemoryStream(); var xs : XmlSerializer = new XmlSerializer(typeof(UserData)); var xmlTextWriter : XmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); xs.Serialize(xmlTextWriter, pObject); memoryStream = xmlTextWriter.BaseStream; // (MemoryStream) XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); return XmlizedString; } // Here we deserialize it back into its original form //object DeserializeObject(string pXmlizedString) function DeserializeObject(pXmlizedString : String) { var xs : XmlSerializer = new XmlSerializer(typeof(UserData)); var memoryStream : MemoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString)); var xmlTextWriter : XmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); return xs.Deserialize(memoryStream); } // Finally our save and load methods for the file itself function CreateXML() { var writer : StreamWriter; //FileInfo t = new FileInfo(_FileLocation+"//"+ _FileName); var t : FileInfo = new FileInfo(_FileLocation+"/"+ _FileName); if(!t.Exists) { writer = t.CreateText(); } else { t.Delete(); writer = t.CreateText(); } writer.Write(_data); writer.Close(); Debug.Log("File written."); } function LoadXML() { //StreamReader r = File.OpenText(_FileLocation+"//"+ _FileName); var r : StreamReader = File.OpenText(_FileLocation+"/"+ _FileName); var _info : String = r.ReadToEnd(); r.Close(); _data=_info; Debug.Log("File Read"); } //}
方法2:使用unity 3d 的ISerializable类
它的好处是,可以将文件存成自己定义的后缀形式,并且2进制化存储,在u3d的帮助文档中有相关介绍。
发表评论
-
Mysql 里的主键,外键
2011-11-29 14:52 902- PK: primary key (column is pa ... -
C#中HashTable的用法
2011-11-28 20:08 3439一,哈希表(Hashtable)简述 在.NET ... -
自由调整摄像机视角
2011-10-11 14:33 1193暂时没写.... -
[Unity3D]Script 脚本所有编译器属性详解 .
2011-09-25 14:15 1867Script属性是基于IDE的一 ... -
Unity3D鼠标滚轮控制摄像机远近
2011-09-24 23:37 7460// 鼠标中间键 var MouseWheelSens ... -
血条或者进度条
2011-09-23 14:52 1541用Unity做血条或进度条真的很方便,GUI里scrollba ... -
动态加载贴图和模型
2011-09-23 14:49 1979模型和贴图必需存在“Resources”文件夹下面 var ... -
unity3D射线检测,鼠标拾取
2011-09-23 12:34 2805用射线检测碰撞,拾取 function Update ... -
Unity3D模型导入技巧
2011-09-23 10:37 1078Unity3d导入3dMax模型会产 ... -
XML的操作
2011-09-23 10:30 781首先是判定浏览器的类型和版本的js: var sUserA ... -
鼠标中间的滑动控制
2011-09-23 10:28 1331MouseWheel.js的代码如下: ... -
Unity3D发布的问题
2011-09-23 10:27 956unity发布过程中因为要查询数据库,所以发布会有一些问题,特 ... -
unity3D与网页的交互---做项目的一点总结
2011-09-23 10:23 1389由于项目需要,要求用unity来展示三维场景,并在三维中能够方 ... -
Unity3D动态加载网上或者本地场景的后续
2011-09-23 10:22 3046用射线检测法的可行性和优点。射线检测 射线碰到碰撞体后会返回 ... -
动态加载本地或者网上场景
2011-09-23 10:20 100101 var gui : GUITexture; ... -
飞行路径
2011-09-23 10:18 1022Unity3d游戏开发 1. 建立一个名为FlyPath ... -
修改FPSWalker.js
2011-09-23 10:17 912unity3d游戏开发 替换说明:用FPSWalker. ... -
Unity3D行走和飞行
2011-09-23 10:11 4374新建一个TestFlay.js脚本,内容如下: var s ...
相关推荐
一款delphi和bcb的XML控件。它帮助你在程序中方便的加入对xml文档的读写操作。This software component contains a small-footprint Delphi XML ... You can also use it to create and save XML documents.
SimDesign NativeXml是一个Delphi和BCB中适用的XML控件,它帮助你在程序中方便的加入对xml文档的读写操作。 This software component contains a small-... You can also use it to create and save XML documents.
SimDesign NativeXml是一个Delphi和BCB中适用的XML控件,它帮助你在程序中方便的加入对xml文档的读写操作。 This software component contains a small-... You can also use it to create and save XML documents.
Save and Load Open Document Format (ODS) as directory (Lazarus/Delphi) and as packed single file (Lazarus (for delphi if read readme.en)) Import and export Office Open XML (xlsx) from directory ...
·RichViewXML is a component allowing to save and load TRichView documents in XML format. ·RvHtmlImporter is a component allowing to import a basic HTML in TRichView (for better results, you can use ...
Working with Projects, Folders, Resources, and Configurations ................................................... 2-1 Resource Naming Restrictions ........................................................
4)....Added "--el_injectjcl", "--el_createjcl", and "--el_createdbg" command-line options for ecc32/emake to inject JEDI/JCL debug info, create .jdbg file, and create .dbg file (Microsoft debug format...
UEStudio and UltraEdit provide a way for you to search and delete found lines from your files. This short tutorial provides the steps for searching for and deleting lines by writing a simple script. ...
5.4. Zend_Config_Xml 6. Zend_Console_Getopt 6.1. Getopt 简介 6.2. 声明 Getopt 规则 6.2.1. 用短语法声明选项 6.2.2. 用长语法声明选项 6.3. 读取(Fetching)选项和参数 6.3.1. 操作 Getopt 异常 6.3.2...
OutlookAttachView ('Save Configuration' and 'Load Configuration' under the File menu). * Version 2.56 o OutlookAttachView now remembers the last size and position of the 'Copy Selected Files To.....
+ the regular save and load methods (LoadFromFile, SaveToFile) can now access text wrapped by paired objects. specify the fieldname in the format string, i.e. "f:name=RTF" to save or load the ...
Add/delete entries from INI files, load pictures, change strings, dail phone numbers, send emails, view home pages, and more. Must see.<END><br>31 , fldrvw21.zip FolderView ActiveX Control 2.1 ...
fixed problems in binary xml. Consequence: New binary xml version v2. * NativeXml (and binary xml) now supports xml-stylesheet correctly * binary xml now supports doctype correctly * fixed attribute...
TreeViewXML.zip Great example program for programmers learning XML. This program shows you how to use the msxml.dll control, as well as the treeview control. Users must have msxml.dll version 2.0 ...
MydocRoleInfo.Load("..\\..\\LoginMessage.xml"); MydocEmpInfo.Load("..\\..\\xmlAddEmp.xml"); //在下面显示操作者 tsslblEmpName.Text = "[" + FrmLogin.EmpName + "]"; SetId = tsslblEmpName.Text; ...
+ 3in1 internal GBA rom header stuff and work on Save/Load prompts in 3in1 options window. - Enable/Disable saving 3in1 SRAM on startup (Enabled by default) - Enable/Disable prompting before saving/...
For example, here is a method that tries to load an image file, smooth it, and save it back to disk: import static org.bytedeco.javacpp.opencv_core.*; import static org.bytedeco.javacpp.opencv_...
PHP attempts to find and load this configuration from a number of locations. ; The following is a summary of its search order: ; 1. SAPI module specific location. ; 2. The PHPRC environment variable....
Load Cookies from file using the Firefox3 format, Chromium/Google Chrome and the Mozilla/Firefox (1.x/2.x)/Netscape format. Save Cookies in the Mozilla/Firefox (1.x/2.x)/Netscape format. Custom ...
15. <load-on-startup>1</load-on-startup> 16. </servlet> 17. <servlet-mapping> 18. <servlet-name>spring</servlet-name> <!-- 这里在配成spring,下边也要写一个名为spring-servlet.xml的文件,主要用来...