AnimationDataEditor.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using ChivaXR;
  5. using Sirenix.OdinInspector;
  6. using System.Linq;
  7. using System.Text.RegularExpressions;
  8. using UnityEngine.Events;
  9. using ChivaXR.Op;
  10. using System;
  11. using QFramework;
  12. #if UNITY_EDITOR
  13. using UnityEditor;
  14. using System.Text;
  15. using UniRx;
  16. using Valve.VR.InteractionSystem;
  17. using UniRx.Triggers;
  18. [Serializable]
  19. public class AniDataEditorContainer
  20. {
  21. [Sirenix.OdinInspector.ReadOnly]
  22. [HorizontalGroup("动画名称", Order = 1)]
  23. [HideLabel]
  24. public string AniName;
  25. #if UNITY_EDITOR
  26. [HorizontalGroup("快捷指令", Order = 2)]
  27. [Button("更新模型")]
  28. [GUIColor("RelatColor")]
  29. [PropertyOrder(2)]
  30. /// <summary>
  31. /// 更新当前Scene选择物体到出发对象
  32. /// </summary>
  33. public void ReplaceSelectionObjToRelat()
  34. {
  35. if (Selection.activeGameObject != null)
  36. {
  37. relatGameObjects.Clear();
  38. relatGameObjects.AddRange(Selection.gameObjects);
  39. }
  40. }
  41. #endif
  42. [HorizontalGroup("触发物体列表")]
  43. [GUIColor("RelatColor")]
  44. [PropertyOrder(3)]
  45. [ListDrawerSettings()]
  46. [LabelText("$relatInfo")]
  47. public List<GameObject> relatGameObjects = new List<GameObject>();
  48. public string relatInfo
  49. {
  50. get
  51. {
  52. if (relatGameObjects.Count == 1)
  53. {
  54. return "已指定模型:" + relatGameObjects[0].name;
  55. }
  56. else if (relatGameObjects.Count > 1)
  57. {
  58. return "已指定模型:" + relatGameObjects[0].name + "/" + relatGameObjects[1].name + "等多个物体";
  59. }
  60. else
  61. {
  62. return "未指定物体";
  63. }
  64. }
  65. }
  66. #if UNITY_EDITOR
  67. /// <summary>
  68. /// 更新当前Scene选择物体到出发对象
  69. /// </summary>
  70. public void SelectRelatObj()
  71. {
  72. Selection.objects = relatGameObjects.ToArray();
  73. SceneView.lastActiveSceneView.FrameSelected();
  74. }
  75. #endif
  76. private Color RelatColor()
  77. {
  78. if (relatGameObjects.Count != 0)
  79. {
  80. return new Color(0.7f, 1f, 0.7f);
  81. }
  82. return GUI.color;
  83. }
  84. [HideInInspector]
  85. /// <summary>
  86. /// 观察视角坐标
  87. /// </summary>
  88. public Vector3 ViewPoint;
  89. [HideInInspector]
  90. /// <summary>
  91. /// 观察视角角度
  92. /// </summary>
  93. public Vector3 ViewEuler;
  94. [HideInTables]
  95. public AniDataContainer AniDataContainer;
  96. public AniDataEditorContainer(AniDataContainer data)
  97. {
  98. AniName = data.AniDataName;
  99. AniDataContainer = data;
  100. }
  101. [TableColumnWidth(60)]
  102. [HorizontalGroup("动画状态", Order = 4)]
  103. [Button("初始状态")]
  104. [GUIColor("InitStateColor")]
  105. public void SetInitState()
  106. {
  107. if (AniDataContainer.aniData)
  108. {
  109. AniDataContainer.aniData.SetInitState();
  110. }
  111. }
  112. [ShowInInspector]
  113. [HideLabel]
  114. [HorizontalGroup("动画状态")]
  115. public AniData GetAniData
  116. {
  117. get { return AniDataContainer.aniData; }
  118. }
  119. [TableColumnWidth(60)]
  120. [HorizontalGroup("动画状态")]
  121. [Button("结束状态")]
  122. [GUIColor("FinishedStateColor")]
  123. public void SetFinishedState()
  124. {
  125. if (AniDataContainer.aniData)
  126. {
  127. AniDataContainer.aniData.SetFinishedState();
  128. }
  129. }
  130. private Color FinishedStateColor()
  131. {
  132. switch (AniDataContainer.aniData.currentAniState)
  133. {
  134. case Animation_State.finishedState:
  135. return new Color(0.7f, 1f, 0.7f);
  136. }
  137. return GUI.color;
  138. }
  139. private Color InitStateColor()
  140. {
  141. if (AniDataContainer.aniData != null)
  142. {
  143. switch (AniDataContainer.aniData.currentAniState)
  144. {
  145. case Animation_State.initState:
  146. return new Color(0.7f, 1f, 0.7f);
  147. }
  148. }
  149. return GUI.color;
  150. }
  151. }
  152. [ExecuteInEditMode]
  153. public class AnimationDataEditor : SerializedMonoSingleton<AnimationDataEditor>
  154. {
  155. #region 动画流程创建
  156. [TabGroup("TapGroup", "动画流程创建")]
  157. [LabelText("动画流程列表")]
  158. [TableList(MaxScrollViewHeight = 300, ShowPaging = true, NumberOfItemsPerPage = 10, AlwaysExpanded = true/*, IsReadOnly = true*/)]
  159. public List<AniDataEditorContainer> animationEditorDatas = new List<AniDataEditorContainer>();
  160. [HideInInspector]
  161. public string operationDataName;
  162. [ValidateInput("NewAniDataNameStandard", "$AddAniDataNameErrorInfo")]
  163. [FoldoutGroup("TapGroup/动画流程创建/创建动画", Order = -1)]
  164. [LabelText("新建动画名称(支持多行名称创建)")]
  165. [MultiLineProperty(10)]
  166. public string m_AddAnimationDataNames;
  167. public bool NewAniDataNameStandard
  168. {
  169. get
  170. {
  171. if (m_AddAnimationDataNames.IsNullOrEmpty()) return false;
  172. if (AnimationManager.Instance.aniDatasDic.ContainsKey(m_AddAnimationDataNames)) return false;
  173. if (m_AddAnimationDataNames.Split('\n').Length >= 2)
  174. {
  175. string[] AniDataNames = m_AddAnimationDataNames.Split('\n');
  176. foreach (var item in AniDataNames)
  177. {
  178. if (AnimationManager.Instance.aniDatasDic.ContainsKey(item))
  179. {
  180. return false;
  181. }
  182. //if (AniDataNames.Where(s => s == item).Count() >= 2)
  183. //{
  184. // return false;
  185. //}
  186. }
  187. }
  188. return true;
  189. }
  190. }
  191. public string AddAniDataNameErrorInfo
  192. {
  193. get
  194. {
  195. if (m_AddAnimationDataNames.IsNullOrEmpty()) return "注册动画名称不能为空";
  196. if (AnimationManager.Instance.aniDatasDic.ContainsKey(m_AddAnimationDataNames)) return m_AddAnimationDataNames + "已注册";
  197. if (m_AddAnimationDataNames.Split('\n').Length >= 2)
  198. {
  199. foreach (var item in m_AddAnimationDataNames.Split('\n'))
  200. {
  201. string[] AniDataNames = m_AddAnimationDataNames.Split('\n');
  202. if (AnimationManager.Instance.aniDatasDic.ContainsKey(item))
  203. {
  204. return item + "已注册";
  205. }
  206. //if (AniDataNames.Where(s => s == item).Count() >= 2)
  207. //{
  208. // return "当前添加动画名称内" + item + "重复";
  209. //}
  210. }
  211. }
  212. return "";
  213. }
  214. }
  215. [PropertySpace(10, 10)]
  216. [FoldoutGroup("TapGroup/动画流程创建/创建动画/辅助工具", Order = 1)]
  217. [FoldoutGroup("TapGroup/动画流程创建/创建动画/辅助工具/RefrushAniIndex", GroupName = "按照当前列表刷新新增动画名称序号", Order = 1)]
  218. [Button("刷新待创建动画名称序号")]
  219. public void RefrushAniDataIndex()
  220. {
  221. string[] AniDataNames = m_AddAnimationDataNames.Split('\n');
  222. StringBuilder stringBuilder = new StringBuilder();
  223. int startIndex = animationEditorDatas.Count;
  224. for (int i = 0; i < AniDataNames.Length; i++)
  225. {
  226. stringBuilder.Append((startIndex + i + 1).ToString("000") + "_" + AniDataNames[i]);
  227. if (i < AniDataNames.Length - 1)
  228. {
  229. stringBuilder.AppendLine();
  230. }
  231. }
  232. m_AddAnimationDataNames = stringBuilder.ToString();
  233. }
  234. [FoldoutGroup("TapGroup/动画流程创建/创建动画/辅助工具/ImportAni", GroupName = "导入动画(基于AnimationManager)", Order = 2)]
  235. [LabelText("动画导入(基于AnimationManager已注册AniData)")]
  236. [ShowInInspector]
  237. [ValueDropdown("GetAllOperationDataNames", IsUniqueList = true)]
  238. public string OperationDataName
  239. {
  240. get { return operationDataName; }
  241. set
  242. {
  243. if (operationDataName != value)
  244. {
  245. operationDataName = value;
  246. }
  247. }
  248. }
  249. private static IEnumerable GetAllOperationDataNames()
  250. {
  251. return AnimationManager.Instance.animationDatas.Select(s => new ValueDropdownItem(s.AniDataName, s.AniDataName));
  252. }
  253. [FoldoutGroup("TapGroup/动画流程创建/创建动画/辅助工具/ImportAni", Order = 1)]
  254. [Button("导入")]
  255. public void AddSelectOperationData()
  256. {
  257. if (operationDataName == "") { return; }
  258. AniDataContainer tmpAniDataContainer =
  259. AnimationManager.Instance.animationDatas.Where(s => s.AniDataName == operationDataName).First();
  260. if (tmpAniDataContainer != null)
  261. {
  262. animationEditorDatas.Add(new AniDataEditorContainer(tmpAniDataContainer));
  263. }
  264. }
  265. [HideInInspector]
  266. public string aniDataSelectReName;
  267. [FoldoutGroup("TapGroup/动画流程创建/创建动画/辅助工具/ReName", GroupName = "动画重命名", Order = 3)]
  268. [LabelText("选择动画")]
  269. [ShowInInspector]
  270. [ValueDropdown("GetAniDataEditorAniDataNames", IsUniqueList = true)]
  271. public string AniDataSelectReName
  272. {
  273. get { return aniDataSelectReName; }
  274. set
  275. {
  276. if (aniDataSelectReName != value)
  277. {
  278. aniDataSelectReName = value;
  279. }
  280. }
  281. }
  282. private static IEnumerable GetAniDataEditorAniDataNames()
  283. {
  284. return AnimationDataEditor.Instance.animationEditorDatas.Select(s => new ValueDropdownItem(s.AniName, s.AniName));
  285. }
  286. [FoldoutGroup("TapGroup/动画流程创建/创建动画/辅助工具/ReName", GroupName = "动画重命名", Order = 5)]
  287. [LabelText("重命名称")]
  288. public string m_AniDataReName;
  289. [FoldoutGroup("TapGroup/动画流程创建/创建动画/辅助工具/ReName", GroupName = "动画重命名", Order = 4)]
  290. [Button("重命名")]
  291. [GUIColor("ReNameBtnColor")]
  292. [EnableIf("ReNameAniDataStandard")]
  293. public void AniDataReName()
  294. {
  295. AniDataEditorContainer reNameAniDataEditorContainer = animationEditorDatas.Where(s => s.AniName == aniDataSelectReName).First();
  296. AnimationManager.Instance.AniDataReName(reNameAniDataEditorContainer.AniDataContainer, m_AniDataReName);
  297. reNameAniDataEditorContainer.AniDataContainer.aniData.gameObject.name = m_AniDataReName;
  298. reNameAniDataEditorContainer.AniName = m_AniDataReName;
  299. }
  300. public bool ReNameAniDataStandard
  301. {
  302. get
  303. {
  304. if (m_AniDataReName.IsNullOrEmpty()) return false;
  305. if (AnimationManager.Instance.aniDatasDic.ContainsKey(m_AniDataReName)) return false;
  306. return true;
  307. }
  308. }
  309. /// <summary>
  310. /// 重命名按钮准许颜色
  311. /// </summary>
  312. /// <returns></returns>
  313. private Color ReNameBtnColor()
  314. {
  315. if (ReNameAniDataStandard)
  316. {
  317. return new Color(0.7f, 1f, 0.7f);
  318. }
  319. return GUI.color;
  320. }
  321. [FoldoutGroup("TapGroup/动画流程创建/模型快捷操作", GroupName = "模型快捷操作", Order = -2)]
  322. [HorizontalGroup("TapGroup/动画流程创建/模型快捷操作/模型处理")]
  323. [Button("所选物体合并")]
  324. public void SelectObjsCombine()
  325. {
  326. GameObject combineObjsParent = new GameObject();
  327. combineObjsParent.transform.parent = Selection.activeGameObject.transform.parent;
  328. combineObjsParent.transform.position = Selection.activeGameObject.transform.position;
  329. for (int i = 0; i < Selection.gameObjects.Length; i++)
  330. {
  331. Selection.gameObjects[i].transform.parent = combineObjsParent.transform;
  332. }
  333. combineObjsParent.transform.SetAsFirstSibling();
  334. Selection.activeGameObject = combineObjsParent;
  335. }
  336. [FoldoutGroup("TapGroup/动画流程创建/模型快捷操作", GroupName = "模型快捷操作", Order = -2)]
  337. [HorizontalGroup("TapGroup/动画流程创建/模型快捷操作/模型处理")]
  338. [Button("重置所选物体父级坐标与所选物体一致")]
  339. public void ReSetParentPos()
  340. {
  341. Transform reSetParent = Selection.activeGameObject.transform.parent;
  342. List<Transform> childObjs = new List<Transform>();
  343. for (int i = 0; i < reSetParent.childCount; i++)
  344. {
  345. childObjs.Add(reSetParent.GetChild(i).transform);
  346. }
  347. for (int i = 0; i < childObjs.Count; i++)
  348. {
  349. childObjs[i].transform.parent = null;
  350. }
  351. reSetParent.transform.position = Selection.activeGameObject.transform.position;
  352. for (int i = 0; i < childObjs.Count; i++)
  353. {
  354. childObjs[i].transform.parent = reSetParent;
  355. }
  356. childObjs.Clear();
  357. }
  358. [FoldoutGroup("TapGroup/动画流程创建/创建动画")]
  359. [Button("创建动画")]
  360. [EnableIf("NewAniDataNameStandard")]
  361. public void CreateNewAniData()
  362. {
  363. string[] AniDataNames = m_AddAnimationDataNames.Split('\n');
  364. AniDataNames = CheckAniDataNames(AniDataNames);
  365. for (int i = 0; i < AniDataNames.Length; i++)
  366. {
  367. if (String.IsNullOrEmpty(AniDataNames[i])) break;
  368. AniData newAniData = new GameObject(AniDataNames[i]).AddComponent<AniData>();
  369. newAniData.aniName = AniDataNames[i];
  370. newAniData.aniDescriptioin = AniDataNames[i];
  371. newAniData.RegisterData();
  372. newAniData.transform.parent = AnimationManager.Instance.transform;
  373. newAniData.transform.SetAsLastSibling();
  374. AniDataContainer tmpAniDataContainer =
  375. AnimationManager.Instance.animationDatas.Where(s => s.AniDataName == AniDataNames[i]).First();
  376. if (tmpAniDataContainer != null)
  377. {
  378. animationEditorDatas.Add(new AniDataEditorContainer(tmpAniDataContainer));
  379. }
  380. }
  381. m_AddAnimationDataNames = "";
  382. }
  383. /// <summary>
  384. /// 检查内部重复名称
  385. /// </summary>
  386. /// <param name="AniDataNames"></param>
  387. private string[] CheckAniDataNames(string[] AniDataNames)
  388. {
  389. foreach (var item in AniDataNames)
  390. {
  391. List<string> tmpNames = AniDataNames.ToList().FindAll(name => name == item);
  392. if (tmpNames.Count >= 2)
  393. {
  394. for (int i = 0; i < tmpNames.Count; i++)
  395. {
  396. AniDataNames[AniDataNames.ToList().IndexOf(tmpNames[i])] = tmpNames[i] + (i + 1);
  397. }
  398. }
  399. }
  400. return AniDataNames;
  401. }
  402. #endregion
  403. #region 动画编辑
  404. [BoxGroup("流程控制", CenterLabel = true, Order = -1)]
  405. [HorizontalGroup("流程控制/JumpAni", Order = -1)]
  406. [LabelText("跳步名称(编辑器跳步使用)")]
  407. [ValueDropdown("GetProcessAniDataNames")]
  408. public string jumpTargetAnimation;
  409. private IEnumerable GetProcessAniDataNames()
  410. {
  411. return animationEditorDatas.Select(s => new ValueDropdownItem(s.AniName, s.AniName));
  412. }
  413. [HorizontalGroup("流程控制/JumpAni", Order = -1)]
  414. [Button("跳转到对应动画")]
  415. public void JumpToTargetAnimation()
  416. {
  417. JumpProcess(jumpTargetAnimation);
  418. }
  419. [Title("流程控制/JumpState/当前动画", TitleAlignment = TitleAlignments.Centered, Title = "$m_title")]
  420. [BoxGroup("流程控制")]
  421. [Button("初始化动画组")]
  422. /// <summary>
  423. ///初始化步骤状态
  424. /// </summary>
  425. public void InitStepState()
  426. {
  427. for (int i = currentStepID; i <= animationEditorDatas.Count - 1; i++)
  428. {
  429. SetAniDataState(animationEditorDatas[i].AniName, Animation_State.finishedState);
  430. }
  431. for (int i = animationEditorDatas.Count - 1; i >= 0; i--)
  432. {
  433. SetAniDataState(animationEditorDatas[i].AniName, Animation_State.initState);
  434. }
  435. Debug.Log("初始化跳转至第一步");
  436. currentStepID = 1;
  437. RefreshAniData();
  438. }
  439. [HorizontalGroup("流程控制/JumpState")]
  440. [Button("上一步")]
  441. [PropertySpace(0, 10)]
  442. public void PreProcess()
  443. {
  444. JumpProcess(currentStepID - 1);
  445. }
  446. [HorizontalGroup("流程控制/JumpState")]
  447. [Button("下一步")]
  448. [PropertySpace(0, 10)]
  449. public void EnterNextProcess()
  450. {
  451. JumpProcess(currentStepID + 1);
  452. }
  453. public string m_title
  454. {
  455. get
  456. {
  457. if (animationEditorDatas.Count == 0)
  458. {
  459. return "暂无动画";
  460. }
  461. return "第" + currentStepID + "步:" + aniName;
  462. }
  463. }
  464. [HideInInspector]
  465. public AniData m_CurrentAniData;
  466. [HideInInspector]
  467. public string aniName;
  468. [HideInInspector]
  469. /// <summary>
  470. /// 当前步骤(从1开始)
  471. /// </summary>
  472. public int currentStepID = 1;
  473. [InfoBox("$AnimationDriversDescription", InfoMessageType.None)]
  474. [FoldoutGroup("动画快捷添加", Order = 2)]
  475. [HorizontalGroup("动画快捷添加/selectObjs")]
  476. [Button("选中当前步骤指定物体")]
  477. public void SelectCurrentAniEditorDataReleatObjs()
  478. {
  479. animationEditorDatas[CurrentListID].SelectRelatObj();
  480. }
  481. [FoldoutGroup("动画快捷添加", Order = 2)]
  482. [HorizontalGroup("动画快捷添加/activeGroup")]
  483. [Button("所选物体显示")]
  484. [GUIColor("SelectColor")]
  485. public void CreateSelectionObjsActiveAniDriver()
  486. {
  487. if (m_CurrentAniData != null)
  488. {
  489. AniDriver_ActiveObjs tmpAniDriver = new AniDriver_ActiveObjs();
  490. m_CurrentAniData.AnimationDriverDatas.Add(tmpAniDriver);
  491. tmpAniDriver.objs.AddRange(Selection.gameObjects);
  492. tmpAniDriver.activeObjs = true;
  493. }
  494. }
  495. [FoldoutGroup("动画快捷添加")]
  496. [HorizontalGroup("动画快捷添加/activeGroup")]
  497. [Button("所选物体隐藏")]
  498. [GUIColor("SelectColor")]
  499. public void CreateSelectionObjsDisActiveAniDriver()
  500. {
  501. if (m_CurrentAniData != null)
  502. {
  503. AniDriver_ActiveObjs tmpAniDriver = new AniDriver_ActiveObjs();
  504. m_CurrentAniData.AnimationDriverDatas.Add(tmpAniDriver);
  505. tmpAniDriver.objs.AddRange(Selection.gameObjects);
  506. tmpAniDriver.activeObjs = false;
  507. }
  508. }
  509. [FoldoutGroup("动画快捷添加")]
  510. [HorizontalGroup("动画快捷添加/moveGroup")]
  511. [Button("所选物体路径动画")]
  512. [GUIColor("SelectColor")]
  513. public void CreateSelectionObjsMovePathAniDriver()
  514. {
  515. if (m_CurrentAniData != null)
  516. {
  517. AniDriver_MoveByPathItem tmpAniDriver = new AniDriver_MoveByPathItem();
  518. m_CurrentAniData.AnimationDriverDatas.Add(tmpAniDriver);
  519. Transform movePathGroup = m_CurrentAniData.transform.Find("MovePathGroup");
  520. if (movePathGroup == null)
  521. {
  522. movePathGroup = new GameObject("MovePathGroup").transform;
  523. movePathGroup.parent = m_CurrentAniData.transform;
  524. movePathGroup.transform.localPosition = Vector3.zero;
  525. movePathGroup.transform.localRotation = Quaternion.identity;
  526. movePathGroup.transform.localScale = Vector3.one;
  527. }
  528. tmpAniDriver.mMovePathItem = new GameObject(Selection.activeGameObject.name + "_MovePath").AddComponent<MovePathItem>();
  529. tmpAniDriver.mMovePathItem.transform.parent = movePathGroup;
  530. tmpAniDriver.mMovePathItem.transform.localPosition = Vector3.zero;
  531. tmpAniDriver.mMovePathItem.transform.localRotation = Quaternion.identity;
  532. tmpAniDriver.mMovePathItem.moveTarget = Selection.activeGameObject;
  533. tmpAniDriver.animationSequence = AnimationSequence.waitFinished;
  534. tmpAniDriver.mMovePathItem.AddMovePath();
  535. Selection.activeGameObject = tmpAniDriver.mMovePathItem.gameObject;
  536. }
  537. }
  538. [FoldoutGroup("动画快捷添加")]
  539. [HorizontalGroup("动画快捷添加/moveGroup")]
  540. [Button("所选物体简易动画")]
  541. [GUIColor("SelectColor")]
  542. public void CreateSelectionObjsSimpleMoveAniDriver()
  543. {
  544. if (m_CurrentAniData != null)
  545. {
  546. AniDriver_SimpleMoveRot tmpAniDriver = new AniDriver_SimpleMoveRot();
  547. m_CurrentAniData.AnimationDriverDatas.Add(tmpAniDriver);
  548. Transform simpleMoveGroup = m_CurrentAniData.transform.Find("SimpleMoveGroup");
  549. if (simpleMoveGroup == null)
  550. {
  551. simpleMoveGroup = new GameObject("SimpleMoveGroup").transform;
  552. simpleMoveGroup.parent = m_CurrentAniData.transform;
  553. simpleMoveGroup.transform.localPosition = Vector3.zero;
  554. simpleMoveGroup.transform.localRotation = Quaternion.identity;
  555. simpleMoveGroup.transform.localScale = Vector3.one;
  556. }
  557. tmpAniDriver.mSimpleMoveItem = new GameObject(Selection.activeGameObject.name + "_SimpleMove").AddComponent<SimpleMoveItem>();
  558. tmpAniDriver.mSimpleMoveItem.transform.parent = simpleMoveGroup;
  559. tmpAniDriver.mSimpleMoveItem.transform.localPosition = Vector3.zero;
  560. tmpAniDriver.mSimpleMoveItem.transform.localRotation = Quaternion.identity;
  561. tmpAniDriver.animationSequence = AnimationSequence.waitFinished;
  562. tmpAniDriver.mSimpleMoveItem.AddSelectObj();
  563. Selection.activeGameObject = tmpAniDriver.mSimpleMoveItem.gameObject;
  564. }
  565. }
  566. [FoldoutGroup("动画快捷添加")]
  567. [HorizontalGroup("动画快捷添加/moveGroup")]
  568. [Button("所选物体工具动画")]
  569. [GUIColor("SelectColor")]
  570. public void CreateSelectionObjToolAnimationAniDriver()
  571. {
  572. if (m_CurrentAniData != null)
  573. {
  574. AniDriver_ToolAnimationItem tmpAniDriver = new AniDriver_ToolAnimationItem();
  575. m_CurrentAniData.AnimationDriverDatas.Add(tmpAniDriver);
  576. Transform ToolAnimationGroup = m_CurrentAniData.transform.Find("ToolAnimationGroup");
  577. if (ToolAnimationGroup == null)
  578. {
  579. ToolAnimationGroup = new GameObject("ToolAnimationGroup").transform;
  580. ToolAnimationGroup.parent = m_CurrentAniData.transform;
  581. ToolAnimationGroup.transform.localPosition = Vector3.zero;
  582. ToolAnimationGroup.transform.localRotation = Quaternion.identity;
  583. ToolAnimationGroup.transform.localScale = Vector3.one;
  584. }
  585. tmpAniDriver.mToolAnimationItem = new GameObject(Selection.activeGameObject.name + "_ToolAnimation").AddComponent<ToolAnimationItem>();
  586. tmpAniDriver.mToolAnimationItem.transform.parent = ToolAnimationGroup;
  587. tmpAniDriver.mToolAnimationItem.transform.localPosition = Vector3.zero;
  588. tmpAniDriver.mToolAnimationItem.transform.localRotation = Quaternion.identity;
  589. tmpAniDriver.animationSequence = AnimationSequence.waitFinished;
  590. tmpAniDriver.mToolAnimationItem.AddSelectObj();
  591. Selection.activeGameObject = tmpAniDriver.mToolAnimationItem.gameObject;
  592. }
  593. }
  594. [TabGroup("TapGroup", "当前动画编辑")]
  595. [LabelText("动画配置表")]
  596. [TypeFilter("GetFilteredTypeList")]
  597. [ListDrawerSettings(Expanded = true)]
  598. public List<AnimationDriverBase> AnimationDriverDatas;
  599. public IEnumerable<Type> GetFilteredTypeList()
  600. {
  601. var q = typeof(AnimationDriverBase).Assembly.GetTypes()
  602. .Where(x => !x.IsAbstract)
  603. .Where(x => !x.IsGenericTypeDefinition)
  604. .Where(x => typeof(AnimationDriverBase).IsAssignableFrom(x));
  605. return q;
  606. }
  607. public string AnimationDriversDescription
  608. {
  609. get
  610. {
  611. if (AnimationDriverDatas == null || AnimationDriverDatas.Count == 0) return "暂无动画";
  612. StringBuilder sb = new StringBuilder();
  613. sb.AppendLine(m_title + "当前步骤动画描述:");
  614. for (var i = 0; i < AnimationDriverDatas.Count; i++)
  615. {
  616. sb.AppendLine((i + 1) + "--" + AnimationDriverDatas[i].AnimationDescription());
  617. }
  618. return sb.ToString();
  619. }
  620. }
  621. private Color SelectColor()
  622. {
  623. return new Color(0.7f, 1f, 0.7f);
  624. }
  625. #endregion
  626. #region AnimationStateController
  627. /// <summary>
  628. /// 状态跳转
  629. /// </summary>
  630. /// <param name="aniDataName"></param>
  631. public void SetAniDataState(string aniDataName, Animation_State aniState)
  632. {
  633. if (animationEditorDatas.Where(s => s.AniName == aniDataName).Count() > 0)
  634. {
  635. AniDataEditorContainer tempAniDataEditor = animationEditorDatas.Where(s => s.AniName == aniDataName).First();
  636. switch (aniState)
  637. {
  638. case Animation_State.initState:
  639. tempAniDataEditor.SetInitState();
  640. break;
  641. case Animation_State.finishedState:
  642. tempAniDataEditor.SetFinishedState();
  643. break;
  644. }
  645. }
  646. else
  647. {
  648. Debug.LogError("无该动画片段--->" + aniDataName);
  649. }
  650. }
  651. /// <summary>
  652. /// 当前步骤在List中的索引(从0开始)
  653. /// </summary>
  654. public int CurrentListID
  655. {
  656. get
  657. {
  658. if ((currentStepID - 1) >= 0 && ((currentStepID - 1) < CurrentListsCount))
  659. {
  660. return currentStepID - 1;
  661. }
  662. Debug.LogError("当前步骤超出List范围");
  663. return 0;
  664. }
  665. }
  666. /// <summary>
  667. /// 当前List步骤数量
  668. /// </summary>
  669. public int CurrentListsCount
  670. {
  671. get
  672. {
  673. return animationEditorDatas.Count;
  674. }
  675. }
  676. /// <summary>
  677. /// 刷新当前播放信息
  678. /// </summary>
  679. private void RefreshAniData()
  680. {
  681. m_CurrentAniData = animationEditorDatas[currentStepID - 1].AniDataContainer.aniData;
  682. AnimationDriverDatas = m_CurrentAniData.AnimationDriverDatas;
  683. aniName = m_CurrentAniData.aniName;
  684. }
  685. /// <summary>
  686. /// 跳步
  687. /// </summary>
  688. public void JumpProcess(int targetStepID)
  689. {
  690. //步骤错误
  691. if (targetStepID < 1 || targetStepID > CurrentListsCount)
  692. {
  693. Debug.LogError("流程跳转:无目标步骤");
  694. return;
  695. }
  696. if (targetStepID == currentStepID)
  697. {
  698. SetAniDataState(animationEditorDatas[CurrentListID].AniName, Animation_State.initState);
  699. }
  700. //向前跳步
  701. else if (targetStepID < currentStepID)
  702. {
  703. for (int i = currentStepID - 1; i >= targetStepID - 1; i--)
  704. {
  705. SetAniDataState(animationEditorDatas[i].AniName, Animation_State.initState);
  706. }
  707. }
  708. //向后跳步
  709. else
  710. {
  711. for (int i = currentStepID - 1; i <= targetStepID - 1; i++)
  712. {
  713. if (i.Equals(targetStepID - 1))
  714. {
  715. SetAniDataState(animationEditorDatas[i].AniName, Animation_State.initState);
  716. }
  717. else
  718. {
  719. SetAniDataState(animationEditorDatas[i].AniName, Animation_State.finishedState);
  720. }
  721. }
  722. }
  723. currentStepID = targetStepID;
  724. RefreshAniData();
  725. }
  726. /// <summary>
  727. /// 跳步
  728. /// </summary>
  729. /// <param name="targetStepID">目标步骤ID</param>
  730. /// <param name="editorMode">是否在编辑器状态下</param>
  731. /// <param name="enter">是否执行当前步骤</param>
  732. public void JumpProcess(string aniName)
  733. {
  734. int targetStepID = 0;
  735. if (animationEditorDatas.Where(s => s.AniName == aniName).Count() > 0)
  736. {
  737. AniDataEditorContainer tempAniData = animationEditorDatas.Where(s => s.AniName == aniName).First();
  738. targetStepID = animationEditorDatas.IndexOf(tempAniData) + 1;
  739. }
  740. else
  741. {
  742. return;
  743. }
  744. //步骤错误
  745. if (targetStepID < 1 || targetStepID > CurrentListsCount)
  746. {
  747. Debug.LogError("流程跳转:无目标步骤");
  748. return;
  749. }
  750. if (targetStepID == currentStepID)
  751. {
  752. SetAniDataState(animationEditorDatas[CurrentListID].AniName, Animation_State.initState);
  753. }
  754. //向前跳步
  755. else if (targetStepID < currentStepID)
  756. {
  757. for (int i = currentStepID - 1; i >= targetStepID - 1; i--)
  758. {
  759. SetAniDataState(animationEditorDatas[i].AniName, Animation_State.initState);
  760. }
  761. }
  762. //向后跳步
  763. else
  764. {
  765. for (int i = currentStepID - 1; i <= targetStepID - 1; i++)
  766. {
  767. if (i.Equals(targetStepID - 1))
  768. {
  769. SetAniDataState(animationEditorDatas[i].AniName, Animation_State.initState);
  770. }
  771. else
  772. {
  773. SetAniDataState(animationEditorDatas[i].AniName, Animation_State.finishedState);
  774. }
  775. }
  776. }
  777. currentStepID = targetStepID;
  778. RefreshAniData();
  779. }
  780. /// <summary>
  781. /// Editor模式下当前选中物体列表
  782. /// </summary>
  783. [Title("辅助参数")]
  784. [ListDrawerSettings(IsReadOnly = true, Expanded = true)]
  785. [LabelText("Scene场景当前选中物体列表")]
  786. [PropertyOrder(3)]
  787. public List<GameObject> selection = new List<GameObject>();
  788. private void OnEnable()
  789. {
  790. Selection.selectionChanged += EditorSelectionChanged;
  791. }
  792. private void OnDisable()
  793. {
  794. Selection.selectionChanged -= EditorSelectionChanged;
  795. }
  796. void EditorSelectionChanged()
  797. {
  798. selection.Clear();
  799. selection.AddRange(Selection.gameObjects);
  800. }
  801. #endregion
  802. }
  803. #endif