热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity3D使用LinqToXML存储玩家坐标

usingUnityEngine;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Linq;
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";
    /// 
    /// 初始化一个XML文件
    /// 
    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();
    }
    /// 
    /// 在根节点元素之前添加新的元素
    /// 
    /// 元素名字
    /// 元素的值
    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();
    }
    /// 
    /// 删除指定的元素
    /// 
    /// 要删除的元素名称
    public static void RemoveElement(string name)
    {
        XElement root = DecrtyptLoadXML();
        root.Element(name).Remove();
        root.Save(xmlpath);
        EncrtyptSaveXML();
    }
    /// 
    /// 根据元素名查找元素对应的值
    /// 
    /// 元素名
    /// 
    public static string GetElementValue(string name)
    {
        XElement root = DecrtyptLoadXML();
        XAttribute xattr = root.Element(name).Attribute("MyVaule");
        string s = xattr.Value;
        EncrtyptSaveXML();
        return s;
    }
    /// 
    /// 内容加密,加密和解密采用相同的key,具体可以自己定义,条件是必须是32位的
    /// 
    /// 
    /// 
    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);
    }
    /// 
    /// 内容解密,千万记住解密和加密采用相同的key,必须是32位
    /// 
    /// 
    /// 
    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);
    }
    /// 
    /// 判断XML文档是否存在
    /// 
    /// 
    /// 
    public static bool hasFile(string fileName)
    {
        return File.Exists(fileName);
    }
    /// 
    /// 读取XML,返回XML的字符串
    /// 
    /// 返回XML的一串字符
    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可读取玩家坐标

技术分享

Unity3D使用LinqToXML存储玩家坐标


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
707282400_de0c8b
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有