ProcessEditor.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Runtime.Serialization;
  6. using System.Runtime.Serialization.Formatters.Binary;
  7. using UnityEditor;
  8. using UnityEngine;
  9. using WS;
  10. ///<summary>流程编辑器</summary>
  11. public class ProcessEditor : EditorWindow
  12. {
  13. ///<summary>数据</summary>
  14. private List<Module> Config = new List<Module>();
  15. ///<summary>编辑器</summary>
  16. private List<ModuleEditorData> EditorData = new List<ModuleEditorData>();
  17. ///<summary>组件类型</summary>
  18. private List<Type> ComponentTypes = new List<Type>();
  19. ///<summary>编辑器类型</summary>
  20. private Dictionary<string, EditorTypeData> EditorTypes =
  21. new Dictionary<string, EditorTypeData>();
  22. ///<summary>编辑器类型名称</summary>
  23. private string[] Components;
  24. ///<summary>路径</summary>
  25. private string path;
  26. ///<summary>滑杆</summary>
  27. private Vector2 pos;
  28. ///<summary>模块</summary>
  29. private string[] Modules
  30. {
  31. get { return EditorData.Select(m => m.Name).ToArray(); }
  32. }
  33. ///<summary>模块索引</summary>
  34. private int ModuleIndex;
  35. ///<summary>所有任务</summary>
  36. private string[] OwnTasks
  37. {
  38. get
  39. {
  40. List<string> tasks = new List<string>();
  41. for (int i = 0; i < EditorData.Count; i++)
  42. {
  43. tasks.AddRange(EditorData[i].VTasks.Select(t => $"{t.Id} {t.Name}"));
  44. }
  45. return tasks.ToArray();
  46. }
  47. }
  48. private void OnGUI()
  49. {
  50. pos = EditorGUILayout.BeginScrollView(pos);
  51. DrawModule();
  52. EditorGUILayout.EndScrollView();
  53. DrawSetting();
  54. }
  55. private void OnDestroy()
  56. {
  57. for (int i = 0; i < EditorData.Count; i++)
  58. {
  59. for (int j = 0; j < EditorData[i].VTasks.Count; j++)
  60. {
  61. for (int k = 0; k < EditorData[i].VTasks[j].Operates.Count; k++)
  62. {
  63. EditorData[i].VTasks[j].Operates[k].Editor.Dispose();
  64. }
  65. EditorData[i].VTasks[j].Operates.Clear();
  66. }
  67. EditorData[i].VTasks.Clear();
  68. }
  69. EditorData.Clear();
  70. }
  71. ///<summary>绘制模块</summary>
  72. private void DrawModule()
  73. {
  74. for (int i = 0; i < EditorData.Count; i++)
  75. {
  76. EditorGUILayout.BeginHorizontal();
  77. EditorData[i].Foldout = EditorGUILayout.Foldout(
  78. EditorData[i].Foldout,
  79. EditorData[i].Name
  80. );
  81. GUILayout.Label("");
  82. if (EditorData[i].VTasks.Count > 0)
  83. {
  84. GUILayout.Label(GetVTaskIndex(EditorData[i].VTasks), GUILayout.Width(100));
  85. }
  86. GUILayout.Label("任务无顺序:", GUILayout.Width(70));
  87. EditorData[i].NoOrder = EditorGUILayout.Toggle(
  88. EditorData[i].NoOrder,
  89. GUILayout.Width(20)
  90. );
  91. GUILayout.Label("忽略任务栏:", GUILayout.Width(70));
  92. EditorGUI.BeginChangeCheck();
  93. EditorData[i].NoTaskbar = EditorGUILayout.Toggle(
  94. EditorData[i].NoTaskbar,
  95. GUILayout.Width(20)
  96. );
  97. if (EditorGUI.EndChangeCheck())
  98. {
  99. for (int x = 0; x < EditorData[i].VTasks.Count; x++)
  100. {
  101. EditorData[i].VTasks[x].NoTaskbar = EditorData[i].NoTaskbar;
  102. }
  103. }
  104. if (GUILayout.Button("展开", GUILayout.Width(35)))
  105. {
  106. EditorData[i].SetFoldout(true);
  107. }
  108. if (GUILayout.Button("收起", GUILayout.Width(35)))
  109. {
  110. EditorData[i].SetFoldout(false);
  111. }
  112. if (GUILayout.Button("删除", GUILayout.Width(35)))
  113. {
  114. RemoveModule(EditorData[i]);
  115. EditorData.RemoveAt(i);
  116. SortId();
  117. }
  118. if (GUILayout.Button("插入", GUILayout.Width(35)))
  119. {
  120. EditorData.Insert(i + 1, new ModuleEditorData());
  121. SortId();
  122. }
  123. if (GUILayout.Button("上移", GUILayout.Width(35)))
  124. {
  125. if (i > 0)
  126. {
  127. ModuleEditorData data = EditorData[i];
  128. EditorData.RemoveAt(i);
  129. EditorData.Insert(i - 1, data);
  130. SortId();
  131. }
  132. }
  133. if (GUILayout.Button("下移", GUILayout.Width(35)))
  134. {
  135. if (i < EditorData.Count - 1)
  136. {
  137. ModuleEditorData data = EditorData[i];
  138. EditorData.RemoveAt(i);
  139. EditorData.Insert(i + 1, data);
  140. SortId();
  141. }
  142. }
  143. EditorGUILayout.EndHorizontal();
  144. if (EditorData[i].Foldout)
  145. {
  146. EditorGUILayout.BeginHorizontal();
  147. GUILayout.Label("", GUILayout.Width(5));
  148. GUILayout.Label("模块名称:", GUILayout.Width(55));
  149. EditorData[i].Name = EditorGUILayout.TextField(EditorData[i].Name);
  150. EditorGUILayout.EndHorizontal();
  151. DrawTask(EditorData[i]);
  152. }
  153. }
  154. }
  155. ///<summary>绘制设置</summary>
  156. private void DrawSetting()
  157. {
  158. float score = 0;
  159. for (int i = 0; i < EditorData.Count; i++)
  160. {
  161. for (int j = 0; j < EditorData[i].VTasks.Count; j++)
  162. {
  163. score += EditorData[i].VTasks[j].Score;
  164. }
  165. }
  166. EditorGUILayout.BeginHorizontal();
  167. GUILayout.Label("");
  168. GUILayout.Label($"总分:{score}", GUILayout.Width(80));
  169. if (Modules.Length > 0)
  170. {
  171. ModuleIndex = EditorGUILayout.Popup(ModuleIndex, Modules, GUILayout.Width(100));
  172. if (GUILayout.Button("拷贝模块", GUILayout.Width(70)))
  173. {
  174. Module module = ToModule(EditorData[ModuleIndex]);
  175. ModuleEditorData editordata = LoadModule(module);
  176. EditorData.Add(editordata);
  177. SortId();
  178. }
  179. }
  180. if (GUILayout.Button("添加模块", GUILayout.Width(70)))
  181. {
  182. EditorData.Add(new ModuleEditorData());
  183. SortId();
  184. }
  185. if (GUILayout.Button("保存", GUILayout.Width(70)))
  186. {
  187. Save();
  188. }
  189. EditorGUILayout.EndHorizontal();
  190. }
  191. ///<summary>绘制任务</summary>
  192. private void DrawTask(ModuleEditorData module)
  193. {
  194. for (int i = 0; i < module.VTasks.Count; i++)
  195. {
  196. EditorGUILayout.BeginHorizontal();
  197. GUILayout.Label("", GUILayout.Width(10));
  198. module.VTasks[i].Foldout = EditorGUILayout.Foldout(
  199. module.VTasks[i].Foldout,
  200. $"任务:{module.VTasks[i].Id}"
  201. );
  202. GUILayout.Label("");
  203. GUILayout.Label(module.VTasks[i].Name);
  204. GUILayout.Label("");
  205. GUILayout.Label($"分数:{module.VTasks[i].Score}", GUILayout.Width(55));
  206. GUILayout.Label("关联获取:", GUILayout.Width(60));
  207. module.VTasks[i].Get = EditorGUILayout.Toggle(
  208. module.VTasks[i].Get,
  209. GUILayout.Width(20)
  210. );
  211. if (module.VTasks[i].Get)
  212. module.VTasks[i].GetId = EditorGUILayout.Popup(
  213. module.VTasks[i].GetId,
  214. OwnTasks,
  215. GUILayout.Width(80)
  216. );
  217. if (module.NoOrder)
  218. {
  219. GUILayout.Label("关联执行:", GUILayout.Width(60));
  220. module.VTasks[i].Perform = EditorGUILayout.Toggle(
  221. module.VTasks[i].Perform,
  222. GUILayout.Width(20)
  223. );
  224. if (module.VTasks[i].Perform)
  225. module.VTasks[i].PerformId = EditorGUILayout.Popup(
  226. module.VTasks[i].PerformId,
  227. module.VTasksName,
  228. GUILayout.Width(80)
  229. );
  230. }
  231. GUILayout.Label("忽略任务栏:", GUILayout.Width(70));
  232. module.VTasks[i].NoTaskbar = EditorGUILayout.Toggle(
  233. module.VTasks[i].NoTaskbar,
  234. GUILayout.Width(20)
  235. );
  236. if (GUILayout.Button("展开", GUILayout.Width(35)))
  237. {
  238. module.VTasks[i].SetFoldout(true);
  239. }
  240. if (GUILayout.Button("收起", GUILayout.Width(35)))
  241. {
  242. module.VTasks[i].SetFoldout(false);
  243. }
  244. if (GUILayout.Button("删除", GUILayout.Width(35)))
  245. {
  246. RemoveTask(module.VTasks[i]);
  247. module.VTasks.RemoveAt(i);
  248. SortId();
  249. return;
  250. }
  251. if (GUILayout.Button("插入", GUILayout.Width(35)))
  252. {
  253. VTaskEditorData vTask = new VTaskEditorData();
  254. vTask.ModuleData = module;
  255. module.VTasks.Insert(i + 1, vTask);
  256. SortId();
  257. }
  258. if (GUILayout.Button("上移", GUILayout.Width(35)))
  259. {
  260. if (i > 0)
  261. {
  262. VTaskEditorData data = module.VTasks[i];
  263. module.VTasks.RemoveAt(i);
  264. module.VTasks.Insert(i - 1, data);
  265. SortId();
  266. }
  267. }
  268. if (GUILayout.Button("下移", GUILayout.Width(35)))
  269. {
  270. if (i < EditorData.Count - 1)
  271. {
  272. VTaskEditorData data = module.VTasks[i];
  273. module.VTasks.RemoveAt(i);
  274. module.VTasks.Insert(i + 1, data);
  275. SortId();
  276. }
  277. }
  278. EditorGUILayout.EndHorizontal();
  279. if (module.VTasks[i].Foldout)
  280. {
  281. EditorGUILayout.BeginHorizontal();
  282. GUILayout.Label("", GUILayout.Width(22));
  283. GUILayout.Label("任务名称:", GUILayout.Width(55));
  284. module.VTasks[i].Name = EditorGUILayout.TextField(module.VTasks[i].Name);
  285. if (!module.VTasks[i].NoTaskbar)
  286. {
  287. GUILayout.Label("分数:", GUILayout.Width(30));
  288. module.VTasks[i].Score = EditorGUILayout.FloatField(module.VTasks[i].Score);
  289. }
  290. EditorGUILayout.EndHorizontal();
  291. DrawOperate(module.VTasks[i].Operates);
  292. }
  293. }
  294. EditorGUILayout.BeginHorizontal();
  295. GUILayout.Label("", GUILayout.Width(10));
  296. if (module.VTasks.Count > 0)
  297. {
  298. module.Index = EditorGUILayout.Popup(module.Index, OwnTasks, GUILayout.Width(100));
  299. if (GUILayout.Button("拷贝任务", GUILayout.Width(70)))
  300. {
  301. WSTask task = ToVTask(GetEditorData(module.Index));
  302. VTaskEditorData editordata = LoadVTask(task);
  303. editordata.ModuleData = module;
  304. module.VTasks.Add(editordata);
  305. SortId();
  306. }
  307. }
  308. if (GUILayout.Button("添加任务", GUILayout.Width(70)))
  309. {
  310. VTaskEditorData vTask = new VTaskEditorData();
  311. vTask.ModuleData = module;
  312. module.VTasks.Add(vTask);
  313. SortId();
  314. }
  315. EditorGUILayout.EndHorizontal();
  316. }
  317. ///<summary>绘制操作</summary>
  318. private void DrawOperate(List<OperateEditorData> operates)
  319. {
  320. Color originalBackgroundColor = GUI.backgroundColor;
  321. for (int i = 0; i < operates.Count; i++)
  322. {
  323. EditorGUILayout.BeginHorizontal();
  324. GUILayout.Label("", GUILayout.Width(30));
  325. operates[i].Foldout = EditorGUILayout.Foldout(operates[i].Foldout, $"操作:{i + 1}");
  326. GUILayout.Label("");
  327. GUILayout.Label($"{operates[i].Describe}");
  328. GUILayout.Label("");
  329. GUILayout.Label("组件:", GUILayout.Width(30));
  330. operates[i].Index = EditorGUILayout.Popup(
  331. operates[i].Index,
  332. Components,
  333. GUILayout.Width(200)
  334. );
  335. if (GUILayout.Button("删除", GUILayout.Width(35)))
  336. {
  337. OperateEditorData data = operates[i];
  338. data.Editor.Dispose();
  339. operates.RemoveAt(i);
  340. return;
  341. }
  342. if (GUILayout.Button("插入", GUILayout.Width(35)))
  343. {
  344. operates.Insert(i + 1, CreateOperateEditor());
  345. }
  346. if (GUILayout.Button("上移", GUILayout.Width(35)))
  347. {
  348. if (i > 0)
  349. {
  350. OperateEditorData data = operates[i];
  351. operates.RemoveAt(i);
  352. operates.Insert(i - 1, data);
  353. }
  354. }
  355. if (GUILayout.Button("下移", GUILayout.Width(35)))
  356. {
  357. if (i < EditorData.Count - 1)
  358. {
  359. OperateEditorData data = operates[i];
  360. operates.RemoveAt(i);
  361. operates.Insert(i + 1, data);
  362. }
  363. }
  364. EditorGUILayout.EndHorizontal();
  365. if (operates[i].Foldout)
  366. {
  367. if (operates[i].Editor.Name != Components[operates[i].Index])
  368. {
  369. operates[i].Editor.Dispose();
  370. operates[i].Editor = CreateOperateEditor(operates[i].Index);
  371. }
  372. SetBackGroundColor(operates[i].Index, originalBackgroundColor);
  373. EditorGUILayout.BeginHorizontal();
  374. GUILayout.Label("", GUILayout.Width(42));
  375. EditorGUILayout.BeginVertical();
  376. EditorGUILayout.BeginHorizontal();
  377. GUILayout.Label("描述:", GUILayout.Width(30));
  378. operates[i].Describe = EditorGUILayout.TextField(operates[i].Describe);
  379. EditorGUILayout.EndHorizontal();
  380. operates[i].Editor.OnGUI();
  381. EditorGUILayout.EndVertical();
  382. EditorGUILayout.EndHorizontal();
  383. GUI.backgroundColor = originalBackgroundColor;
  384. }
  385. }
  386. EditorGUILayout.BeginHorizontal();
  387. GUILayout.Label("", GUILayout.Width(42));
  388. if (GUILayout.Button("添加操作"))
  389. {
  390. operates.Add(CreateOperateEditor());
  391. }
  392. EditorGUILayout.EndHorizontal();
  393. }
  394. ///<summary>初始化</summary>
  395. public void Init(string filename)
  396. {
  397. LoadEditorType();
  398. path = $"{Application.dataPath}/Resources/Config/Process/{filename}.txt";
  399. if (ConfigHelper.ConfigExists(path))
  400. {
  401. Config = ConfigHelper.FileLoadConfig<List<Module>>(path);
  402. }
  403. if (Config.Count > 0)
  404. {
  405. for (int i = 0; i < Config.Count; i++)
  406. {
  407. EditorData.Add(LoadModule(Config[i]));
  408. }
  409. }
  410. EditorHelper.NameToScript(
  411. "Assets/Scripts/Framework/Common/Process",
  412. typeof(ProcessManager),
  413. ComponentTypes
  414. );
  415. AssetDatabase.Refresh();
  416. }
  417. private void SetBackGroundColor(int index, Color orginalColor)
  418. {
  419. Color color = orginalColor;
  420. switch (index)
  421. {
  422. case 0:
  423. ColorUtility.TryParseHtmlString("#F08784", out color);
  424. break;
  425. case 1:
  426. ColorUtility.TryParseHtmlString("#FFFE91", out color);
  427. break;
  428. case 2:
  429. ColorUtility.TryParseHtmlString("#A1FB8E", out color);
  430. break;
  431. case 3:
  432. ColorUtility.TryParseHtmlString("#EB3324", out color);
  433. break;
  434. case 4:
  435. ColorUtility.TryParseHtmlString("#F09B59", out color);
  436. break;
  437. case 5:
  438. ColorUtility.TryParseHtmlString("#9FFCFD", out color);
  439. break;
  440. case 6:
  441. ColorUtility.TryParseHtmlString("#3B93FD", out color);
  442. break;
  443. case 7:
  444. ColorUtility.TryParseHtmlString("#7E84F7", out color);
  445. break;
  446. case 8:
  447. ColorUtility.TryParseHtmlString("#EA3680", out color);
  448. break;
  449. case 9:
  450. ColorUtility.TryParseHtmlString("#377E47", out color);
  451. break;
  452. }
  453. GUI.backgroundColor = color;
  454. }
  455. ///<summary>保存</summary>
  456. private void Save()
  457. {
  458. Config.Clear();
  459. for (int i = 0; i < EditorData.Count; i++)
  460. {
  461. Config.Add(ToModule(EditorData[i]));
  462. }
  463. ConfigHelper.SaveConfig(Config, path);
  464. AssetDatabase.Refresh();
  465. }
  466. ///<summary>编辑器模块转换成模块数据</summary>
  467. private Module ToModule(ModuleEditorData module)
  468. {
  469. Module data = new Module();
  470. data.Id = module.Id;
  471. data.Name = module.Name;
  472. data.NoTaskbar = module.NoTaskbar;
  473. data.NoOrder = module.NoOrder;
  474. for (int i = 0; i < module.VTasks.Count; i++)
  475. {
  476. WSTask task = ToVTask(module.VTasks[i]);
  477. data.WSTasks.Add(task);
  478. }
  479. return data;
  480. }
  481. ///<summary>加载模块数据</summary>
  482. private ModuleEditorData LoadModule(Module module)
  483. {
  484. ModuleEditorData data = new ModuleEditorData();
  485. data.Id = module.Id;
  486. data.Name = module.Name;
  487. data.NoOrder = module.NoOrder;
  488. data.NoTaskbar = module.NoTaskbar;
  489. for (int i = 0; i < module.WSTasks.Count; i++)
  490. {
  491. VTaskEditorData task = LoadVTask(module.WSTasks[i]);
  492. task.ModuleData = data;
  493. data.VTasks.Add(task);
  494. }
  495. for (int i = 0; i < data.VTasks.Count; i++)
  496. {
  497. if (data.VTasks[i].Perform)
  498. data.VTasks[i].PerformId = data.SetVTaskIndex(data.VTasks[i].PerformId);
  499. }
  500. return data;
  501. }
  502. ///<summary>编辑器任务转换成任务数据</summary>
  503. private WSTask ToVTask(VTaskEditorData task)
  504. {
  505. WSTask data = new WSTask();
  506. data.Id = task.Id;
  507. data.Name = task.Name;
  508. data.NoTaskbar = task.NoTaskbar;
  509. data.Score = task.Score;
  510. data.Get = task.Get;
  511. data.GetId = task.Get ? task.GetId + 1 : 0;
  512. data.Perform = task.ModuleData.NoOrder ? task.Perform : false;
  513. data.PerformId = task.Perform ? task.ModuleData.GetVTaskId(task.PerformId) : 0;
  514. for (int i = 0; i < task.Operates.Count; i++)
  515. {
  516. Operate operate = new Operate();
  517. operate.Id = i + 1;
  518. operate.Component = EditorTypes[Components[task.Operates[i].Index]].Component;
  519. operate.Describe = task.Operates[i].Describe;
  520. if (task.Operates[i].IsLoad)
  521. operate.Json = task.Operates[i].Editor.ToData();
  522. else
  523. operate.Json = task.Operates[i].Json;
  524. data.Operates.Add(operate);
  525. }
  526. return data;
  527. }
  528. ///<summary>加载任务数据</summary>
  529. private VTaskEditorData LoadVTask(WSTask task)
  530. {
  531. VTaskEditorData data = new VTaskEditorData();
  532. data.Id = task.Id;
  533. data.Name = task.Name;
  534. data.Score = task.Score;
  535. data.Get = task.Get;
  536. data.GetId = task.Get ? task.GetId - 1 : 0;
  537. data.Perform = task.Perform;
  538. data.PerformId = task.PerformId;
  539. for (int i = 0; i < task.Operates.Count; i++)
  540. {
  541. OperateEditorData operate = new OperateEditorData();
  542. operate.Index = IntiOperateIndex(task.Operates[i].Component);
  543. operate.Describe = task.Operates[i].Describe;
  544. operate.Json = task.Operates[i].Json;
  545. operate.Editor = CreateOperateEditor(operate.Index);
  546. data.Operates.Add(operate);
  547. }
  548. return data;
  549. }
  550. ///<summary>初始化组件索引</summary>
  551. private int IntiOperateIndex(string component)
  552. {
  553. string key = "";
  554. int index = -1;
  555. foreach (var item in EditorTypes)
  556. {
  557. if (item.Value.Component == component)
  558. {
  559. key = item.Key;
  560. break;
  561. }
  562. }
  563. for (int i = 0; i < Components.Length; i++)
  564. {
  565. if (Components[i] == key)
  566. {
  567. index = i;
  568. break;
  569. }
  570. }
  571. return index;
  572. }
  573. ///<summary>移除模块</summary>
  574. private void RemoveModule(ModuleEditorData module)
  575. {
  576. for (int i = 0; i < module.VTasks.Count; i++)
  577. {
  578. RemoveTask(module.VTasks[i]);
  579. }
  580. module.VTasks.Clear();
  581. }
  582. ///<summary>移除任务</summary>
  583. private void RemoveTask(VTaskEditorData task)
  584. {
  585. for (int i = 0; i < task.Operates.Count; i++)
  586. {
  587. task.Operates[i].Editor.Dispose();
  588. }
  589. task.Operates.Clear();
  590. }
  591. ///<summary>获取任务索引</summary>
  592. private string GetVTaskIndex(List<VTaskEditorData> tasks)
  593. {
  594. return $"第{tasks[0].Id}{tasks[tasks.Count - 1].Id}步";
  595. }
  596. ///<summary>获取任务实体</summary>
  597. private VTaskEditorData GetEditorData(int index)
  598. {
  599. index = index + 1;
  600. for (int i = 0; i < EditorData.Count; i++)
  601. {
  602. VTaskEditorData vtask = EditorData[i].VTasks.Find(t => t.Id == index);
  603. if (vtask != null)
  604. return vtask;
  605. }
  606. return null;
  607. }
  608. ///<summary>排序Id</summary>
  609. private void SortId()
  610. {
  611. int id = 0;
  612. for (int i = 0; i < EditorData.Count; i++)
  613. {
  614. EditorData[i].Id = i + 1;
  615. for (int j = 0; j < EditorData[i].VTasks.Count; j++)
  616. {
  617. id += 1;
  618. EditorData[i].VTasks[j].Id = id;
  619. }
  620. }
  621. }
  622. ///<summary>初始化编辑器类型</summary>
  623. private void LoadEditorType()
  624. {
  625. List<string> components = new List<string>();
  626. Type type = typeof(IOperateEditor);
  627. Type[] types = type.Assembly.GetTypes();
  628. for (int i = 0; i < types.Length; i++)
  629. {
  630. if (types[i].IsInterface)
  631. {
  632. continue;
  633. }
  634. Type[] interfaces = types[i].GetInterfaces();
  635. if (interfaces.Length == 0)
  636. {
  637. continue;
  638. }
  639. if (interfaces[0] == type)
  640. {
  641. object entity = Activator.CreateInstance(types[i]);
  642. string key = (string)types[i].GetProperty("Name").GetValue(entity);
  643. if (!EditorTypes.ContainsKey(key))
  644. {
  645. Type component = (Type)types[i].GetProperty("Component").GetValue(entity);
  646. ComponentTypes.Add(component);
  647. EditorTypes[key] = new EditorTypeData
  648. {
  649. EditorType = types[i],
  650. Component = component.Name
  651. };
  652. components.Add(key);
  653. }
  654. else
  655. {
  656. ShowNotification(new GUIContent($"类型:{types[i].Name} 的名称:{key} 已存在"), 2);
  657. }
  658. }
  659. }
  660. Components = components.ToArray();
  661. }
  662. ///<summary>新建OperateEditor</summary>
  663. private OperateEditorData CreateOperateEditor()
  664. {
  665. OperateEditorData data = new OperateEditorData();
  666. data.Index = 0;
  667. data.Editor = CreateOperateEditor(0);
  668. data.Foldout = true;
  669. return data;
  670. }
  671. ///<summary>新建IOperateEditor</summary>
  672. private IOperateEditor CreateOperateEditor(int index)
  673. {
  674. Type type = EditorTypes[Components[index]].EditorType;
  675. IOperateEditor processeditor = (IOperateEditor)Activator.CreateInstance(type);
  676. processeditor.Init(null);
  677. return processeditor;
  678. }
  679. ///<summary>克隆对象 不支持Unity对象</summary>
  680. private T CloneObject<T>(T realobject)
  681. {
  682. using (Stream objStream = new MemoryStream())
  683. {
  684. IFormatter formatter = new BinaryFormatter();
  685. formatter.Serialize(objStream, realobject);
  686. objStream.Seek(0, SeekOrigin.Begin);
  687. return (T)formatter.Deserialize(objStream);
  688. }
  689. }
  690. }
  691. ///<summary>模块数据</summary>
  692. [Serializable]
  693. public class ModuleEditorData
  694. {
  695. ///<summary>Id</summary>
  696. public int Id;
  697. ///<summary>名称</summary>
  698. public string Name;
  699. ///<summary>忽略任务栏</summary>
  700. public bool NoTaskbar;
  701. ///<summary>无顺序</summary>
  702. public bool NoOrder;
  703. ///<summary>折叠开关</summary>
  704. public bool Foldout;
  705. ///<summary>任务数据</summary>
  706. public List<VTaskEditorData> VTasks = new List<VTaskEditorData>();
  707. ///<summary>索引</summary>
  708. public int Index;
  709. ///<summary>任务名称</summary>
  710. public string[] VTasksName
  711. {
  712. get { return VTasks.Select(t => $"{t.Id} {t.Name}").ToArray(); }
  713. }
  714. /// <summary>设置收缩框</summary>
  715. /// <param name="foldout">打开关闭</param>
  716. public void SetFoldout(bool foldout)
  717. {
  718. Foldout = foldout;
  719. for (int i = 0; i < VTasks.Count; i++)
  720. {
  721. VTasks[i].SetFoldout(foldout);
  722. }
  723. }
  724. ///<summary>获取选择关联的任务Id</summary>
  725. public int GetVTaskId(int index)
  726. {
  727. return VTasks[index].Id;
  728. }
  729. ///<summary>设置选择关联的任务Id</summary>
  730. public int SetVTaskIndex(int id)
  731. {
  732. return VTasks.FindIndex(t => t.Id == id);
  733. }
  734. }
  735. ///<summary>任务数据</summary>
  736. [Serializable]
  737. public class VTaskEditorData
  738. {
  739. ///<summary>Module</summary>
  740. public ModuleEditorData ModuleData;
  741. ///<summary>Id</summary>
  742. public int Id;
  743. ///<summary>名称</summary>
  744. public string Name;
  745. ///<summary>忽略任务栏</summary>
  746. public bool NoTaskbar;
  747. ///<summary>分数</summary>
  748. public float Score;
  749. ///<summary>获取</summary>
  750. public bool Get;
  751. ///<summary>关联Id</summary>
  752. public int GetId;
  753. ///<summary>执行</summary>
  754. public bool Perform;
  755. ///<summary>关联Id</summary>
  756. public int PerformId;
  757. ///<summary>折叠开关</summary>
  758. public bool Foldout;
  759. ///<summary>操作数据</summary>
  760. public List<OperateEditorData> Operates = new List<OperateEditorData>();
  761. /// <summary>设置收缩框</summary>
  762. /// <param name="foldout">打开关闭</param>
  763. public void SetFoldout(bool foldout)
  764. {
  765. Foldout = foldout;
  766. for (int i = 0; i < Operates.Count; i++)
  767. {
  768. Operates[i].Foldout = foldout;
  769. }
  770. }
  771. }
  772. ///<summary>操作数据</summary>
  773. [Serializable]
  774. public class OperateEditorData
  775. {
  776. ///<summary>组件索引</summary>
  777. public int Index;
  778. ///<summary>编辑器</summary>
  779. public IOperateEditor Editor;
  780. ///<summary>描述/名称</summary>
  781. public string Describe;
  782. ///<summary>数据</summary>
  783. public string Json;
  784. //折叠开关
  785. private bool foldout;
  786. ///<summary>折叠开关</summary>
  787. public bool Foldout
  788. {
  789. get { return foldout; }
  790. set
  791. {
  792. foldout = value;
  793. if (!IsLoad)
  794. Editor.Init(Json);
  795. IsLoad = true;
  796. }
  797. }
  798. //是否加载了数据
  799. public bool IsLoad;
  800. }
  801. ///<summary>编辑器类型数据</summary>
  802. public class EditorTypeData
  803. {
  804. ///<summary>编辑器类型</summary>
  805. public Type EditorType;
  806. ///<summary>组件名称</summary>
  807. public string Component;
  808. }