using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
public class EffectPointList : EditorWindow {
public GameObject object1;
public static EffectPointList listWindow;
private string searchFolder = "Assets/Art/Characters";
private string[] prefabPathList;
private List<GameObject> instantiatePrefab = new List<GameObject>();
Dictionary<string, PrefabDict> prefabDict = new Dictionary<string, PrefabDict>();
[MenuItem("Assets/ListEffectPoints")]
static void Start()
{
listWindow = (EffectPointList)EditorWindow.GetWindow(typeof(EffectPointList), true, "特效点列表");
listWindow.minSize = new Vector2(400, 200);
listWindow.Show();
}
void OnGUI()
{
EditorGUILayout.HelpBox("在Assets/Art/Characters/Editor下生成EffectPointsInfo.xml。", MessageType.Info);
if (GUILayout.Button("生成特效点信息", GUILayout.Height(40)))
{
instantiatePrefab.Clear();
GetAllPrefab();
Dictionary<string, PrefabDict> xmlDict = CheckAllPrefab();
GenerateXML(xmlDict);
}
}
void GetAllPrefab()
{
prefabPathList = AssetDatabase.FindAssets("t:Prefab", new string[] { searchFolder });
for (int i = 0; i < prefabPathList.Length; ++i)
{
string prefabPath = AssetDatabase.GUIDToAssetPath(prefabPathList[i]);
GameObject obj = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)) as GameObject;
if (!prefabPath.Contains("Effects"))
{
GameObject clone = (GameObject)PrefabUtility.InstantiatePrefab(obj);
instantiatePrefab.Add(clone);
}
}
}
Dictionary<string, PrefabDict> CheckAllPrefab()
{
prefabDict.Clear();
foreach (var obj in instantiatePrefab)
{
if (obj == null)
continue;
PrefabDict pfb = new PrefabDict();
foreach (Transform child in obj.GetComponentsInChildren<Transform>() )
{
if( child.name.Contains("Head_C_EffectPoint") )
pfb.Head_C_EffectPoint = true;
if( child.name.Contains("Head_T_EffectPoint") )
pfb.Head_T_EffectPoint = true;
if( child.name.Contains("Hand_L_EffectPoint") )
pfb.Hand_L_EffectPoint = true;
if( child.name.Contains("Hand_R_EffectPoint") )
pfb.Hand_R_EffectPoint = true;
if( child.name.Contains("Foot_L_EffectPoint") )
pfb.Foot_L_EffectPoint = true;
if( child.name.Contains("Foot_R_EffectPoint") )
pfb.Foot_R_EffectPoint = true;
if( child.name.Contains("Chest_EffectPoint") )
pfb.Chest_EffectPoint = true;
if( child.name.Contains("Bottom_EffectPoint") )
pfb.Bottom_EffectPoint = true;
if( child.name.Contains("Weapon01_EffectPoint") )
pfb.Weapon01_EffectPoint = true;
if( child.name.Contains("Normal_HurtPoint") )
pfb.Normal_HurtPoint = true;
if( child.name.Contains("Special_HurtPoint") )
pfb.Special_HurtPoint = true;
if( child.name.Contains("Footsteps_EffectPoint") )
pfb.Footsteps_EffectPoint = true;
}
prefabDict.Add(obj.name, pfb);
DestroyImmediate(obj);
}
return prefabDict;
}
private class PrefabDict
{
public bool Head_C_EffectPoint = false;
public bool Head_T_EffectPoint = false;
public bool Hand_L_EffectPoint = false;
public bool Hand_R_EffectPoint = false;
public bool Foot_L_EffectPoint = false;
public bool Foot_R_EffectPoint = false;
public bool Chest_EffectPoint = false;
public bool Bottom_EffectPoint = false;
public bool Weapon01_EffectPoint = false;
public bool Normal_HurtPoint = false;
public bool Special_HurtPoint = false;
public bool Footsteps_EffectPoint = false;
}
void GenerateXML(Dictionary<string, PrefabDict> dict)
{
string xmlPath = Application.dataPath + "/Editor/EffectPointsInfo.xml";
if (File.Exists(xmlPath))
{
Debug.Log(xmlPath);
File.Delete(xmlPath);
}
XmlDocument xmlDoc = new XmlDocument();
XmlDeclaration xmldecl;
xmldecl = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null);
XmlElement root = xmlDoc.DocumentElement;
xmlDoc.InsertBefore(xmldecl, root);
XmlElement infoBase = xmlDoc.CreateElement("InfoBase"); //创建根节点,最上层节点 角色名
xmlDoc.AppendChild(infoBase);
foreach (var dic in dict)
{
XmlElement characterInfo = xmlDoc.CreateElement("effectPointsInfo");
infoBase.AppendChild(characterInfo);
XmlElement characterKey = xmlDoc.CreateElement("Character");
XmlElement Head_C_EffectPoint = xmlDoc.CreateElement("Head_C_EffectPoint");
XmlElement Head_T_EffectPoint = xmlDoc.CreateElement("Head_T_EffectPoint");
XmlElement Hand_L_EffectPoint = xmlDoc.CreateElement("Hand_L_EffectPoint");
XmlElement Hand_R_EffectPoint = xmlDoc.CreateElement("Hand_R_EffectPoint");
XmlElement Foot_L_EffectPoint = xmlDoc.CreateElement("Foot_L_EffectPoint");
XmlElement Foot_R_EffectPoint = xmlDoc.CreateElement("Foot_R_EffectPoint");
XmlElement Chest_EffectPoint = xmlDoc.CreateElement("Chest_EffectPoint");
XmlElement Bottom_EffectPoint = xmlDoc.CreateElement("Bottom_EffectPoint");
XmlElement Weapon01_EffectPoint = xmlDoc.CreateElement("Weapon01_EffectPoint");
XmlElement Normal_HurtPoint = xmlDoc.CreateElement("Normal_HurtPoint");
XmlElement Special_HurtPoint = xmlDoc.CreateElement("Special_HurtPoint");
XmlElement Footsteps_EffectPoint = xmlDoc.CreateElement("Footsteps_EffectPoint");
characterKey.InnerText = dic.Key.ToString();
Head_C_EffectPoint.InnerText = dic.Value.Head_C_EffectPoint.ToString();
Head_T_EffectPoint.InnerText = dic.Value.Head_T_EffectPoint.ToString();
Hand_L_EffectPoint.InnerText = dic.Value.Hand_L_EffectPoint.ToString();
Hand_R_EffectPoint.InnerText = dic.Value.Hand_R_EffectPoint.ToString();
Foot_L_EffectPoint.InnerText = dic.Value.Foot_L_EffectPoint.ToString();
Foot_R_EffectPoint.InnerText = dic.Value.Foot_R_EffectPoint.ToString();
Chest_EffectPoint.InnerText = dic.Value.Chest_EffectPoint.ToString();
Bottom_EffectPoint.InnerText = dic.Value.Bottom_EffectPoint.ToString();
Weapon01_EffectPoint.InnerText = dic.Value.Weapon01_EffectPoint.ToString();
Normal_HurtPoint.InnerText = dic.Value.Normal_HurtPoint.ToString();
Special_HurtPoint.InnerText = dic.Value.Special_HurtPoint.ToString();
Footsteps_EffectPoint.InnerText = dic.Value.Footsteps_EffectPoint.ToString();
characterInfo.AppendChild(characterKey);
characterInfo.AppendChild(Head_C_EffectPoint);
characterInfo.AppendChild(Head_T_EffectPoint);
characterInfo.AppendChild(Hand_L_EffectPoint);
characterInfo.AppendChild(Hand_R_EffectPoint);
characterInfo.AppendChild(Foot_L_EffectPoint);
characterInfo.AppendChild(Foot_R_EffectPoint);
characterInfo.AppendChild(Chest_EffectPoint);
characterInfo.AppendChild(Bottom_EffectPoint);
characterInfo.AppendChild(Weapon01_EffectPoint);
characterInfo.AppendChild(Normal_HurtPoint);
characterInfo.AppendChild(Special_HurtPoint);
characterInfo.AppendChild(Footsteps_EffectPoint);
}
xmlDoc.Save(xmlPath); //创建EffectPointsInfo.xml文件
AssetDatabase.Refresh();
this.ShowNotification( new GUIContent("数据生成!") );
}
}