【XML】xml 存档

来源:互联网 发布:在线下载淘宝商城 编辑:程序博客网 时间:2024/06/05 00:49

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

 #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);                                }                            }                        }                    }                }            }        }    }