【XML】xml 存档

一个管理类 用来管理 存档 读档

 #region 快门:存取总控制
    public void SaveSnap(string filename)
    {
        var xmlDoc = new XmlDocument();
        try
        {
            var xmlRoot = xmlDoc.CreateElement("Snaps");
            xmlDoc.AppendChild(xmlRoot);

            var xmlModel = xmlDoc.CreateElement("Models");
            xmlRoot.AppendChild(xmlModel);
            ModelManager.Instance.SaveSnap(xmlDoc, xmlModel);

            var xmlRole = xmlDoc.CreateElement("Roles");
            xmlRoot.AppendChild(xmlRole);
            RoleManager.Instance.SaveSnap(xmlDoc, xmlRole);

            var xmlTool = xmlDoc.CreateElement("Tools");
            xmlRoot.AppendChild(xmlTool);
            ToolManager.Instance.SaveSnap(xmlDoc, xmlTool);

            xmlDoc.Save(filename);
            Debug.Log("XML 存档成功~!!!!!");
        }
        catch
        {

            throw new ArgumentOutOfRangeException();
            Debug.Log("Save Error");
        }
        xmlDoc = null;
    }

    public void LoadSnap(string filename)
    {
        if (File.Exists(filename))
        {
            var xmlDoc = new XmlDocument();

            try
            {
                xmlDoc.Load(filename);
                var xmlRoot = xmlDoc.DocumentElement;

                var xmlModel = xmlRoot.SelectSingleNode("Models") as XmlElement;
                if (xmlModel != null)
                    ModelManager.Instance.LoadSnap(xmlModel);
                var xmlRole = xmlRoot.SelectSingleNode("Roles") as XmlElement;
                if (xmlRole != null)
                    RoleManager.Instance.LoadSnap(xmlRole);
                Debug.Log("222");
                var xmlTool = xmlRoot.SelectSingleNode("Tools") as XmlElement;
                if (xmlTool != null)
                    ToolManager.Instance.LoadSnap(xmlTool);

                if (Warmtips.Instance.OnHideMessage != null)
                {
                    Warmtips.Instance.OnHideMessage();
                }

                OperationMessage.Instance.AddTipMessage("读档成功");
                Debug.Log("XML 读档~!!!!!");
            }
            catch
            {
                throw new ArgumentOutOfRangeException();
                Debug.LogError("读档有问题!!!!");
            }
            xmlDoc = null;
        }
    }
RoleManager
  #region 快门:使用xmlNode存取数据
    public void SaveSnap(XmlDocument xmlDoc, XmlElement xmlNode)
    {
        foreach (var role in Roles)
        {
            var xmlRoleInfo = xmlDoc.CreateElement("RoleInfo");

            xmlRoleInfo.SetAttribute("ID", role.OwnId.ToString());
            xmlRoleInfo.SetAttribute("HP", role.HP.ToString());
            xmlRoleInfo.SetAttribute("Active", role.gameObject.activeSelf.ToString());
            xmlRoleInfo.SetAttribute("IsHurt", role.IsHurt.ToString());
            xmlRoleInfo.SetAttribute("Position", TxtUtility.Vtr3ToStr(role.gameObject.transform.position));
            xmlRoleInfo.SetAttribute("Rotation", TxtUtility.Vtr3ToStr(role.gameObject.transform.eulerAngles));
            xmlRoleInfo.SetAttribute("RoleHXJ", role.transform.Find(AppDefine.AirResName).gameObject.activeSelf.ToString());
            if (role.ToolList.Count != 0)
            {
                string toolName = null;
                for (int j = 0; j < role.ToolList.Count; j++)
                {
                    toolName += "," + role.ToolList[j].MainObject.name;
                }
                xmlRoleInfo.SetAttribute("ToolList", toolName.TrimStart(','));
            }
            else
            {
                xmlRoleInfo.SetAttribute("ToolList", "");
            }

            xmlNode.AppendChild(xmlRoleInfo);
        }
    }
    public void LoadSnap(XmlElement xmlNode)
    {
        XmlNodeList nodeList = xmlNode.ChildNodes;
        foreach (XmlElement itemElement in nodeList)
        {
            var role = GetRoleById(itemElement.GetAttribute("ID").ToInt());
            Debug.Log(role.OwnId);
            if (role != null)
            {
                role.gameObject.SetActive(Convert.ToBoolean(itemElement.GetAttribute("Active")));
                role.HP = itemElement.GetAttribute("HP").ToFloat();
                switch (AppSetting.Platform)
                {
                    case EPlatform.PC:
                        role.gameObject.transform.position = TxtUtility.StrToVtr3(itemElement.GetAttribute("Position"));
                        role.gameObject.transform.eulerAngles = TxtUtility.StrToVtr3(itemElement.GetAttribute("Rotation"));
                        break;
                    case EPlatform.HTC:

                        if (RoleManager.instance.CurrentRoleData.OwnId == role.OwnId)
                        {
                            //Player.instance.gameObject.transform.position = TxtUtility.StrToVtr3(itemElement.GetAttribute("Position"));
                            TelePortManager.Instance.SampleTeleport(
                                TxtUtility.StrToVtr3(itemElement.GetAttribute("Position")), true);
                        }
                        else
                        {
                            role.gameObject.transform.position = TxtUtility.StrToVtr3(itemElement.GetAttribute("Position"));
                            role.gameObject.transform.eulerAngles = TxtUtility.StrToVtr3(itemElement.GetAttribute("Rotation"));
                        }
                        break;
                    case EPlatform.OCULUS:
                        //Debug.LogError(RoleManager.instance.CurrentRoleData.OwnId + "CurrentRole");
                        //Debug.LogError(role.OwnId + "role");
                        if (RoleManager.instance.CurrentRoleData.OwnId == role.OwnId)
                        {
                            Debug.LogError(TxtUtility.StrToVtr3(itemElement.GetAttribute("Position")));
                            RayManager.Get().SetPos(TxtUtility.StrToVtr3(itemElement.GetAttribute("Position")));
                        }
                        else
                        {
                            role.gameObject.transform.position = TxtUtility.StrToVtr3(itemElement.GetAttribute("Position"));
                            role.gameObject.transform.eulerAngles = TxtUtility.StrToVtr3(itemElement.GetAttribute("Rotation"));
                        }
                        break;
                }
                role.transform.Find(AppDefine.AirResName).gameObject.SetActive(Convert.ToBoolean(itemElement.GetAttribute("RoleHXJ")));
                if (Convert.ToBoolean(itemElement.GetAttribute("IsHurt")))
                {
                    role.Animator.SetBool("hurt", true);
                }
                else
                {
                    role.ClearSitDown();
                    role.Animator.SetBool("hurt", false);
                    //role.animator.Play("Idle", -1, 0);
                }
                //如果不等于"" 说明人物有拿起东西
                if (itemElement.GetAttribute("ToolList") != "")
                {
                    role.ToolList.Clear();
                    ToolBase tool = null;
                    string[] toolName = itemElement.GetAttribute("ToolList").Split(',');
                    for (int j = 0; j < toolName.Length; j++)
                    {
                        tool = ToolManager.Instance.GetToolBase(toolName[j]);
                        role.ToolList.Add(tool);
                    }
                }
                else
                {
                    //如果没有东西则清空
                    role.ToolList.Clear();
                }
            }
        }
    }
ModelManager

   #region 快门:使用xmlNode存取数据

    public void SaveSnap(XmlDocument xmlDoc, XmlElement xmlNode)
    {
        //消防车
        for (int i = 0; i < AccidentPosList.Count; i++)
        {
            for (int j = 0; j < AccidentPosList[i].XFCList.Count; j++)
            {
                if (AccidentPosList[i].XFCList[j].activeSelf)
                {
                    var _xmlModelFire = xmlDoc.CreateElement("ModelFire");
                    _xmlModelFire.SetAttribute("Name", AccidentPosList[i].XFCList[j].name);
                    _xmlModelFire.SetAttribute("Active", AccidentPosList[i].XFCList[j].activeSelf.ToString());
                    //是否有人引导
                    _xmlModelFire.SetAttribute("IsCall", AccidentPosList[i].XFCList[j].GetComponent<Fireengine>().Called.ToString());
                    xmlNode.AppendChild(_xmlModelFire);
                }
            }
        }
        var ambulance = Ambulance.GetComponent<Ambulance>();
        var _xmlModelInfoAmb = xmlDoc.CreateElement("ModelAmbulance");
        //救护车 如果打电话应该出现 有人引导开始移动
        if (Ambulance.gameObject.activeSelf)
        {
            _xmlModelInfoAmb.SetAttribute("Rotation", TxtUtility.Vtr3ToStr(Ambulance.transform.eulerAngles));
            _xmlModelInfoAmb.SetAttribute("IsCall", ambulance.Called.ToString());
            _xmlModelInfoAmb.SetAttribute("Guided", ambulance.Guided.ToString());
            _xmlModelInfoAmb.SetAttribute("Active", Ambulance.gameObject.activeSelf.ToString());
            xmlNode.AppendChild(_xmlModelInfoAmb);
        }
        else
        {
            _xmlModelInfoAmb.SetAttribute("Active", Ambulance.gameObject.activeSelf.ToString());
            xmlNode.AppendChild(_xmlModelInfoAmb);
        }
        Transform fireCGroup;
        if (MainEnv.transform.Find("FireControllerGroup"))
            fireCGroup = MainEnv.transform.Find("FireControllerGroup");
        else
            fireCGroup = MainEnv.transform.Find("FireControlGP");
        //消防炮 isActive 消防炮喷水

        if (fireCGroup != null && fireCGroup.childCount != 0)
        {
            for (int i = 0; i < fireCGroup.childCount; i++)
            {
                var _xmlModelFireControl = xmlDoc.CreateElement("xmlModelFireControl");
                _xmlModelFireControl.SetAttribute("Name", fireCGroup.GetChild(i).gameObject.name);
                _xmlModelFireControl.SetAttribute("Rotation", TxtUtility.Vtr3ToStr(fireCGroup.GetChild(i).GetChild(2).eulerAngles));
                if (fireCGroup.GetChild(i).GetComponent<Firemonitor>().particleWater == null)
                    _xmlModelFireControl.SetAttribute("IsActive", false.ToString());
                else
                    _xmlModelFireControl.SetAttribute("IsActive", fireCGroup.GetChild(i).GetComponent<Firemonitor>().particleWater.activeSelf.ToString());
                xmlNode.AppendChild(_xmlModelFireControl);
            }
        }
    }

    public void LoadSnap(XmlElement xmlNode)
    {
        XmlNodeList nodeList = xmlNode.ChildNodes;
        foreach (XmlElement itemElement in nodeList)
        {
            switch (itemElement.Name)
            {
                case "ModelFire":
                    for (int i = 0; i < AccidentPosList.Count; i++)
                    {
                        for (int j = 0; j < AccidentPosList[i].XFCList.Count; j++)
                        {
                            if (itemElement.GetAttribute("Name").Equals(AccidentPosList[i].XFCList[j].name))
                            {
                                var fireengine = AccidentPosList[i].XFCList[j].GetComponent<Fireengine>();

                                //AccidentPosList[i].XFCList[j].GetComponent<Fireengine>().FireengineWater.SetActive(false);
                                //如果消防车激活 并且引导 就到指定位置喷水 如果没有 则在原地 如果没有显示 则隐藏
                                if (Convert.ToBoolean(itemElement.GetAttribute("Active")))
                                {
                                    if (Convert.ToBoolean(itemElement.GetAttribute("IsCall")))
                                    {
                                        AccidentPosList[i].XFCList[j].transform.position = fireengine.EndPosition + new Vector3(0f, -1.3f, 0f);
                                        AccidentPosList[i].XFCList[j].transform.rotation = Quaternion.LookRotation(fireengine.EndDirection, Vector3.up);
                                        fireengine.OpenFireengineWater(true);
                                    }
                                    else
                                    {
                                        AccidentPosList[i].XFCList[j].transform.rotation = Quaternion.LookRotation(Vector3.Normalize(NodePathList[3].point.transform.position - NodePathList[2].point.transform.position), Vector3.up);
                                        AccidentPosList[i].XFCList[j].transform.position = NodePathList[3].point.transform.position;
                                        fireengine.OpenFireengineWater(false);
                                        fireengine.Called = false;
                                        fireengine.IsRealy = false;
                                        AccidentPosList[i].XFCList[j].SetActive(true);
                                    }
                                }
                                else
                                {
                                    if (AccidentPosList[i].XFCList[j].activeSelf)
                                    {
                                        AccidentPosList[i].XFCList[j].transform.rotation = Quaternion.LookRotation(Vector3.Normalize(NodePathList[3].point.transform.position - NodePathList[2].point.transform.position), Vector3.up);
                                        AccidentPosList[i].XFCList[j].transform.position = NodePathList[3].point.transform.position;
                                        fireengine.OpenFireengineWater(false);
                                        fireengine.Called = false;
                                        fireengine.IsRealy = false;
                                        AccidentPosList[i].XFCList[j].SetActive(false);
                                    }
                                }
                            }
                        }
                    }
                    break;
                case "ModelAmbulance":
                    var ambulance = Ambulance.GetComponent<Ambulance>();
                    if (Convert.ToBoolean(itemElement.GetAttribute("Active")))
                    {
                        if (Convert.ToBoolean(itemElement.GetAttribute("IsCall")))
                        {
                            if (Convert.ToBoolean(itemElement.GetAttribute("Guided")))
                            {
                                ambulance._initNavPathed = false;
                                ambulance._isGotoGoal = false;
                                Ambulance.transform.position = ambulance.StartPosition;
                                Ambulance.transform.rotation = Quaternion.identity;
                                ambulance.GoToGoal(new ParamMessage());
                            }
                            else
                            {
                                Ambulance.gameObject.SetActive(true);
                                Ambulance.transform.position = ambulance.StartPosition;
                                Ambulance.transform.rotation = Quaternion.identity;
                                ambulance.Guided = false;
                                ambulance._initNavPathed = false;
                                ambulance._isGotoGoal = false;
                            }
                        }
                    }
                    else
                    {
                        if (Ambulance.gameObject.activeSelf)
                        {
                            Ambulance.transform.position = ambulance.StartPosition;
                            Ambulance.transform.rotation = Quaternion.identity;
                            ambulance.Called = false;
                            ambulance.Guided = false;
                            ambulance._initNavPathed = false;
                            ambulance._isGotoGoal = false;
                            Ambulance.gameObject.SetActive(false);
                        }
                    }

                    break;
                case "xmlModelFireControl":
                    Transform fireCGroup;
                    if (MainEnv.transform.Find("FireControllerGroup"))
                        fireCGroup = MainEnv.transform.Find("FireControllerGroup");
                    else
                        fireCGroup = MainEnv.transform.Find("FireControlGP");
                    for (int i = 0; i < fireCGroup.childCount; i++)
                    {
                        if (itemElement.GetAttribute("Name").Equals(fireCGroup.GetChild(i).name))
                        {
                            if (Convert.ToBoolean(itemElement.GetAttribute("IsActive")))
                            {
                                fireCGroup.GetChild(i).GetChild(2).eulerAngles = TxtUtility.StrToVtr3(itemElement.GetAttribute("Rotation"));
                                fireCGroup.GetChild(i).GetComponent<Firemonitor>().particleWater.SetActive(true);
                            }
                            else
                            {
                                fireCGroup.GetChild(i).GetChild(2).eulerAngles = TxtUtility.StrToVtr3(FireControllerDict[fireCGroup.GetChild(i).name]);
                                if (fireCGroup.GetChild(i).GetComponent<Firemonitor>().particleWater != null)
                                    fireCGroup.GetChild(i).GetComponent<Firemonitor>().particleWater.SetActive(false);
                            }
                        }
                    }
                    break;
            }
        }
    }
ToolManager

  #region 快门:使用xmlNode存取数据
    public void SaveSnap(XmlDocument xmlDoc, XmlElement xmlNode)
    {
        //一种未点击警戒绳 一种是点击警戒绳
        if (ModelManager.Instance.jjsRoot.transform.childCount != 0)
        {
            //如果有警戒绳
            for (int i = 0; i < ModelManager.Instance.jjsRoot.transform.childCount; i++)
            {
                jjrParent.Add(ModelManager.Instance.jjsRoot.transform.GetChild(i).gameObject);
                for (int j = 0; j < ModelManager.Instance.jjsRoot.transform.GetChild(i).childCount; j++)
                {
                    var _xmlToolJJS = xmlDoc.CreateElement("ToolsJJS");
                    _xmlToolJJS.SetAttribute("ID", i + "." + j);
                    _xmlToolJJS.SetAttribute("Position", TxtUtility.Vtr3ToStr(ModelManager.Instance.jjsRoot.transform.GetChild(i).GetChild(j).position));
                    _xmlToolJJS.SetAttribute("Rotation", TxtUtility.Vtr3ToStr(ModelManager.Instance.jjsRoot.transform.GetChild(i).GetChild(j).eulerAngles));
                    _xmlToolJJS.SetAttribute("Scale", TxtUtility.Vtr3ToStr(ModelManager.Instance.jjsRoot.transform.GetChild(i).GetChild(j).localScale));
                    _xmlToolJJS.SetAttribute("Count", i.ToString() + "." + ModelManager.Instance.jjsRoot.transform.GetChild(i).childCount.ToString());
                    xmlNode.AppendChild(_xmlToolJJS);
                }
            }
        }
        else
        {
            var _xmlToolJJS = xmlDoc.CreateElement("ToolsJJS");
            _xmlToolJJS.SetAttribute("Count", 0.ToString());
            xmlNode.AppendChild(_xmlToolJJS);
        }
        for (int i = 0; i < toolAllList.Count; i++)
        {
            var _xmlToolInfo = xmlDoc.CreateElement("ToolsInfo");
            //当前人物ID
            _xmlToolInfo.SetAttribute("RoleID", RoleManager.Instance.CurrentRoleData.OwnId.ToString());
            //_xmlToolInfo.SetAttribute("RoleHXJ", RoleManager.Instance.CurrentRoleData.transform.Find(AppDefine.AirResName).gameObject.activeSelf.ToString());
            _xmlToolInfo.SetAttribute("Active", toolAllList[i].activeSelf.ToString());
            _xmlToolInfo.SetAttribute("Name", toolAllList[i].name);
            _xmlToolInfo.SetAttribute("Position", TxtUtility.Vtr3ToStr(toolAllList[i].transform.position));
            _xmlToolInfo.SetAttribute("Rotation", TxtUtility.Vtr3ToStr(toolAllList[i].transform.eulerAngles));
            if (toolAllList[i].gameObject.tag.CompareTo(GlobalTags.Extinguisher.ToString()) == 0)
            {
                _xmlToolInfo.SetAttribute("State", RoleManager.Instance.CurrentRoleData.nWithExtinguisherState.ToString());
            }
            //如果没有父物体 则回到toolRoot
            if (toolAllList[i].transform.parent == null)
            {
                _xmlToolInfo.SetAttribute("Parent", "");
            }
            else
            {
                _xmlToolInfo.SetAttribute("Parent", toolAllList[i].transform.parent.name.ToString());
            }
            xmlNode.AppendChild(_xmlToolInfo);
        }
        //ToolList 状态

    }
    public void LoadSnap(XmlElement xmlNode)
    {

        XmlNodeList nodeList = xmlNode.ChildNodes;
        foreach (XmlElement itemElement in nodeList)
        {
            if (itemElement.Name == "ToolsInfo")
            {
                for (int i = 0; i < toolAllList.Count; i++)
                {
                    if (itemElement.GetAttribute("Name").Equals(toolAllList[i].gameObject.name))
                    {
                        //RoleManager.Instance.RoleDicts[Convert.ToInt32(itemElement.GetAttribute("RoleID"))].transform.Find(AppDefine.AirResName).gameObject.SetActive(Convert.ToBoolean(itemElement.GetAttribute("RoleHXJ")));
                        toolAllList[i].gameObject.SetActive(Convert.ToBoolean(itemElement.GetAttribute("Active")));

                        var role = RoleManager.Instance.GetRoleById(itemElement.GetAttribute("RoleID").ToInt());

                        if (itemElement.GetAttribute("Parent") == "Bip01 R Hand")
                        {
                            toolAllList[i].gameObject.transform.SetParent(role.RightHand.transform);
                        }
                        else
                        {
                            toolAllList[i].gameObject.transform.SetParent(ToolRoot.transform);
                        }
                        toolAllList[i].gameObject.transform.position = TxtUtility.StrToVtr3(itemElement.GetAttribute("Position"));
                        toolAllList[i].gameObject.transform.eulerAngles = TxtUtility.StrToVtr3(itemElement.GetAttribute("Rotation"));
                        //如果是灭火器
                        if (toolAllList[i].gameObject.tag.CompareTo(GlobalTags.Extinguisher.ToString()) == 0)
                        {
                            //拿着灭火器的状态,0为没拿,1为拿着,2为喷着
                            switch (Convert.ToInt32(itemElement.GetAttribute("State")))
                            {
                                case 0:
                                    PutDownExtinguisherState();
                                    break;
                                case 1:
                                    PutDownExtinguisherState();
                                    role.GetExtinguisher(toolAllList[i]);
                                    break;
                                case 2:
                                    role.GetExtinguisher(toolAllList[i]);
                                    role.RpcUseExtinguisher(Vector3.zero);
                                    break;
                            }
                        }
                    }
                }
            }
            if (itemElement.Name == "ToolsJJS")
            {
                //如果有警戒绳  如果没有则删除多余的警戒绳
                if (ModelManager.Instance.jjsRoot.transform.childCount != 0)
                {
                    for (int i = 0; i < ModelManager.Instance.jjsRoot.transform.childCount; i++)
                    {
                        //如果存档没有JJS 则清空JJS
                        if (Convert.ToInt32(itemElement.GetAttribute("Count")) == 0)
                        {
                            RoleManager.Instance.CurrentRoleData.DestoryTools(ModelManager.Instance.jjsRoot.transform.GetChild(i).gameObject);
                        }
                        else
                        {
                            string[] strJJSCount = itemElement.GetAttribute("Count").Split('.');
                            if (!strJJSCount[1].Equals(ModelManager.Instance.jjsRoot.transform.GetChild(i).childCount))
                            {
                                //删除多余的JJS
                                for (int j = Convert.ToInt32(strJJSCount[1]); j < ModelManager.Instance.jjsRoot.transform.GetChild(i).childCount; j++)
                                {
                                    RoleManager.Instance.CurrentRoleData.DestoryTools(ModelManager.Instance.jjsRoot.transform.GetChild(i).GetChild(j).gameObject);
                                }
                            }
                        }
                    }
                }
            }
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity_阿黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值