OperationCreateEditor.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. using ChivaXR;
  2. using ChivaXR.Op;
  3. using ChivaXR.VR;
  4. using JetBrains.Annotations;
  5. using QFramework;
  6. using Sirenix.OdinInspector;
  7. using System.Collections;
  8. using System.Collections.Generic;
  9. using System.Diagnostics;
  10. #if UNITY_EDITOR
  11. using UnityEditor;
  12. using UnityEngine;
  13. [ExecuteInEditMode]
  14. public class OperationCreateEditor : SerializedMonoBehaviour
  15. {
  16. /// <summary>
  17. /// 透明材质
  18. /// </summary>
  19. [LabelText("透明材质球")]
  20. public Material m_TransparentMaterial;
  21. private bool m_ManagementStructure = false;
  22. /// <summary>
  23. /// 生成管理结构
  24. /// </summary>
  25. [Button("生成管理结构")]
  26. [HideIf("m_ManagementStructure")]
  27. public void GenerateManagementStructure()
  28. {
  29. ProcessManagement.Instance.transform.SetParent(this.transform);
  30. ProcessManagement.Instance.awakePlay = true;
  31. if (ProcessManagement.Instance.gameObject.GetComponent<RuningJumpProcess_Example>() == null)
  32. {
  33. ProcessManagement.Instance.gameObject.AddComponent<RuningJumpProcess_Example>();
  34. }
  35. OperationManager.Instance.transform.SetParent(this.transform);
  36. AnimationManager.Instance.transform.SetParent(this.transform);
  37. }
  38. /// <summary>
  39. /// 给关联物体添加碰撞体
  40. /// </summary>
  41. [TabGroup("平台配置", "PC平台")]
  42. [Button("添加PC相关组件")]
  43. [ShowIf("m_ManagementStructure")]
  44. public void AddPCRelatedComponent()
  45. {
  46. //给关联物体添加碰撞体
  47. AddBoxColliderToRelaGameObjects();
  48. //添加触发组件
  49. Dictionary<string, List<RayCastItem>> tmpDicRayCastItem = GenerateRayCastItem();
  50. //生成并注册Operation
  51. GeneraterOperationForPC(tmpDicRayCastItem);
  52. //生成ProcessElement
  53. GeneraProcessData();
  54. }
  55. /// <summary>
  56. /// 转为音频Op
  57. /// </summary>
  58. [TabGroup("平台配置", "PC平台")]
  59. [Button("转为音频Op")]
  60. [ShowIf("m_ManagementStructure")]
  61. public void ChangeToSoundElementPC()
  62. {
  63. ChangeToSoundElement();
  64. }
  65. private void ChangeToSoundElement()
  66. {
  67. for (int i = 0; i < OperationManager.Instance.operationDataContainers.Count; i++)
  68. {
  69. OpDataContainer opDataContainer = OperationManager.Instance.operationDataContainers[i];
  70. switch (opDataContainer.opData.GetType().Name)
  71. {
  72. case "OpTrigger_ToolPack":
  73. OpTrigger_ToolPackToOpTrigger_PlaySoundElement(opDataContainer);
  74. // 刷新操作点信息
  75. OperationManager.Instance.RefreshDataInfo();
  76. break;
  77. case "OpTrigger_VRObjTriggerElement":
  78. OpTrigger_VRObjTriggerElementToOpTrigger_PlaySoundElement(opDataContainer);
  79. // 刷新操作点信息
  80. OperationManager.Instance.RefreshDataInfo();
  81. break;
  82. default:
  83. break;
  84. }
  85. }
  86. }
  87. /// <summary>
  88. /// 将OpTrigger_ToolPack转换为OpTrigger_PlaySoundElement
  89. /// </summary>
  90. private void OpTrigger_ToolPackToOpTrigger_PlaySoundElement(OpDataContainer opDataContainer)
  91. {
  92. OpTrigger_ToolPack element = opDataContainer.opData as OpTrigger_ToolPack;
  93. if (element.targetObjs != null && element.targetObjs.Count > 0) return;
  94. OpTrigger_PlaySoundElement opTrigger_PlaySoundElement = element.GetComponent<OpTrigger_PlaySoundElement>();
  95. if (opTrigger_PlaySoundElement == null) opTrigger_PlaySoundElement = element.gameObject.AddComponent<OpTrigger_PlaySoundElement>();
  96. opTrigger_PlaySoundElement.guid = element.guid;
  97. opTrigger_PlaySoundElement.operationDescription = element.operationDescription;
  98. opTrigger_PlaySoundElement.operationName = element.operationName;
  99. GameObject audioSourceObj = GameObject.Find("AudioSource");
  100. if (audioSourceObj != null) opTrigger_PlaySoundElement.audioSource = audioSourceObj.GetComponent<AudioSource>();
  101. opDataContainer.opData = opTrigger_PlaySoundElement;
  102. opTrigger_PlaySoundElement.isRegister = true;
  103. DestroyImmediate(element);
  104. }
  105. /// <summary>
  106. /// 将OpTrigger_VRObjTriggerElement转换为OpTrigger_PlaySoundElement
  107. /// </summary>
  108. private void OpTrigger_VRObjTriggerElementToOpTrigger_PlaySoundElement(OpDataContainer opDataContainer)
  109. {
  110. OpTrigger_VRObjTriggerElement element = opDataContainer.opData as OpTrigger_VRObjTriggerElement;
  111. if (element.triggerObjs != null && element.triggerObjs.Count > 0) return;
  112. OpTrigger_PlaySoundElement opTrigger_PlaySoundElement = element.GetComponent<OpTrigger_PlaySoundElement>();
  113. if (opTrigger_PlaySoundElement == null) opTrigger_PlaySoundElement = element.gameObject.AddComponent<OpTrigger_PlaySoundElement>();
  114. opTrigger_PlaySoundElement.guid = element.guid;
  115. opTrigger_PlaySoundElement.operationDescription = element.operationDescription;
  116. opTrigger_PlaySoundElement.operationName = element.operationName;
  117. GameObject audioSourceObj = GameObject.Find("AudioSource");
  118. if (audioSourceObj != null) opTrigger_PlaySoundElement.audioSource = audioSourceObj.GetComponent<AudioSource>();
  119. opDataContainer.opData = opTrigger_PlaySoundElement;
  120. opTrigger_PlaySoundElement.isRegister = true;
  121. DestroyImmediate(element);
  122. }
  123. /// <summary>
  124. /// 给关联物体添加碰撞体
  125. /// </summary>
  126. [TabGroup("平台配置", "VR平台")]
  127. [Button("添加VR相关组件")]
  128. [ShowIf("m_ManagementStructure")]
  129. public void AddBoxColliderToRelatGameObjectsByVR()
  130. {
  131. //给关联物体添加碰撞体
  132. AddBoxColliderToRelaGameObjects();
  133. //添加触发组件
  134. Dictionary<string, List<CVR_TriggerObj>> tmpDicCvrTriggerObj = GenerateCvrTriggerObj();
  135. //生成并注册Operation
  136. GeneraterOperationForVR(tmpDicCvrTriggerObj);
  137. //生成ProcessElement
  138. GeneraProcessData();
  139. }
  140. /// <summary>
  141. /// 转为音频Op
  142. /// </summary>
  143. [TabGroup("平台配置", "VR平台")]
  144. [Button("转为音频Op")]
  145. [ShowIf("m_ManagementStructure")]
  146. public void ChangeToSoundElementVR()
  147. {
  148. ChangeToSoundElement();
  149. }
  150. // <summary>
  151. /// 给关联物体添加碰撞体
  152. /// </summary>
  153. private void AddBoxColliderToRelaGameObjects()
  154. {
  155. foreach (var aniDataEditorContainer in AnimationDataEditor.Instance.animationEditorDatas)
  156. {
  157. foreach (var item in aniDataEditorContainer.relatGameObjects)
  158. {
  159. AddCollider(item.transform);
  160. }
  161. }
  162. }
  163. private void AddCollider(Transform target)
  164. {
  165. MeshRenderer[] tmpMeshRenders = target.GetComponentsInChildren<MeshRenderer>();
  166. foreach (var item in tmpMeshRenders)
  167. {
  168. if (item.GetComponent<Collider>()) DestroyImmediate(item.GetComponent<Collider>());
  169. item.GetOrAddComponent<MeshCollider>();
  170. }
  171. }
  172. /// <summary>
  173. /// 检查TriggerManager
  174. /// </summary>
  175. /// <returns></returns>
  176. private Transform CheckTriggerManager()
  177. {
  178. GameObject tmpTriggerManager = GameObject.Find("TriggerManager");
  179. if (tmpTriggerManager == null)
  180. {
  181. tmpTriggerManager = new GameObject();
  182. tmpTriggerManager.name = "TriggerManager";
  183. tmpTriggerManager.transform.SetParent(this.transform);
  184. }
  185. return tmpTriggerManager.transform;
  186. }
  187. /// <summary>
  188. /// 添加触发物体
  189. /// </summary>
  190. private Dictionary<string, List<RayCastItem>> GenerateRayCastItem()
  191. {
  192. Transform tmpTriggerManager = CheckTriggerManager();
  193. Dictionary<string, List<RayCastItem>> tmpDicRayCastItem = new Dictionary<string, List<RayCastItem>>();
  194. foreach (var aniDataEditorContainer in AnimationDataEditor.Instance.animationEditorDatas)
  195. {
  196. AnimationDataEditor.Instance.jumpTargetAnimation = aniDataEditorContainer.AniName;
  197. AnimationDataEditor.Instance.JumpToTargetAnimation();
  198. GameObject tmpParent = new GameObject();
  199. tmpParent.transform.SetParent(tmpTriggerManager.transform);
  200. tmpParent.name = aniDataEditorContainer.AniName;
  201. tmpDicRayCastItem.Add(aniDataEditorContainer.AniName, new List<RayCastItem>());
  202. foreach (var item in aniDataEditorContainer.relatGameObjects)
  203. {
  204. GameObject tmpObj = Instantiate(item.gameObject, tmpParent.transform, true);
  205. foreach (var meshRenderer in tmpObj.GetComponentsInChildren<MeshRenderer>()) meshRenderer.material = m_TransparentMaterial;
  206. tmpObj.SetActive(false);
  207. tmpDicRayCastItem[aniDataEditorContainer.AniName].Add(tmpObj.GetOrAddComponent<RayCastItem>());
  208. }
  209. }
  210. AnimationDataEditor.Instance.InitStepState();
  211. return tmpDicRayCastItem;
  212. }
  213. /// <summary>
  214. /// 添加触发物体
  215. /// </summary>
  216. private Dictionary<string, List<CVR_TriggerObj>> GenerateCvrTriggerObj()
  217. {
  218. Transform tmpTriggerManager = CheckTriggerManager();
  219. Dictionary<string, List<CVR_TriggerObj>> tmpDicRayCastItem = new Dictionary<string, List<CVR_TriggerObj>>();
  220. foreach (var aniDataEditorContainer in AnimationDataEditor.Instance.animationEditorDatas)
  221. {
  222. AnimationDataEditor.Instance.jumpTargetAnimation = aniDataEditorContainer.AniName;
  223. AnimationDataEditor.Instance.JumpToTargetAnimation();
  224. GameObject tmpParent = new GameObject();
  225. tmpParent.transform.SetParent(tmpTriggerManager.transform);
  226. tmpParent.name = aniDataEditorContainer.AniName;
  227. tmpDicRayCastItem.Add(aniDataEditorContainer.AniName, new List<CVR_TriggerObj>());
  228. foreach (var item in aniDataEditorContainer.relatGameObjects)
  229. {
  230. GameObject tmpObj = Instantiate(item.gameObject, tmpParent.transform, true);
  231. foreach (var meshRenderer in tmpObj.GetComponentsInChildren<MeshRenderer>()) meshRenderer.material = m_TransparentMaterial;
  232. tmpObj.SetActive(false);
  233. tmpDicRayCastItem[aniDataEditorContainer.AniName].Add(tmpObj.GetOrAddComponent<CVR_TriggerObj>());
  234. }
  235. }
  236. AnimationDataEditor.Instance.InitStepState();
  237. return tmpDicRayCastItem;
  238. }
  239. /// <summary>
  240. /// 生成Operation
  241. /// </summary>
  242. private void GeneraterOperationForPC(Dictionary<string, List<RayCastItem>> dicRayCastItems)
  243. {
  244. OperationManager operationManager = OperationManager.Instance;
  245. operationManager.transform.SetParent(this.transform);
  246. foreach (var animationData in AnimationDataEditor.Instance.animationEditorDatas)
  247. {
  248. OpDataContainer tmpOpDataContainer = operationManager.operationDataContainers.Find(t => t.OpDataName == animationData.AniName);
  249. OpTrigger_ToolPack tmpToolPack = null;
  250. if (tmpOpDataContainer == null)
  251. {
  252. tmpToolPack = GeneraOpTriggerToolPack(animationData.AniName, animationData.relatInfo, dicRayCastItems[animationData.AniName]);
  253. tmpToolPack.RegisterData();
  254. }
  255. else
  256. {
  257. if (tmpOpDataContainer.opData is OpTrigger_ToolPack)
  258. {
  259. tmpToolPack = tmpOpDataContainer.opData as OpTrigger_ToolPack;
  260. tmpToolPack.targetObjs.Clear();
  261. tmpToolPack.targetObjs = dicRayCastItems[animationData.AniName];
  262. }
  263. else
  264. {
  265. DestroyImmediate(tmpOpDataContainer.opData.gameObject);
  266. tmpToolPack = GeneraOpTriggerToolPack(animationData.AniName, animationData.relatInfo, dicRayCastItems[animationData.AniName]);
  267. tmpOpDataContainer.opData = tmpToolPack;
  268. }
  269. }
  270. tmpToolPack.isContronlCollider = true;
  271. }
  272. }
  273. /// <summary>
  274. /// 生成Operation
  275. /// </summary>
  276. private void GeneraterOperationForVR(Dictionary<string, List<CVR_TriggerObj>> dicRayCastItems)
  277. {
  278. OperationManager operationManager = OperationManager.Instance;
  279. operationManager.transform.SetParent(this.transform);
  280. foreach (var animationData in AnimationDataEditor.Instance.animationEditorDatas)
  281. {
  282. OpDataContainer tmpOpDataContainer = operationManager.operationDataContainers.Find(t => t.OpDataName == animationData.AniName);
  283. OpTrigger_VRObjTriggerElement tmpToolPack;
  284. if (tmpOpDataContainer == null)
  285. {
  286. tmpToolPack = GeneraOpTrigger_VRObjTriggerElement(animationData.AniName, animationData.relatInfo, dicRayCastItems[animationData.AniName]);
  287. tmpToolPack.RegisterData();
  288. }
  289. else
  290. {
  291. if (tmpOpDataContainer.opData is OpTrigger_VRObjTriggerElement)
  292. {
  293. tmpToolPack = tmpOpDataContainer.opData as OpTrigger_VRObjTriggerElement;
  294. tmpToolPack.triggerObjs.Clear();
  295. tmpToolPack.triggerObjs = dicRayCastItems[animationData.AniName];
  296. }
  297. else
  298. {
  299. DestroyImmediate(tmpOpDataContainer.opData.gameObject);
  300. tmpToolPack = GeneraOpTrigger_VRObjTriggerElement(animationData.AniName, animationData.relatInfo, dicRayCastItems[animationData.AniName]);
  301. tmpOpDataContainer.opData = tmpToolPack;
  302. }
  303. }
  304. tmpToolPack.isContronlCollider = true;
  305. }
  306. }
  307. private OpTrigger_ToolPack GeneraOpTriggerToolPack(string aniName, string desript, List<RayCastItem> RayCastItems)
  308. {
  309. OpTrigger_ToolPack tmpOpTrigger_ToolPack = null;
  310. GameObject tmpOpDataContainerObj = new GameObject();
  311. tmpOpDataContainerObj.transform.parent = OperationManager.Instance.transform;
  312. tmpOpDataContainerObj.name = aniName;
  313. tmpOpTrigger_ToolPack = tmpOpDataContainerObj.AddComponent<OpTrigger_ToolPack>();
  314. tmpOpTrigger_ToolPack.operationName = aniName;
  315. tmpOpTrigger_ToolPack.operationDescription = desript;
  316. tmpOpTrigger_ToolPack.targetObjs = RayCastItems;
  317. return tmpOpTrigger_ToolPack;
  318. }
  319. private OpTrigger_VRObjTriggerElement GeneraOpTrigger_VRObjTriggerElement(string aniName, string desript, List<CVR_TriggerObj> cvrTriggerObj)
  320. {
  321. OpTrigger_VRObjTriggerElement tmpOpTrigger_ToolPack = null;
  322. GameObject tmpOpDataContainerObj = new GameObject();
  323. tmpOpDataContainerObj.transform.parent = OperationManager.Instance.transform;
  324. tmpOpDataContainerObj.name = aniName;
  325. tmpOpTrigger_ToolPack = tmpOpDataContainerObj.AddComponent<OpTrigger_VRObjTriggerElement>();
  326. tmpOpTrigger_ToolPack.operationName = aniName;
  327. tmpOpTrigger_ToolPack.operationDescription = desript;
  328. tmpOpTrigger_ToolPack.triggerObjs = cvrTriggerObj;
  329. return tmpOpTrigger_ToolPack;
  330. }
  331. /// <summary>
  332. /// 生成步骤控制
  333. /// </summary>
  334. private void GeneraProcessData()
  335. {
  336. foreach (var aniDataEditorContainer in AnimationDataEditor.Instance.animationEditorDatas)
  337. {
  338. ProcessElement tmpProcessElement = ProcessManagement.Instance.AddProcess1();
  339. PB_OpData pB_OpData = tmpProcessElement.InitOpData() as PB_OpData;
  340. pB_OpData.opData = new OpDataInfo();
  341. pB_OpData.opData.aniDataName = aniDataEditorContainer.AniName;
  342. pB_OpData.opData.operationDataName = aniDataEditorContainer.AniName;
  343. }
  344. }
  345. private void OnEnable()
  346. {
  347. EditorApplication.update += EditorUpdate;
  348. }
  349. private void OnDisable()
  350. {
  351. EditorApplication.update -= EditorUpdate;
  352. }
  353. void EditorUpdate()
  354. {
  355. m_ManagementStructure = FindObjectOfType<ProcessManagement>() != null && FindObjectOfType<OperationManager>() != null
  356. && FindObjectOfType<AnimationManager>() != null;
  357. }
  358. }
  359. #endif