Unity3D使用LinqToXML存储玩家坐标

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Xml;
using System.Xml.Serialization;

public class LinqToXMLAndEncrypt
{
    static string dataKey = SystemInfo.deviceUniqueIdentifier;
    //设置秘钥,根据平台而定

    static string xmlpath = Application.dataPath + @"\mySaveDB";
    //存档路径

    //加密和解密的key
    static string securitykey = "12348578902223367877723456789012";
    /// <summary>
    /// 初始化一个XML文件
    /// </summary>
    public static void CreateXMLDocument()
    {
        /*定义XML文档结构X,Y,Z用来存储玩家坐标*/
        XElement root = new XElement("XMLContent",

            new XElement("X", new XAttribute("MyVaule", "0")),
            new XElement("Y", new XAttribute("MyVaule", "0")),
            new XElement("Z", new XAttribute("MyVaule", "0")),

            new XElement("Root", "root")
       );
        root.Save(xmlpath);
        EncrtyptSaveXML();
    }
    private static void EncrtyptSaveXML()
    {
        StreamReader sReader = File.OpenText(xmlpath);
        string xmlData = sReader.ReadToEnd();
        sReader.Close();
        string xxx = Encrypt(xmlData);
        StreamWriter writer;
        writer = File.CreateText(xmlpath);
        writer.Write(xxx);
        writer.Close();
    }
    public static XElement DecrtyptLoadXML()
    {
        if (hasFile(xmlpath))
        {
            StreamReader sReader = File.OpenText(xmlpath);
            string xmlData = sReader.ReadToEnd();
            sReader.Close();
            string xxx = Decrypt(xmlData);
            StreamWriter writer;
            writer = File.CreateText(xmlpath);
            writer.Write(xxx);
            writer.Close();
            XElement root = XElement.Load(xmlpath);
            return root;
        }
        else
            return null;
    }
    public static void SetElementValue(string name, string value)
    {
        XElement root = DecrtyptLoadXML();
        root.Element(name).SetAttributeValue("MyVaule", value);
        root.Save(xmlpath);
        EncrtyptSaveXML();
    }
    /// <summary>
    /// 在根节点元素之前添加新的元素
    /// </summary>
    /// <param name="name">元素名字</param>
    /// <param name="value">元素的值</param>
    public static void AddElement(string name, string value)
    {
        XElement root = DecrtyptLoadXML();
        root.Element("Root").AddBeforeSelf(new XElement(name, new XAttribute("MyValue", value)));
        root.Save(xmlpath);
        EncrtyptSaveXML();
    }
    /// <summary>
    /// 删除指定的元素
    /// </summary>
    /// <param name="name">要删除的元素名称</param>
    public static void RemoveElement(string name)
    {
        XElement root = DecrtyptLoadXML();
        root.Element(name).Remove();
        root.Save(xmlpath);
        EncrtyptSaveXML();
    }
    /// <summary>
    /// 根据元素名查找元素对应的值
    /// </summary>
    /// <param name="name">元素名</param>
    /// <returns></returns>
    public static string GetElementValue(string name)
    {
        XElement root = DecrtyptLoadXML();
        XAttribute xattr = root.Element(name).Attribute("MyVaule");
        string s = xattr.Value;
        EncrtyptSaveXML();
        return s;
    }
    /// <summary>
    /// 内容加密,加密和解密采用相同的key,具体可以自己定义,条件是必须是32位的
    /// </summary>
    /// <param name="toE"></param>
    /// <returns></returns>
    private static string Encrypt(string toE)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes(securitykey);
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateEncryptor();

        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE);
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }
    /// <summary>
    /// 内容解密,千万记住解密和加密采用相同的key,必须是32位
    /// </summary>
    /// <param name="toD"></param>
    /// <returns></returns>
    private static string Decrypt(string toD)
    {
        //加密和解密采用相同的key,具体值自己填,但是必须为32位//
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes(securitykey);

        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateDecryptor();

        byte[] toEncryptArray = Convert.FromBase64String(toD);
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return UTF8Encoding.UTF8.GetString(resultArray);
    }
    /// <summary>
    /// 判断XML文档是否存在
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static bool hasFile(string fileName)
    {
        return File.Exists(fileName);
    }
    /// <summary>
    /// 读取XML,返回XML的字符串
    /// </summary>
    /// <returns>返回XML的一串字符</returns>
    public static string LoadXMLForString(bool isDecrypt = true)
    {
        if (hasFile(xmlpath))
        {
            StreamReader sReader = File.OpenText(xmlpath);
            string dataString = sReader.ReadToEnd();
            sReader.Close();
            if (isDecrypt)
            {
                string xxx = Decrypt(dataString);
                return xxx;
            }
            else return dataString;
        }
        else
        {
            return null;
        }
    }
}

玩家WSAD移动的脚本,很简单了

using UnityEngine;
using System.Collections;

public class MovePlayer : MonoBehaviour {

    public float speed;

    // Use this for initialization
    void Start () {
        speed = 5f;
    }

    void Move()
    {
        if (Input.GetKey(KeyCode.A))
        {
            transform.Translate( -speed*Time.deltaTime ,0,0 );
        }

        if (Input.GetKey(KeyCode.D))
        {
            transform.Translate(speed * Time.deltaTime, 0, 0);
        }

        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(0, 0, speed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(0, 0, -speed * Time.deltaTime);
        }
    }

    // Update is called once per frame
    void Update () {
        Move();
    }
}

存档和读档的 操作

using UnityEngine;
using System.Collections;
using System.Linq;
using System.Xml.Linq;
using System;

public class SaveLoadTest : MonoBehaviour {

    public GameObject player;

    // Use this for initialization
    void Start () {
        //第一次运行初始化
        //LinqToXMLAndEncrypt.CreateXMLDocument();
        Debug.Log(LinqToXMLAndEncrypt.LoadXMLForString(true));
        Debug.Log("Player: Xpos-" + LinqToXMLAndEncrypt.GetElementValue("X")+ "--Ypos-" + LinqToXMLAndEncrypt.GetElementValue("Y")+ "--Zpos-" + LinqToXMLAndEncrypt.GetElementValue("X"));

    }

    public void SaveXYZ()
    {
        string x = player.transform.position.x.ToString();
        string y = player.transform.position.y.ToString();
        string z = player.transform.position.z.ToString();

         LinqToXMLAndEncrypt.SetElementValue("X", x);
         LinqToXMLAndEncrypt.SetElementValue("Y", y);
         LinqToXMLAndEncrypt.SetElementValue("Z", z);
    }

    public void LoadXYZ()
    {
        float rx = Convert.ToSingle( LinqToXMLAndEncrypt.GetElementValue("X") );
        float ry = Convert.ToSingle( LinqToXMLAndEncrypt.GetElementValue("Y") );
        float rz = Convert.ToSingle( LinqToXMLAndEncrypt.GetElementValue("Z") );
        player.transform.position = new Vector3(rx,ry,rz);

    }

}

Unity简单场景搭建

Player拖放添加MovePlayer.cs脚本 控制移动

新建空object,命名SaveLoadXML 并添加SaveLoadTest.cs脚本,将Player对象赋值给SaveLoadTest中的player

新建两个按钮Button,分别赋予按钮点击事件到SaveXYZ和LoadXYZ方法

运行一次游戏后,注释掉SaveLoadTest中的

//第一次运行初始化
//LinqToXMLAndEncrypt.CreateXMLDocument();

这一行代码

点击Save可以存储玩家坐标

退出

再次进入点击Load可读取玩家坐标

时间: 2024-10-03 08:35:10

Unity3D使用LinqToXML存储玩家坐标的相关文章

Unity3D技术之多玩家联网游戏创建说明

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 多玩家联网游戏 实时网络是一个复杂的领域,但 Unity 使添加网络功能到游戏中变得简单.然而,在游戏中使用实时网络之前了解一下网络范围是非常有用的.该部分介绍网络基础以及 Unity 执行的细节.如果您之前从未创建过网络游戏,则强烈建议您在开始之前详细阅读本指南. 高级概览 该部分概述网络中涉

关于 Unity3D 持久化数据存储的笔记 之 PlayerPrefs

持久化数据存储这个话题,无论在iOS.安卓都会经常见到的,更何况是跨平台的Unity. 首先我们说说最简单数据存储的方式吧. 1.PlayerPrefs类 在iOS 里面我们常用一种简单的方式存储读取简单的数据,就是通过 NSUserDefaults类来获取数据.读取数据. 而安卓处也有类似的方式进行存储.获取数据. 当然我们要学习的Unity 也有类似的方式进行存储.获取数据. 下面我就用iOS 来讲解一下. iOS 的数据存储是: [[NSUserDefaults standardUserD

【转载】Unity3D研究院transform.parent = parent坐标就乱了

昨天有朋友问我了一个问题,它将Hierarchy视图里的某个子节点下的GameObject拷贝到另外一个对象的子节点下面,他使用的方法就是 transform.parent = parent 但是拷贝过去以后坐标就全乱了.如下图所示我们搭建一个测试环境,我的目标是把a2拷贝在b2下面. 如下图所示,a0 a1 和 b0 b1作为父节点, 为了验证测试的可行性,我把它们的坐标 旋转 缩放 完全搞乱. 一 . 不改变拷贝坐标的情况下 1.直接copy 这个是最简单的 1 2 3 4 private

unity3d 本地数据存储

using UnityEngine; using System.Collections; //路径工具类 public class PathKit { /** 后缀常量字符 */ public const string SUFFIX = ".txt"; const string PREFIX="file://"; const string FORMAT=".unity3d"; public static string RESROOT=Applic

unity3D引擎:2D游戏自动瞄准算法实现

转:http://blog.csdn.net/naitu/article/details/39555373 在很多飞行射击类游戏里,都有敌人向玩家自动瞄准并开火的功能.在这里本人用unity3D引擎新版本的2D系统来实现这个功能. 首先,让我们了解一下原理的理论知识.我们可以把敌人和玩家放到一个坐标系中,敌人是坐标是的原点((0,0)点),玩家是在这个坐标系中的一点.然后把二者在坐标系中构建成直角三角形来计算坐标系的X轴旋转多少角度指向玩家. 现在假设玩家分别放在坐标系的四个象限中,假设第一象限

使用Unity3D的50个技巧:Unity3D最佳实践

刚开始学习Unity3D时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享.原文地址:http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/,下面是译文. 欢迎转载,请注明出处:燕良@游戏开发.另外,欢迎各路高手加入我的QQ群:264656505,切磋交流技术. 关于这些技巧 这些技巧不可能适用于每个项目. 这些是基于

解析OBJ模型并将其加载到Unity3D场景中

??各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是http://qinyuanpei.com.今天想和大家交流的是解析obj模型并将其加载到Unity3D场景中,虽然我们知道Unity3D是可以直接导入OBJ模型的,可是有时候我们并不能保证我们目标客户知道如何使用Unity3D的这套制作流程,可能对方最终提供给我们的就是一个模型文件而已,所以这个在这里做这个尝试想想还是蛮有趣的呢,既然如此,我们就选择在所有3D模型格式中最为简单的OBJ模型来一起探讨这个问题吧! 关于OBJ模

Unity3D游戏开发最佳实践20技巧(三)

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. [文本] 38.如果你有很多的剧情文本,那么把他们放到一个文件里面. 不要把他们放到Inspector的字段中去编辑.这些需要做到不打开Unity,也不用保存Scene就可以方便的修改. 39.如果你计划实现本地化,那么把你的字符串分离到一个统一的位置. 有很多种方法来实现这点.例如,定义一个文

【转】Unity3D AssetBundles 动态加载游戏资源

AssetBundles are files which you can export from Unity to contain assets of your choice. These files use a proprietary compressed format and can be loaded on demand in your application. This allows you to stream content like models, textures, audio c