FunctionEventEditor.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using OfficeOpenXml;
  6. using System;
  7. public class FunctionEventEditor : EditorWindow
  8. {
  9. static string s_functionExcelFileName = "FunctionCfg.xlsx";
  10. static List<FunctionDataAsset> m_funEvents = new List<FunctionDataAsset>();
  11. static List<string> m_funIcons = new List<string>();
  12. static List<string> m_textIcons = new List<string>();
  13. static FunctionEventEditor m_instance = null;
  14. static int m_buffId = 0;
  15. public static bool isShowing = false;
  16. public static void GetFunctionEventEditor(int buffId)
  17. {
  18. m_buffId = buffId;
  19. GetIcons();
  20. GetFunsList();
  21. RefreshPanel();
  22. }
  23. public static void RefreshPanel()
  24. {
  25. FunctionEventEditor panel = GetPanel();
  26. panel.Repaint();
  27. isShowing = true;
  28. }
  29. public static FunctionEventEditor GetPanel()
  30. {
  31. if (null == m_instance)
  32. {
  33. m_instance = EditorWindow.GetWindowWithRect<FunctionEventEditor>(new Rect(0,0,800,600),false, "buff效果编辑器");
  34. }
  35. return m_instance;
  36. }
  37. static void GetFunsList()
  38. {
  39. m_funEvents.Clear();
  40. try
  41. {
  42. string filePath = EditorPrefs.GetString(s_functionExcelFileName, string.Empty);
  43. if (!SkillEditor.IsVaildGlobalPath(filePath, s_functionExcelFileName))
  44. {
  45. string content = string.Concat("请选择", s_functionExcelFileName, "文件");
  46. string[] filters = new string[2]
  47. {
  48. "Excel File", SkillEditor.c_ExcelFileExtension
  49. };
  50. filePath = EditorUtility.OpenFilePanelWithFilters(content, Application.dataPath, filters);
  51. if (!SkillEditor.IsVaildGlobalPath(filePath, s_functionExcelFileName))
  52. {
  53. EditorUtility.DisplayDialog("错误", string.Concat("未选择", s_functionExcelFileName, "文件"), "确定");
  54. return;
  55. }
  56. EditorPrefs.SetString(s_functionExcelFileName, filePath);
  57. }
  58. FileInfo fileInfo = new FileInfo(filePath);
  59. {
  60. using (var excelPackage = new ExcelPackage(fileInfo))
  61. {
  62. var sheets = excelPackage.Workbook.Worksheets;
  63. var sheet = sheets[1];
  64. int rowIndex = 4;
  65. while (!string.IsNullOrEmpty(sheet.GetValue<string>(rowIndex, 1)))
  66. {
  67. FunctionDataAsset fun = FunctionDataAsset.CreateFunAsset(sheet, rowIndex);
  68. fun.iconIdx = GetIconIdx(fun.icon);
  69. fun.wordIdx = GetTextIconIdx(fun.word);
  70. fun.effectIdx = SkillEditor.GetEffectIdx(fun.effectId);
  71. m_funEvents.Add(fun);
  72. rowIndex += 1;
  73. }
  74. }
  75. }
  76. if(m_funEvents.Count > 0)
  77. GetPanel().SetCurOpEvent(0);
  78. }
  79. catch (Exception e)
  80. {
  81. Debug.LogException(e);
  82. EditorUtility.DisplayDialog("错误", string.Concat("无法读取", s_functionExcelFileName, "文件数据"), "确定");
  83. }
  84. Debug.Log("fun cnt:" + m_funEvents.Count);
  85. }
  86. static void GetIcons()
  87. {
  88. m_funIcons.Clear();
  89. m_textIcons.Clear();
  90. string path = Constants.IconDir + "/Buff";
  91. string[] fileList = FileUtils.TraverseAllFiles(path, "*.png");
  92. for (int idx = 0; idx < fileList.Length; idx++)
  93. {
  94. string iconName = fileList[idx];
  95. string icon = FileUtils.RemoveExtension(FileUtils.RemoveParent(Constants.IconDir, iconName));
  96. if (icon.Contains("text_"))
  97. m_textIcons.Add(icon);
  98. else
  99. m_funIcons.Add(icon);
  100. }
  101. }
  102. GUIStyle curStyle = null;
  103. private void OnGUI()
  104. {
  105. EditorGUILayout.BeginHorizontal();
  106. ShowFunEventList();
  107. EditorGUILayout.BeginVertical(GUILayout.Width(400));
  108. ShowOpPnl();
  109. ShowFunEventData();
  110. EditorGUILayout.EndVertical();
  111. EditorGUILayout.EndHorizontal();
  112. }
  113. private void OnEnable()
  114. {
  115. if (curStyle == null)
  116. {
  117. curStyle = new GUIStyle();
  118. curStyle.fontSize = 20;
  119. curStyle.alignment = TextAnchor.MiddleLeft;
  120. curStyle.normal.textColor = Color.green;
  121. }
  122. }
  123. private void OnDestroy()
  124. {
  125. isShowing = false;
  126. }
  127. Vector2 scrollPos = Vector2.zero;
  128. bool bExtendTree = true;
  129. int curFunIdx = -1;
  130. public FunctionDataAsset curFunEventAsset = null;
  131. void ShowFunEventList()
  132. {
  133. EditorGUILayout.BeginVertical(GUILayout.Width(200));
  134. bExtendTree = EditorGUILayout.Foldout(bExtendTree, "效果列表");
  135. if (bExtendTree)
  136. {
  137. scrollPos = EditorGUILayout.BeginScrollView(scrollPos, false, false, GUILayout.Width(200));
  138. EditorGUI.indentLevel += 1;
  139. for (int idx = 0; idx < m_funEvents.Count; idx++)
  140. {
  141. bool flag = false;
  142. if (idx == curFunIdx)
  143. {
  144. flag = EditorGUILayout.Foldout(true, m_funEvents[idx].id.ToString(), true, curStyle);
  145. }
  146. else
  147. {
  148. flag = EditorGUILayout.Foldout(false, m_funEvents[idx].id.ToString(), true);
  149. if (flag)
  150. {
  151. SetCurOpEvent(idx);
  152. }
  153. }
  154. }
  155. EditorGUI.indentLevel -= 1;
  156. EditorGUILayout.EndScrollView();
  157. }
  158. EditorGUILayout.EndVertical();
  159. }
  160. void ShowOpPnl()
  161. {
  162. EditorGUILayout.Space();
  163. EditorGUILayout.BeginHorizontal();
  164. if(GUILayout.Button("新增"))
  165. {
  166. AddNewFunEvent();
  167. }
  168. if(GUILayout.Button("删除当前"))
  169. {
  170. RemoveCurFunEvent();
  171. }
  172. if(GUILayout.Button("应用"))
  173. {
  174. ApplyCurChange();
  175. }
  176. if(GUILayout.Button("撤销"))
  177. {
  178. CancelCurChange();
  179. }
  180. if(GUILayout.Button("保存到文件"))
  181. {
  182. SaveData();
  183. }
  184. if(GUILayout.Button("使用"))
  185. {
  186. UseCurFun();
  187. }
  188. EditorGUILayout.EndHorizontal();
  189. for(int idx =0; idx < 4;idx++)
  190. EditorGUILayout.Space();
  191. }
  192. void ShowFunEventData()
  193. {
  194. EditorGUILayout.BeginVertical();
  195. if (curFunEventAsset == null) return;
  196. curFunEventAsset.id = EditorGUILayout.IntField("id:", curFunEventAsset.id,GUILayout.Width(300));
  197. curFunEventAsset.name = EditorGUILayout.TextField("名字:", curFunEventAsset.name, GUILayout.Width(300));
  198. curFunEventAsset.buffType = (BattleBuffType)EditorGUILayout.EnumPopup("buff类型:",curFunEventAsset.buffType,GUILayout.Width(300));
  199. curFunEventAsset.functionType = (Buff_Function_Type)EditorGUILayout.EnumPopup("状态类型:",curFunEventAsset.functionType, GUILayout.Width(300));
  200. curFunEventAsset.canHurtStop = EditorGUILayout.ToggleLeft("是否可以伤害打断", curFunEventAsset.canHurtStop, GUILayout.Width(300));
  201. curFunEventAsset.forbidMove = EditorGUILayout.ToggleLeft("是否禁止移动", curFunEventAsset.forbidMove, GUILayout.Width(300));
  202. curFunEventAsset.forbidNormalAttack = EditorGUILayout.ToggleLeft("是否禁止普攻", curFunEventAsset.forbidNormalAttack, GUILayout.Width(300));
  203. curFunEventAsset.forbidSkill = EditorGUILayout.ToggleLeft("是否禁止技能", curFunEventAsset.forbidSkill, GUILayout.Width(300));
  204. curFunEventAsset.canIgnoreDodge = EditorGUILayout.ToggleLeft("是否忽略闪避", curFunEventAsset.canIgnoreDodge, GUILayout.Width(300));
  205. curFunEventAsset.desc = EditorGUILayout.TextField("描述:", curFunEventAsset.desc, GUILayout.Width(300));
  206. EditorGUILayout.Space();
  207. EditorGUILayout.BeginHorizontal();
  208. string lastFileName = curFunEventAsset.icon;
  209. Sprite icon = null;
  210. if(curFunEventAsset.iconIdx>=0)
  211. {
  212. curFunEventAsset.icon = m_funIcons[curFunEventAsset.iconIdx];
  213. if ((!string.IsNullOrEmpty(curFunEventAsset.icon) && lastFileName!=curFunEventAsset.icon) || icon == null)
  214. icon = AssetDatabase.LoadAssetAtPath<Sprite>(Constants.IconDir+"/"+curFunEventAsset.icon+".png");
  215. }
  216. EditorGUILayout.LabelField("图标", GUILayout.Width(200));
  217. curFunEventAsset.iconIdx = EditorGUILayout.Popup(curFunEventAsset.iconIdx, m_funIcons.ToArray(), GUILayout.Width(200));
  218. if (icon != null)
  219. EditorGUILayout.ObjectField(icon,typeof(Sprite),GUILayout.Width(60),GUILayout.Height(60));
  220. EditorGUILayout.EndHorizontal();
  221. EditorGUILayout.Space();
  222. EditorGUILayout.BeginHorizontal();
  223. Sprite wordSp = null;
  224. lastFileName = curFunEventAsset.word;
  225. if (curFunEventAsset.wordIdx >= 0)
  226. {
  227. curFunEventAsset.word = m_textIcons[curFunEventAsset.wordIdx];
  228. if ((!string.IsNullOrEmpty(curFunEventAsset.word) && lastFileName != curFunEventAsset.word) || wordSp == null)
  229. wordSp = AssetDatabase.LoadAssetAtPath<Sprite>(Constants.IconDir + "/" + curFunEventAsset.word + ".png");
  230. }
  231. EditorGUILayout.LabelField("文字", GUILayout.Width(200));
  232. curFunEventAsset.wordIdx = EditorGUILayout.Popup(curFunEventAsset.wordIdx, m_textIcons.ToArray(), GUILayout.Width(200));
  233. if (wordSp != null)
  234. EditorGUILayout.ObjectField(wordSp, typeof(Sprite), GUILayout.Width(60), GUILayout.Height(60));
  235. EditorGUILayout.EndHorizontal();
  236. EditorGUILayout.Space();
  237. EditorGUILayout.BeginHorizontal();
  238. if (curFunEventAsset.effectIdx >= 0)
  239. {
  240. curFunEventAsset.effectId = SkillEditor.m_effects[curFunEventAsset.effectIdx].id;
  241. }
  242. EditorGUILayout.LabelField("特效", GUILayout.Width(200));
  243. curFunEventAsset.effectIdx = EditorGUILayout.Popup(curFunEventAsset.effectIdx, SkillEditor.m_effectIds.ToArray(), GUILayout.Width(200));
  244. EditorGUILayout.EndHorizontal();
  245. EditorGUILayout.EndVertical();
  246. }
  247. public void SetCurOpEvent(int idx)
  248. {
  249. curFunIdx = idx;
  250. if (curFunIdx >= 0 && curFunIdx < m_funEvents.Count)
  251. {
  252. if(curFunEventAsset == null)
  253. {
  254. curFunEventAsset = new FunctionDataAsset();
  255. }
  256. curFunEventAsset.Copy(m_funEvents[idx]);
  257. }
  258. else
  259. {
  260. curFunEventAsset = null;
  261. }
  262. }
  263. public void CancelCurChange()
  264. {
  265. if (curFunIdx < 0 || curFunIdx >= m_funEvents.Count) return;
  266. curFunEventAsset.Copy(m_funEvents[curFunIdx]);
  267. }
  268. public void ApplyCurChange()
  269. {
  270. if (curFunIdx < 0 || curFunIdx >= m_funEvents.Count) return;
  271. m_funEvents[curFunIdx].Copy(curFunEventAsset);
  272. }
  273. public void AddNewFunEvent()
  274. {
  275. curFunEventAsset = new FunctionDataAsset();
  276. m_funEvents.Add(curFunEventAsset);
  277. curFunIdx = m_funEvents.Count - 1;
  278. scrollPos.y = 3500;
  279. }
  280. public void RemoveCurFunEvent()
  281. {
  282. if (curFunIdx < 0 || curFunIdx >= m_funEvents.Count) return;
  283. m_funEvents.RemoveAt(curFunIdx);
  284. if(curFunIdx >= m_funEvents.Count)
  285. {
  286. SetCurOpEvent(m_funEvents.Count - 1);
  287. }
  288. else
  289. {
  290. SetCurOpEvent(curFunIdx);
  291. }
  292. }
  293. public bool SaveData()
  294. {
  295. bool success = true;
  296. try
  297. {
  298. string filePath = EditorPrefs.GetString(s_functionExcelFileName, string.Empty);
  299. FileInfo fileInfo = new FileInfo(filePath);
  300. using (var excelPackage = new ExcelPackage(fileInfo))
  301. {
  302. var sheets = excelPackage.Workbook.Worksheets;
  303. var sheet = sheets[1];
  304. int rowIndex = 4;
  305. for (int idx = 0; idx < m_funEvents.Count; idx++)
  306. {
  307. m_funEvents[idx].SaveAssetToExcel(ref sheet, rowIndex);
  308. rowIndex += 1;
  309. }
  310. excelPackage.SaveAs(fileInfo);
  311. }
  312. }
  313. catch(Exception e)
  314. {
  315. Debug.LogException(e);
  316. EditorUtility.DisplayDialog("错误", string.Concat("有其它程序在使用该文件", s_functionExcelFileName, ", 请关闭"), "确定");
  317. success = false;
  318. }
  319. return success;
  320. }
  321. public void UseCurFun()
  322. {
  323. if (curFunIdx < 0 || curFunIdx > m_funEvents.Count) return;
  324. if (curFunEventAsset == null) return;
  325. if (curFunEventAsset.id == 0) return;
  326. SkillEditor.AddFunEventToBuff(m_buffId,curFunEventAsset);
  327. GetPanel().Close();
  328. }
  329. static int GetIconIdx(string name)
  330. {
  331. if (string.IsNullOrEmpty(name)) return -1;
  332. for(int idx = 0; idx < m_funIcons.Count;idx++)
  333. {
  334. if (string.Compare(m_funIcons[idx], name) == 0)
  335. return idx;
  336. }
  337. return -1;
  338. }
  339. static int GetTextIconIdx(string name)
  340. {
  341. if (string.IsNullOrEmpty(name)) return -1;
  342. for (int idx = 0; idx < m_textIcons.Count; idx++)
  343. {
  344. if (string.Compare(m_textIcons[idx], name) == 0)
  345. return idx;
  346. }
  347. return -1;
  348. }
  349. }