游戏存储工具类

using UnityEngine;
using System.Collections;
using System.Xml;
using System.Collections.Generic;
using System.Reflection;
using System;
/// <summary>
/// 游戏存储读取工具类
/// </summary>
public class Record {
	
	/// <summary>
	/// 存档名称
	/// </summary>
	public static string RecordName;
	
	/// <summary>
	/// 切换场景
	/// </summary>
	public static void ChangeScene(Character player,string nextLevel,string index){
		UILocation.locationID = index;
		SaveGame(player,"Temp");
		PlayerPrefs.SetString("LevelName",nextLevel);
		Application.LoadLevel("Load");
	}
	
	/// <summary>
	/// 存储信息(临时)
	/// </summary>
	public static void SaveGame(Character player){
		SaveGame(player,"Temp");
	}
	
	/// <summary>
	/// 存储信息(指定)
	/// </summary>
	public static void SaveGame(Character player, string index){
		SaveRecord(player,index);
		//玩家数据存储
		string data = "<?xml version='1.0' encoding='utf-8'?>";
		data += "<Player>";
		data += saveSystem(player);
		data += saveBaseInfo(player);
		data += saveItems(player);
		data += saveSkills(player);
		data += saveTask(player);
		data += saveAttendant(player);
		data += saveHotSkill();
		data += "</Player>";
		//获取文件路径
		string filePath = "//Save//Record_" +index;
		Persistence.CreateXML(filePath,data);
		Debug.Log("Save :"+filePath);
	}
	
	/// <summary>
	/// 存档记录
	/// </summary>
	public static void SaveRecord(Character player,string index){
		//保存图片
		CaptureScreen.SaveCapture(index);
		
		//存储XML
		XmlDocument xml = new XmlDocument();
		string xmlPath = Application.dataPath + "//StreamingAssets//Xml//Persistence//Save//Record.xml";
		xml.Load(xmlPath);
		
		string xmlStr = "<?xml version='1.0' encoding='utf-8'?>";
		xmlStr += "<records>";
		XmlNodeList records = xml.SelectSingleNode("records").ChildNodes;
		for(int i = 0; i < records.Count; i++){
			xmlStr += "<record>";
			XmlNodeList recordList = records.Item(i).ChildNodes;
			if(recordList.Item(0).InnerText == index){
				DateTime date = System.DateTime.Now;
				string dateStr = date.Year+" / "+date.Month+" / "+date.Day;
				xmlStr += "<index>"+index+"</index>";
				xmlStr += "<savePic>"+index+"</savePic>";
				xmlStr += "<character>"+player.realname+"</character>";
				xmlStr += "<date>"+dateStr+"</date>";
				xmlStr += "<level>等 级 "+player.level+"</level>";
				xmlStr += "<location>"+UILocation.LocationLabel.text+"</location>";
				xmlStr += "<savenum>存 档 "+index+"</savenum>";
				xmlStr += "<time>"+WeatherManager.GetGameTime()+"</time>";
			}else{
				xmlStr += "<index>"+recordList.Item(0).InnerText+"</index>";
				xmlStr += "<savePic>"+recordList.Item(1).InnerText+"</savePic>";
				xmlStr += "<character>"+recordList.Item(2).InnerText+"</character>";
				xmlStr += "<date>"+recordList.Item(3).InnerText+"</date>";
				xmlStr += "<level>"+recordList.Item(4).InnerText+"</level>";
				xmlStr += "<location>"+recordList.Item(5).InnerText+"</location>";
				xmlStr += "<savenum>"+recordList.Item(6).InnerText+"</savenum>";
				xmlStr += "<time>"+recordList.Item(7).InnerText+"</time>";
			}
			xmlStr += "</record>";
		}
		xmlStr += "</records>";
		Persistence.CreateXML("//Save//Record",xmlStr);
	}
	
	/// <summary>
	/// 读取存档记录
	/// </summary>
	public static XmlNodeList LoadRecord(string index){
		XmlNodeList list = null;
		
		XmlDocument xml = new XmlDocument();
		string xmlPath = Application.dataPath + "//StreamingAssets//Xml//Persistence//Save//Record.xml";
		xml.Load(xmlPath);
		
		XmlNodeList records = xml.SelectSingleNode("records").ChildNodes;
		for(int i = 0; i < records.Count; i++){
			XmlNodeList recordList = records.Item(i).ChildNodes;
			if(recordList.Item(0).InnerText == index){
				list = recordList;
			}
		}
		return list;
	}
	
	/// <summary>
	/// 用户读取信息(指定)
	/// </summary>
	public static void LoadGame(){
		if(Record.RecordName == null)
			Record.RecordName = "Temp";
		
		string index = Record.RecordName;
		Transform player = GameObject.FindGameObjectWithTag("Player").transform;
		//获取文件路径,解析XML,读取记录
		XmlDocument xml = new XmlDocument();
		string filePath = Application.dataPath + "//StreamingAssets//Xml//Persistence//Save//Record_"+index+".xml";
		xml.Load(filePath);
		XmlNodeList PlayerInfo = xml.SelectSingleNode("Player").ChildNodes;
		
		//①加载系统信息
		XmlNodeList systemInfo = PlayerInfo.Item(0).ChildNodes;
		loadSystem(systemInfo);
		
		//②初始化起始位置
		string locationID = UILocation.locationID;
		if(locationID != null){
			GameObject location = GameObject.Find(locationID);
			if(location != null){
				player.position = location.transform.position;
			}
		}
		
		//③加载角色基本信息
		XmlNodeList baseInfo = PlayerInfo.Item(1).ChildNodes;
		string characterName = getCharacterName(baseInfo);
		
		//④实例化模型对象,设置层级关系
		GameObject prefab = ResourceManager.GetCharacterObj(characterName);
		GameObject character = GameObject.Instantiate(prefab,player.position,player.rotation) as GameObject;
		character.transform.parent = player;
		
		//⑤添加角色信息组件
		Character ct = player.gameObject.AddComponent(characterName) as Character;
		loadBaseInfo(baseInfo,ct);
		ct.mapIconType = MapIconType.Player;
		
		//⑥加载其他信息,如道具、技能、任务、同伴、快捷键
		if(PlayerInfo.Count > 2){
			loadItems(PlayerInfo.Item(2).ChildNodes,ct);
			loadSkills(PlayerInfo.Item(3).ChildNodes,ct);
			loadTask(PlayerInfo.Item(4).ChildNodes,ct);
			loadAttendant(PlayerInfo.Item(5).ChildNodes,ct);
			loadHotSkill(PlayerInfo.Item(6).ChildNodes,ct);
		}
		
		//⑦添加控制器组件
		player.gameObject.AddComponent<PlayControl>();
		
		//⑧添加人物预览
		GameObject characterModel = GameObject.Find("CharacterModel") as GameObject;
		GameObject model = GameObject.Instantiate(prefab) as GameObject;
		model.transform.parent = characterModel.transform;
		
		model.transform.localPosition = new Vector3(0f,0f,0f);
		model.transform.rotation = new Quaternion(0f,-180f,0f,0f);
		Vector3 scale = Vector3.zero;
		switch(ct.name){
			case "Paladin": scale = new Vector3(210f,150f,210f); break;
			case "Berserker": scale = new Vector3(180f,120f,180f); break;
		}
		model.transform.localScale = scale;
		model.name = "model";
		setLayer(model.transform,characterModel.layer);
		
		Debug.Log("Load :"+filePath);
	}
	
	/// <summary>
	/// 设置层为NGUI
	/// </summary>
	static void setLayer(Transform model,int layer){
		foreach(Transform t in model.transform){
			t.gameObject.layer = layer;
			setLayer(t,layer);
		}
	}
	
	/// <summary>
	/// 获取记录的角色类型
	/// </summary>
	static string getCharacterName(XmlNodeList list){
		return list.Item(1).InnerText;
	}
	
	/// <summary>
	/// 获取地图信息
	/// </summary>
	public static string getLevelName(string index){
		//获取文件路径,解析XML,读取记录
		XmlDocument xml = new XmlDocument();
		string filePath = Application.dataPath + "//StreamingAssets//Xml//Persistence//Save//Record_"+index+".xml";
		xml.Load(filePath);
		
		XmlNodeList systemInfo = xml.SelectSingleNode("Player").ChildNodes.Item(0).ChildNodes;
		return systemInfo.Item(1).InnerText;
	}
	
	/// <summary>
	/// 保存系统信息
	/// </summary>
	static string saveSystem(Character ct){
		string xml = "";
		xml += "<system>";
		xml += "<worldTime>"+WeatherManager.WorldTime+"</worldTime>";
		xml += "<levelName>"+Application.loadedLevelName+"</levelName>";
		xml += "<locationID>"+UILocation.locationID+"</locationID>";
		xml += "</system>";
		return xml;
	}
	
	/// <summary>
	/// 加载系统信息
	/// </summary>
	static void loadSystem(XmlNodeList list){
		WeatherManager.WorldTime = float.Parse(list.Item(0).InnerText);
		string id = list.Item(2).InnerText;
		UILocation.locationID = id;
	}
	
	/// <summary>
	/// 保存角色基本信息
	/// </summary>
	static string saveBaseInfo(Character ct){
		string baseInfo = "";
		baseInfo += "<baseInfo>";
		
		#region 角色信息
		baseInfo += "<id>"+ct.id+"</id>";
		baseInfo += "<name>"+ct.name+"</name>";
		baseInfo += "<realname>"+ct.realname+"</realname>";
		baseInfo += "<teamType>"+(int)ct.teamType+"</teamType>";
		baseInfo += "<occupation>"+(int)ct.occupation+"</occupation>";
		baseInfo += "<portrait>"+ct.portrait+"</portrait>";
		baseInfo += "<introduction>"+ct.introduction+"</introduction>";
		baseInfo += "<fightGrade>"+(int)ct.fightGrade+"</fightGrade>";
		#endregion
		
		#region 基础属性
		baseInfo += "<level>"+ct.level+"</level>";
		baseInfo += "<exp>"+ct.exp+"</exp>";
		baseInfo += "<point>"+ct.point+"</point>";
		baseInfo += "<skillPoint>"+ct.skillPoint+"</skillPoint>";
		baseInfo += "<power>"+ct.power+"</power>";
		baseInfo += "<strength>"+ct.strength+"</strength>";
		baseInfo += "<intelligence>"+ct.intelligence+"</intelligence>";
		baseInfo += "<dexterity>"+ct.dexterity+"</dexterity>";
		
		baseInfo += "<health_max>"+ct.health_max+"</health_max>";
		baseInfo += "<health_cur>"+ct.health_cur+"</health_cur>";
		baseInfo += "<health_restore>"+ct.health_restore+"</health_restore>";
		baseInfo += "<magic_max>"+ct.magic_max+"</magic_max>";
		baseInfo += "<magic_cur>"+ct.magic_cur+"</magic_cur>";
		baseInfo += "<magic_restore>"+ct.magic_restore+"</magic_restore>";
		
		baseInfo += "<damage_max>"+ct.damage_max+"</damage_max>";
		baseInfo += "<damage_min>"+ct.damage_min+"</damage_min>";
		baseInfo += "<defence>"+ct.defence+"</defence>";
		baseInfo += "<magic_power>"+ct.magic_power+"</magic_power>";
		baseInfo += "<magic_resist>"+ct.magic_resist+"</magic_resist>";
		
		baseInfo += "<crit>"+ct.crit+"</crit>";
		baseInfo += "<crit_damage>"+ct.crit_damage+"</crit_damage>";
		baseInfo += "<speed>"+ct.speed+"</speed>";
		baseInfo += "<attackSpeed>"+ct.attackSpeed+"</attackSpeed>";
		baseInfo += "<maxAttackDistance>"+ct.maxAttackDistance+"</maxAttackDistance>";
		baseInfo += "<rotationSpeed>"+ct.rotationSpeed+"</rotationSpeed>";
		
		baseInfo += "<resist_fire>"+ct.resist_fire+"</resist_fire>";
		baseInfo += "<resist_forzen>"+ct.resist_forzen+"</resist_forzen>";
		baseInfo += "<resist_lighting>"+ct.resist_lighting+"</resist_lighting>";
		baseInfo += "<resist_poison>"+ct.resist_poison+"</resist_poison>";
		baseInfo += "<resist_holy>"+ct.resist_holy+"</resist_holy>";
		baseInfo += "<resist_dark>"+ct.resist_dark+"</resist_dark>";
		
		baseInfo += "<leadership>"+ct.leadership+"</leadership>";
		baseInfo += "<requiredLeadership>"+ct.requiredLeadership+"</requiredLeadership>";
		#endregion
		
		#region 升级成长率
		baseInfo += "<power_up>"+(int)ct.power_up+"</power_up>";
		baseInfo += "<strength_up>"+(int)ct.strength_up+"</strength_up>";
		baseInfo += "<intelligence_up>"+(int)ct.intelligence_up+"</intelligence_up>";
		baseInfo += "<dexterity_up>"+(int)ct.dexterity_up+"</dexterity_up>";
		baseInfo += "<baseExp>"+ct.baseExp+"</baseExp>";
		#endregion
		
		#region 辅助信息
		baseInfo += "<isLive>"+ct.isLive+"</isLive>";
		baseInfo += "<isInit>"+ct.isInit+"</isInit>";
		#endregion
		
		baseInfo += "</baseInfo>";
		return baseInfo;
	}
	
	/// <summary>
	/// 加载角色基本信息
	/// </summary>
	static void loadBaseInfo(XmlNodeList list,Character ct){
		#region 角色信息
		ct.id = list.Item(0).InnerText;
		ct.name = list.Item(1).InnerText;
		ct.realname = list.Item(2).InnerText;
		ct.teamType = (TeamType)int.Parse(list.Item(3).InnerText);
		ct.occupation = (Occupation)int.Parse(list.Item(4).InnerText);
		ct.portrait = list.Item(5).InnerText;
		ct.introduction = list.Item(6).InnerText;
		ct.fightGrade = (FightGrade)int.Parse(list.Item(7).InnerText);
		#endregion
		
		#region 基础属性
		ct.level = int.Parse(list.Item(8).InnerText);
		ct.exp = int.Parse(list.Item(9).InnerText);
		ct.point = int.Parse(list.Item(10).InnerText);
		ct.skillPoint = int.Parse(list.Item(11).InnerText);
		ct.power = float.Parse(list.Item(12).InnerText);
		ct.strength = float.Parse(list.Item(13).InnerText);
		ct.intelligence = float.Parse(list.Item(14).InnerText);
		ct.dexterity = float.Parse(list.Item(15).InnerText);
		
		ct.health_max = float.Parse(list.Item(16).InnerText);
		ct.health_cur = float.Parse(list.Item(17).InnerText);
		ct.health_restore = float.Parse(list.Item(18).InnerText);
		ct.magic_max = float.Parse(list.Item(19).InnerText);
		ct.magic_cur = float.Parse(list.Item(20).InnerText);
		ct.magic_restore = float.Parse(list.Item(21).InnerText);
		
		ct.damage_max = float.Parse(list.Item(22).InnerText);
		ct.damage_min = float.Parse(list.Item(23).InnerText);
		ct.defence = float.Parse(list.Item(24).InnerText);
		ct.magic_power = float.Parse(list.Item(25).InnerText);
		ct.magic_resist = float.Parse(list.Item(26).InnerText);
		
		ct.crit = float.Parse(list.Item(27).InnerText);
		ct.crit_damage = float.Parse(list.Item(28).InnerText);
		ct.speed = float.Parse(list.Item(29).InnerText);
		ct.attackSpeed = float.Parse(list.Item(30).InnerText);
		ct.maxAttackDistance = float.Parse(list.Item(31).InnerText);
		ct.rotationSpeed = float.Parse(list.Item(32).InnerText);
		
		ct.resist_fire = int.Parse(list.Item(33).InnerText);
		ct.resist_forzen = int.Parse(list.Item(34).InnerText);
		ct.resist_lighting = int.Parse(list.Item(35).InnerText);
		ct.resist_poison = int.Parse(list.Item(36).InnerText);
		ct.resist_holy = int.Parse(list.Item(37).InnerText);
		ct.resist_dark = int.Parse(list.Item(38).InnerText);
		
		ct.leadership =  int.Parse(list.Item(39).InnerText);
		ct.requiredLeadership =  int.Parse(list.Item(40).InnerText);
		#endregion
		
		#region 升级成长率
		ct.power_up = (GrowthGrade)int.Parse(list.Item(41).InnerText);
		ct.strength_up = (GrowthGrade)int.Parse(list.Item(42).InnerText);
		ct.intelligence_up = (GrowthGrade)int.Parse(list.Item(43).InnerText);
		ct.dexterity_up = (GrowthGrade)int.Parse(list.Item(44).InnerText);
		ct.baseExp = int.Parse(list.Item(45).InnerText);
		#endregion
		
		#region 辅助信息
		ct.isLive = bool.Parse(list.Item(46).InnerText);
		ct.isInit = bool.Parse(list.Item(47).InnerText);
		#endregion
	}
	
	/// <summary>
	/// 保存道具信息
	/// </summary>
	static string saveItems(Character ct){
		string itemsXML = "";
		ItemManager itemManager = ct.itemManager;
		
		if(itemManager != null){
			itemsXML += "<items>";
			itemsXML += "<money>"+itemManager.Money+"</money>";
			itemsXML += "<itemCount>"+itemManager.items.Length+"</itemCount>";
			itemsXML += "<equipCount>"+itemManager.equipments.Length+"</equipCount>";
			
			//保存道具信息
			Item[] items = itemManager.items;
			itemsXML += "<list>";
			for(int i = 0; i < items.Length; i++){
				Item item = items[i];
				if(item != null){
					itemsXML += "<item>";
					itemsXML += "<index>"+i+"</index>";
					itemsXML += "<name>"+item.spriteName+"</name>";
					itemsXML += "<count>"+item.count+"</count>";
					itemsXML += "</item>";
				}
			}
			itemsXML += "</list>";
			
			//保存装备信息
			itemsXML += "<equipments>";
			Equipment[] equips = itemManager.equipments;
			for(int i = 0; i < equips.Length; i++){
				Equipment equip = equips[i];
				if(equip != null){
					itemsXML += "<equip>";
					itemsXML += "<index>"+i+"</index>";
					itemsXML += "<name>"+equip.spriteName+"</name>";
					itemsXML += "</equip>";
				}
			}
			itemsXML += "</equipments>";
			itemsXML += "</items>";
		}
		return itemsXML;
	}
	
	/// <summary>
	/// 加载道具信息
	/// </summary>
	static void loadItems(XmlNodeList list,Character ct){
		if(list == null) return;
		int money = int.Parse(list.Item(0).InnerText);
		int itemCount = int.Parse(list.Item(1).InnerText);
		int equipCount = int.Parse(list.Item(2).InnerText);
		
		//初始化道具管理器
		GameObject targetObj = ct.gameObject;
		ItemManager itemManager = targetObj.AddComponent<ItemManager>();
		ct.itemManager = itemManager;
		itemManager.Money = money;
		Item[] items = new Item[itemCount];
		Equipment[] equipments = new Equipment[equipCount];
		itemManager.items = items;
		itemManager.equipments = equipments;
		
		//加载道具信息
		XmlNodeList itemsList = list.Item(3).ChildNodes;
		for(int i = 0; i < itemsList.Count; i++){
			XmlNodeList itemList = itemsList.Item(i).ChildNodes;
			int index = int.Parse(itemList.Item(0).InnerText);
			string name = itemList.Item(1).InnerText;
			int count = int.Parse(itemList.Item(2).InnerText);
			
			Item item = targetObj.AddComponent(name) as Item;
			item.init();
			item.count = count;
			items[index] = item;
		}
		
		//加载装备信息
		XmlNodeList equipmentsList = list.Item(4).ChildNodes;
		for(int i = 0; i < equipmentsList.Count; i++){
			XmlNodeList equipList = equipmentsList.Item(i).ChildNodes;
			int index = int.Parse(equipList.Item(0).InnerText);
			string name = equipList.Item(1).InnerText;
			
			Equipment equip = targetObj.AddComponent(name) as Equipment;
			equipments[index] = equip;
		}
	}
	
	/// <summary>
	/// 保存技能信息
	/// </summary>
	static string saveSkills(Character ct){
		string xml = "";
		SkillManager skillManager = ct.skillManager;
		
		if(skillManager != null){
			xml += "<skills>";
			Skill[][] skillTrees = skillManager.skills;
			xml += "<treesCount>"+skillTrees.Length+"</treesCount>";
			xml += "<skillsCount>"+skillTrees[0].Length+"</skillsCount>";
			
			xml += "<list>";
			for(int i = 0; i < skillTrees.Length; i++){
				Skill[] tree = skillTrees[i];
				for(int j = 0; j < tree.Length; j++){
					Skill skill = tree[j];
					if(skill != null){
						xml += "<skill>";
						xml += "<tree>"+i+"</tree>";
						xml += "<index>"+j+"</index>";
						xml += "<name>"+skill.spriteName+"</name>";
						xml += "<level>"+skill.level+"</level>";
						xml += "</skill>";
					}
				}
			}
			xml += "</list>";
			xml += "</skills>";
		}
		return xml;
	}
	
	/// <summary>
	/// 加载技能信息
	/// </summary>
	static void loadSkills(XmlNodeList list,Character ct){
		if(list == null) return;
		int treesCount = int.Parse(list.Item(0).InnerText);
		int skillsCount = int.Parse(list.Item(1).InnerText);
		
		GameObject targetObj = ct.gameObject;
		SkillManager skillManager = targetObj.AddComponent<SkillManager>();
		
		//初始化技能树
		Skill[][] skills = new Skill[treesCount][];
		for(int i = 0; i < treesCount; i++){
			skills[i] = new Skill[skillsCount];
		}
		skillManager.skills = skills;
		skillManager.isInit = true;
		ct.skillManager = skillManager;
		
		//加载技能信息
		XmlNodeList skillsList = list.Item(2).ChildNodes;
		for(int i = 0; i < skillsList.Count; i++){
			XmlNodeList skillList = skillsList.Item(i).ChildNodes;
			int tree = int.Parse(skillList.Item(0).InnerText);
			int index = int.Parse(skillList.Item(1).InnerText);
			string skillName = skillList.Item(2).InnerText;
			int level = int.Parse(skillList.Item(3).InnerText);
			Skill skill = targetObj.AddComponent(skillName) as Skill;
			skill.init(ct.gameObject);
			skill.setLevel(level);
			skills[tree][index] = skill;
		}
	}
	
	/// <summary>
	/// 保存任务信息
	/// </summary>
	static string saveTask(Character ct){
		string xml = "";
		Task[] tasks = TaskManager.tasks;
		if(tasks != null){
			xml += "<tasks>";
			xml += "<taskCount>"+tasks.Length+"</taskCount>";
			
			xml += "<list>";
			for(int i = 0; i < tasks.Length; i++){
				Task task = tasks[i];
				if(task != null){
					xml += "<task>";
					xml += "<index>"+i+"</index>";
					xml += "<ID>"+task.ID+"</ID>";
					xml += "<complete>"+task.complete+"</complete>";
					
					//记录杀敌个数
					if(task is Fight){
						Fight fight = (Fight)task;
						xml += "<count>"+fight.count+"</count>";
					}
					xml += "</task>";
				}
			}
			xml += "</list>";
			xml += "</tasks>";
		}
		return xml;
	}
	
	/// <summary>
	/// 加载任务信息
	/// </summary>
	static void loadTask(XmlNodeList list,Character ct){
		if(list == null) return;
		TaskManager taskManager = ct.gameObject.AddComponent<TaskManager>();
		
		int taskCount = int.Parse(list.Item(0).InnerText);
		Task[] tasks = new Task[taskCount];
		TaskManager.tasks = tasks;
		ct.taskManager = taskManager;
		
		XmlNodeList tasksList = list.Item(1).ChildNodes;
		for(int i = 0; i < tasksList.Count; i++){
			XmlNodeList taskList = tasksList.Item(i).ChildNodes;
			int index = int.Parse(taskList.Item(0).InnerText);
			string ID = taskList.Item(1).InnerText;
			bool complete = bool.Parse(taskList.Item(2).InnerText);
			
			Task task = TaskManager.LoadTask(ID);
			task.complete = complete;
			if(task is Fight){
				Fight fight = (Fight)task;
				fight.count = int.Parse(taskList.Item(3).InnerText);
			}
			tasks[index] = task;
		}
		TaskManager.isInit = true;
	}
	
	/// <summary>
	/// 保存同伴信息
	/// </summary>
	static string saveAttendant(Character ct){
		string xml = "";
		if(ct.attendantManager != null){
			List<Attendant> attendants = ct.attendantManager.attendants;
			if(attendants != null && attendants.Count > 0){
				xml += "<attendants>";
				for(int i = 0; i < attendants.Count; i++){
					Attendant attendant = attendants[i];
					Character ctt = attendant.character;
					xml += "<attendant>";
					xml += "<isFight>"+attendant.isFight+"</isFight>";
					xml += saveBaseInfo(ctt);
					xml += "</attendant>";
				}
				xml += "</attendants>";
			}
		}
		return xml;
	}
	
	/// <summary>
	/// 加载同伴信息
	/// </summary>
	static void loadAttendant(XmlNodeList list,Character ct){
		if(list == null) return;
		AttendantManager attendantManager = ct.gameObject.AddComponent<AttendantManager>();
		ct.attendantManager = attendantManager;
		attendantManager.attendants = new List<Attendant>();
		ct.attendantManager = attendantManager;
		
		for(int i = 0; i < list.Count; i++){
			XmlNodeList attList = list.Item(i).ChildNodes;
			bool isFight = bool.Parse(attList.Item(0).InnerText);
			XmlNodeList baseInfo = attList.Item(1).ChildNodes;
			
			//反射动态生成角色对象
			string characterName = getCharacterName(baseInfo);
			Character character = Assembly.Load("Assembly-CSharp").CreateInstance(characterName) as Character;
			loadBaseInfo(baseInfo,character);
			
			//初始化同伴信息
			Attendant att = new Attendant(character);
			att.isFight = isFight;
			attendantManager.attendants.Add(att);
		}
		AttendantManager.isInit = true;
	}
	
	/// <summary>
	/// 保存快捷键设置
	/// </summary>
	static string saveHotSkill(){
		string xml = "";
		UISkill UISkill = GameObject.Find("MainUI").GetComponent<UISkill>();
		if(UISkill != null){
			xml += "<hotskills>";
			Transform[] hotSkills = UISkill.hotSkills;
			for(int i = 0; i < hotSkills.Length; i++){
				Transform hotSkill = hotSkills[i];
				string spriteName = hotSkill.Find("skill").GetComponent<UISprite>().spriteName;
				int skillID = (int)hotSkill.Find("id").localPosition.x;
				
				xml += "<hotskill>";
				xml += "<index>"+hotSkill.name+"</index>";
				xml += "<spriteName>"+spriteName+"</spriteName>";
				xml += "<skillID>"+skillID+"</skillID>";
				xml += "</hotskill>";
			}
			xml += "</hotskills>";
		}
		return xml;
	}
	
	/// <summary>
	/// 加载快捷键设置
	/// </summary>
	static void loadHotSkill(XmlNodeList list,Character ct){
		if(list == null) return;
		GameObject hotSkills = GameObject.Find("MainUI/Camera/Skill");
		for(int i = 0; i < list.Count; i++){
			XmlNodeList hotSkill = list.Item(i).ChildNodes;
			string indexName = hotSkill.Item(0).InnerText;
			string spriteName = hotSkill.Item(1).InnerText;
			float id = float.Parse(hotSkill.Item(2).InnerText);
			
			hotSkills.transform.Find(indexName+"/skill").GetComponent<UISprite>().spriteName = spriteName;
			hotSkills.transform.Find(indexName+"/id").localPosition = new Vector3(id,0f,0f);
		}
	}
}

  

原文地址:https://www.cnblogs.com/xiao-wei-wei/p/3547345.html