123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443 |
- using ChivaXR;
- using ChivaXR.Op;
- using ChivaXR.VR;
- using JetBrains.Annotations;
- using QFramework;
- using Sirenix.OdinInspector;
- using System.Collections;
- using System.Collections.Generic;
- using System.Diagnostics;
- #if UNITY_EDITOR
- using UnityEditor;
- using UnityEngine;
- [ExecuteInEditMode]
- public class OperationCreateEditor : SerializedMonoBehaviour
- {
- /// <summary>
- /// 透明材质
- /// </summary>
- [LabelText("透明材质球")]
- public Material m_TransparentMaterial;
- private bool m_ManagementStructure = false;
- /// <summary>
- /// 生成管理结构
- /// </summary>
- [Button("生成管理结构")]
- [HideIf("m_ManagementStructure")]
- public void GenerateManagementStructure()
- {
- ProcessManagement.Instance.transform.SetParent(this.transform);
- ProcessManagement.Instance.awakePlay = true;
- if (ProcessManagement.Instance.gameObject.GetComponent<RuningJumpProcess_Example>() == null)
- {
- ProcessManagement.Instance.gameObject.AddComponent<RuningJumpProcess_Example>();
- }
- OperationManager.Instance.transform.SetParent(this.transform);
- AnimationManager.Instance.transform.SetParent(this.transform);
- }
- /// <summary>
- /// 给关联物体添加碰撞体
- /// </summary>
- [TabGroup("平台配置", "PC平台")]
- [Button("添加PC相关组件")]
- [ShowIf("m_ManagementStructure")]
- public void AddPCRelatedComponent()
- {
- //给关联物体添加碰撞体
- AddBoxColliderToRelaGameObjects();
- //添加触发组件
- Dictionary<string, List<RayCastItem>> tmpDicRayCastItem = GenerateRayCastItem();
- //生成并注册Operation
- GeneraterOperationForPC(tmpDicRayCastItem);
- //生成ProcessElement
- GeneraProcessData();
- }
- /// <summary>
- /// 转为音频Op
- /// </summary>
- [TabGroup("平台配置", "PC平台")]
- [Button("转为音频Op")]
- [ShowIf("m_ManagementStructure")]
- public void ChangeToSoundElementPC()
- {
- ChangeToSoundElement();
- }
- private void ChangeToSoundElement()
- {
- for (int i = 0; i < OperationManager.Instance.operationDataContainers.Count; i++)
- {
- OpDataContainer opDataContainer = OperationManager.Instance.operationDataContainers[i];
- switch (opDataContainer.opData.GetType().Name)
- {
- case "OpTrigger_ToolPack":
- OpTrigger_ToolPackToOpTrigger_PlaySoundElement(opDataContainer);
- // 刷新操作点信息
- OperationManager.Instance.RefreshDataInfo();
- break;
- case "OpTrigger_VRObjTriggerElement":
- OpTrigger_VRObjTriggerElementToOpTrigger_PlaySoundElement(opDataContainer);
- // 刷新操作点信息
- OperationManager.Instance.RefreshDataInfo();
- break;
- default:
- break;
- }
- }
- }
- /// <summary>
- /// 将OpTrigger_ToolPack转换为OpTrigger_PlaySoundElement
- /// </summary>
- private void OpTrigger_ToolPackToOpTrigger_PlaySoundElement(OpDataContainer opDataContainer)
- {
- OpTrigger_ToolPack element = opDataContainer.opData as OpTrigger_ToolPack;
- if (element.targetObjs != null && element.targetObjs.Count > 0) return;
- OpTrigger_PlaySoundElement opTrigger_PlaySoundElement = element.GetComponent<OpTrigger_PlaySoundElement>();
- if (opTrigger_PlaySoundElement == null) opTrigger_PlaySoundElement = element.gameObject.AddComponent<OpTrigger_PlaySoundElement>();
- opTrigger_PlaySoundElement.guid = element.guid;
- opTrigger_PlaySoundElement.operationDescription = element.operationDescription;
- opTrigger_PlaySoundElement.operationName = element.operationName;
- GameObject audioSourceObj = GameObject.Find("AudioSource");
- if (audioSourceObj != null) opTrigger_PlaySoundElement.audioSource = audioSourceObj.GetComponent<AudioSource>();
- opDataContainer.opData = opTrigger_PlaySoundElement;
- opTrigger_PlaySoundElement.isRegister = true;
- DestroyImmediate(element);
- }
- /// <summary>
- /// 将OpTrigger_VRObjTriggerElement转换为OpTrigger_PlaySoundElement
- /// </summary>
- private void OpTrigger_VRObjTriggerElementToOpTrigger_PlaySoundElement(OpDataContainer opDataContainer)
- {
- OpTrigger_VRObjTriggerElement element = opDataContainer.opData as OpTrigger_VRObjTriggerElement;
- if (element.triggerObjs != null && element.triggerObjs.Count > 0) return;
- OpTrigger_PlaySoundElement opTrigger_PlaySoundElement = element.GetComponent<OpTrigger_PlaySoundElement>();
- if (opTrigger_PlaySoundElement == null) opTrigger_PlaySoundElement = element.gameObject.AddComponent<OpTrigger_PlaySoundElement>();
- opTrigger_PlaySoundElement.guid = element.guid;
- opTrigger_PlaySoundElement.operationDescription = element.operationDescription;
- opTrigger_PlaySoundElement.operationName = element.operationName;
- GameObject audioSourceObj = GameObject.Find("AudioSource");
- if (audioSourceObj != null) opTrigger_PlaySoundElement.audioSource = audioSourceObj.GetComponent<AudioSource>();
- opDataContainer.opData = opTrigger_PlaySoundElement;
- opTrigger_PlaySoundElement.isRegister = true;
- DestroyImmediate(element);
- }
- /// <summary>
- /// 给关联物体添加碰撞体
- /// </summary>
- [TabGroup("平台配置", "VR平台")]
- [Button("添加VR相关组件")]
- [ShowIf("m_ManagementStructure")]
- public void AddBoxColliderToRelatGameObjectsByVR()
- {
- //给关联物体添加碰撞体
- AddBoxColliderToRelaGameObjects();
- //添加触发组件
- Dictionary<string, List<CVR_TriggerObj>> tmpDicCvrTriggerObj = GenerateCvrTriggerObj();
- //生成并注册Operation
- GeneraterOperationForVR(tmpDicCvrTriggerObj);
- //生成ProcessElement
- GeneraProcessData();
- }
- /// <summary>
- /// 转为音频Op
- /// </summary>
- [TabGroup("平台配置", "VR平台")]
- [Button("转为音频Op")]
- [ShowIf("m_ManagementStructure")]
- public void ChangeToSoundElementVR()
- {
- ChangeToSoundElement();
- }
- // <summary>
- /// 给关联物体添加碰撞体
- /// </summary>
- private void AddBoxColliderToRelaGameObjects()
- {
- foreach (var aniDataEditorContainer in AnimationDataEditor.Instance.animationEditorDatas)
- {
- foreach (var item in aniDataEditorContainer.relatGameObjects)
- {
- AddCollider(item.transform);
- }
- }
- }
- private void AddCollider(Transform target)
- {
- MeshRenderer[] tmpMeshRenders = target.GetComponentsInChildren<MeshRenderer>();
- foreach (var item in tmpMeshRenders)
- {
- if (item.GetComponent<Collider>()) DestroyImmediate(item.GetComponent<Collider>());
- item.GetOrAddComponent<MeshCollider>();
- }
- }
- /// <summary>
- /// 检查TriggerManager
- /// </summary>
- /// <returns></returns>
- private Transform CheckTriggerManager()
- {
- GameObject tmpTriggerManager = GameObject.Find("TriggerManager");
- if (tmpTriggerManager == null)
- {
- tmpTriggerManager = new GameObject();
- tmpTriggerManager.name = "TriggerManager";
- tmpTriggerManager.transform.SetParent(this.transform);
- }
- return tmpTriggerManager.transform;
- }
- /// <summary>
- /// 添加触发物体
- /// </summary>
- private Dictionary<string, List<RayCastItem>> GenerateRayCastItem()
- {
- Transform tmpTriggerManager = CheckTriggerManager();
- Dictionary<string, List<RayCastItem>> tmpDicRayCastItem = new Dictionary<string, List<RayCastItem>>();
- foreach (var aniDataEditorContainer in AnimationDataEditor.Instance.animationEditorDatas)
- {
- AnimationDataEditor.Instance.jumpTargetAnimation = aniDataEditorContainer.AniName;
- AnimationDataEditor.Instance.JumpToTargetAnimation();
- GameObject tmpParent = new GameObject();
- tmpParent.transform.SetParent(tmpTriggerManager.transform);
- tmpParent.name = aniDataEditorContainer.AniName;
- tmpDicRayCastItem.Add(aniDataEditorContainer.AniName, new List<RayCastItem>());
- foreach (var item in aniDataEditorContainer.relatGameObjects)
- {
- GameObject tmpObj = Instantiate(item.gameObject, tmpParent.transform, true);
- foreach (var meshRenderer in tmpObj.GetComponentsInChildren<MeshRenderer>()) meshRenderer.material = m_TransparentMaterial;
- tmpObj.SetActive(false);
- tmpDicRayCastItem[aniDataEditorContainer.AniName].Add(tmpObj.GetOrAddComponent<RayCastItem>());
- }
- }
- AnimationDataEditor.Instance.InitStepState();
- return tmpDicRayCastItem;
- }
- /// <summary>
- /// 添加触发物体
- /// </summary>
- private Dictionary<string, List<CVR_TriggerObj>> GenerateCvrTriggerObj()
- {
- Transform tmpTriggerManager = CheckTriggerManager();
- Dictionary<string, List<CVR_TriggerObj>> tmpDicRayCastItem = new Dictionary<string, List<CVR_TriggerObj>>();
- foreach (var aniDataEditorContainer in AnimationDataEditor.Instance.animationEditorDatas)
- {
- AnimationDataEditor.Instance.jumpTargetAnimation = aniDataEditorContainer.AniName;
- AnimationDataEditor.Instance.JumpToTargetAnimation();
- GameObject tmpParent = new GameObject();
- tmpParent.transform.SetParent(tmpTriggerManager.transform);
- tmpParent.name = aniDataEditorContainer.AniName;
- tmpDicRayCastItem.Add(aniDataEditorContainer.AniName, new List<CVR_TriggerObj>());
- foreach (var item in aniDataEditorContainer.relatGameObjects)
- {
- GameObject tmpObj = Instantiate(item.gameObject, tmpParent.transform, true);
- foreach (var meshRenderer in tmpObj.GetComponentsInChildren<MeshRenderer>()) meshRenderer.material = m_TransparentMaterial;
- tmpObj.SetActive(false);
- tmpDicRayCastItem[aniDataEditorContainer.AniName].Add(tmpObj.GetOrAddComponent<CVR_TriggerObj>());
- }
- }
- AnimationDataEditor.Instance.InitStepState();
- return tmpDicRayCastItem;
- }
- /// <summary>
- /// 生成Operation
- /// </summary>
- private void GeneraterOperationForPC(Dictionary<string, List<RayCastItem>> dicRayCastItems)
- {
- OperationManager operationManager = OperationManager.Instance;
- operationManager.transform.SetParent(this.transform);
- foreach (var animationData in AnimationDataEditor.Instance.animationEditorDatas)
- {
- OpDataContainer tmpOpDataContainer = operationManager.operationDataContainers.Find(t => t.OpDataName == animationData.AniName);
- OpTrigger_ToolPack tmpToolPack = null;
- if (tmpOpDataContainer == null)
- {
- tmpToolPack = GeneraOpTriggerToolPack(animationData.AniName, animationData.relatInfo, dicRayCastItems[animationData.AniName]);
- tmpToolPack.RegisterData();
- }
- else
- {
- if (tmpOpDataContainer.opData is OpTrigger_ToolPack)
- {
- tmpToolPack = tmpOpDataContainer.opData as OpTrigger_ToolPack;
- tmpToolPack.targetObjs.Clear();
- tmpToolPack.targetObjs = dicRayCastItems[animationData.AniName];
- }
- else
- {
- DestroyImmediate(tmpOpDataContainer.opData.gameObject);
- tmpToolPack = GeneraOpTriggerToolPack(animationData.AniName, animationData.relatInfo, dicRayCastItems[animationData.AniName]);
- tmpOpDataContainer.opData = tmpToolPack;
- }
- }
- tmpToolPack.isContronlCollider = true;
- }
- }
- /// <summary>
- /// 生成Operation
- /// </summary>
- private void GeneraterOperationForVR(Dictionary<string, List<CVR_TriggerObj>> dicRayCastItems)
- {
- OperationManager operationManager = OperationManager.Instance;
- operationManager.transform.SetParent(this.transform);
- foreach (var animationData in AnimationDataEditor.Instance.animationEditorDatas)
- {
- OpDataContainer tmpOpDataContainer = operationManager.operationDataContainers.Find(t => t.OpDataName == animationData.AniName);
- OpTrigger_VRObjTriggerElement tmpToolPack;
- if (tmpOpDataContainer == null)
- {
- tmpToolPack = GeneraOpTrigger_VRObjTriggerElement(animationData.AniName, animationData.relatInfo, dicRayCastItems[animationData.AniName]);
- tmpToolPack.RegisterData();
- }
- else
- {
- if (tmpOpDataContainer.opData is OpTrigger_VRObjTriggerElement)
- {
- tmpToolPack = tmpOpDataContainer.opData as OpTrigger_VRObjTriggerElement;
- tmpToolPack.triggerObjs.Clear();
- tmpToolPack.triggerObjs = dicRayCastItems[animationData.AniName];
- }
- else
- {
- DestroyImmediate(tmpOpDataContainer.opData.gameObject);
- tmpToolPack = GeneraOpTrigger_VRObjTriggerElement(animationData.AniName, animationData.relatInfo, dicRayCastItems[animationData.AniName]);
- tmpOpDataContainer.opData = tmpToolPack;
- }
- }
- tmpToolPack.isContronlCollider = true;
- }
- }
- private OpTrigger_ToolPack GeneraOpTriggerToolPack(string aniName, string desript, List<RayCastItem> RayCastItems)
- {
- OpTrigger_ToolPack tmpOpTrigger_ToolPack = null;
- GameObject tmpOpDataContainerObj = new GameObject();
- tmpOpDataContainerObj.transform.parent = OperationManager.Instance.transform;
- tmpOpDataContainerObj.name = aniName;
- tmpOpTrigger_ToolPack = tmpOpDataContainerObj.AddComponent<OpTrigger_ToolPack>();
- tmpOpTrigger_ToolPack.operationName = aniName;
- tmpOpTrigger_ToolPack.operationDescription = desript;
- tmpOpTrigger_ToolPack.targetObjs = RayCastItems;
- return tmpOpTrigger_ToolPack;
- }
- private OpTrigger_VRObjTriggerElement GeneraOpTrigger_VRObjTriggerElement(string aniName, string desript, List<CVR_TriggerObj> cvrTriggerObj)
- {
- OpTrigger_VRObjTriggerElement tmpOpTrigger_ToolPack = null;
- GameObject tmpOpDataContainerObj = new GameObject();
- tmpOpDataContainerObj.transform.parent = OperationManager.Instance.transform;
- tmpOpDataContainerObj.name = aniName;
- tmpOpTrigger_ToolPack = tmpOpDataContainerObj.AddComponent<OpTrigger_VRObjTriggerElement>();
- tmpOpTrigger_ToolPack.operationName = aniName;
- tmpOpTrigger_ToolPack.operationDescription = desript;
- tmpOpTrigger_ToolPack.triggerObjs = cvrTriggerObj;
- return tmpOpTrigger_ToolPack;
- }
- /// <summary>
- /// 生成步骤控制
- /// </summary>
- private void GeneraProcessData()
- {
- foreach (var aniDataEditorContainer in AnimationDataEditor.Instance.animationEditorDatas)
- {
- ProcessElement tmpProcessElement = ProcessManagement.Instance.AddProcess1();
- PB_OpData pB_OpData = tmpProcessElement.InitOpData() as PB_OpData;
- pB_OpData.opData = new OpDataInfo();
- pB_OpData.opData.aniDataName = aniDataEditorContainer.AniName;
- pB_OpData.opData.operationDataName = aniDataEditorContainer.AniName;
- }
- }
- private void OnEnable()
- {
- EditorApplication.update += EditorUpdate;
- }
- private void OnDisable()
- {
- EditorApplication.update -= EditorUpdate;
- }
- void EditorUpdate()
- {
- m_ManagementStructure = FindObjectOfType<ProcessManagement>() != null && FindObjectOfType<OperationManager>() != null
- && FindObjectOfType<AnimationManager>() != null;
- }
- }
- #endif
|