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 { /// /// 透明材质 /// [LabelText("透明材质球")] public Material m_TransparentMaterial; private bool m_ManagementStructure = false; /// /// 生成管理结构 /// [Button("生成管理结构")] [HideIf("m_ManagementStructure")] public void GenerateManagementStructure() { ProcessManagement.Instance.transform.SetParent(this.transform); ProcessManagement.Instance.awakePlay = true; if (ProcessManagement.Instance.gameObject.GetComponent() == null) { ProcessManagement.Instance.gameObject.AddComponent(); } OperationManager.Instance.transform.SetParent(this.transform); AnimationManager.Instance.transform.SetParent(this.transform); } /// /// 给关联物体添加碰撞体 /// [TabGroup("平台配置", "PC平台")] [Button("添加PC相关组件")] [ShowIf("m_ManagementStructure")] public void AddPCRelatedComponent() { //给关联物体添加碰撞体 AddBoxColliderToRelaGameObjects(); //添加触发组件 Dictionary> tmpDicRayCastItem = GenerateRayCastItem(); //生成并注册Operation GeneraterOperationForPC(tmpDicRayCastItem); //生成ProcessElement GeneraProcessData(); } /// /// 转为音频Op /// [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; } } } /// /// 将OpTrigger_ToolPack转换为OpTrigger_PlaySoundElement /// 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(); if (opTrigger_PlaySoundElement == null) opTrigger_PlaySoundElement = element.gameObject.AddComponent(); 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(); opDataContainer.opData = opTrigger_PlaySoundElement; opTrigger_PlaySoundElement.isRegister = true; DestroyImmediate(element); } /// /// 将OpTrigger_VRObjTriggerElement转换为OpTrigger_PlaySoundElement /// 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(); if (opTrigger_PlaySoundElement == null) opTrigger_PlaySoundElement = element.gameObject.AddComponent(); 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(); opDataContainer.opData = opTrigger_PlaySoundElement; opTrigger_PlaySoundElement.isRegister = true; DestroyImmediate(element); } /// /// 给关联物体添加碰撞体 /// [TabGroup("平台配置", "VR平台")] [Button("添加VR相关组件")] [ShowIf("m_ManagementStructure")] public void AddBoxColliderToRelatGameObjectsByVR() { //给关联物体添加碰撞体 AddBoxColliderToRelaGameObjects(); //添加触发组件 Dictionary> tmpDicCvrTriggerObj = GenerateCvrTriggerObj(); //生成并注册Operation GeneraterOperationForVR(tmpDicCvrTriggerObj); //生成ProcessElement GeneraProcessData(); } /// /// 转为音频Op /// [TabGroup("平台配置", "VR平台")] [Button("转为音频Op")] [ShowIf("m_ManagementStructure")] public void ChangeToSoundElementVR() { ChangeToSoundElement(); } // /// 给关联物体添加碰撞体 /// 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(); foreach (var item in tmpMeshRenders) { if (item.GetComponent()) DestroyImmediate(item.GetComponent()); item.GetOrAddComponent(); } } /// /// 检查TriggerManager /// /// 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; } /// /// 添加触发物体 /// private Dictionary> GenerateRayCastItem() { Transform tmpTriggerManager = CheckTriggerManager(); Dictionary> tmpDicRayCastItem = new Dictionary>(); 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()); foreach (var item in aniDataEditorContainer.relatGameObjects) { GameObject tmpObj = Instantiate(item.gameObject, tmpParent.transform, true); foreach (var meshRenderer in tmpObj.GetComponentsInChildren()) meshRenderer.material = m_TransparentMaterial; tmpObj.SetActive(false); tmpDicRayCastItem[aniDataEditorContainer.AniName].Add(tmpObj.GetOrAddComponent()); } } AnimationDataEditor.Instance.InitStepState(); return tmpDicRayCastItem; } /// /// 添加触发物体 /// private Dictionary> GenerateCvrTriggerObj() { Transform tmpTriggerManager = CheckTriggerManager(); Dictionary> tmpDicRayCastItem = new Dictionary>(); 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()); foreach (var item in aniDataEditorContainer.relatGameObjects) { GameObject tmpObj = Instantiate(item.gameObject, tmpParent.transform, true); foreach (var meshRenderer in tmpObj.GetComponentsInChildren()) meshRenderer.material = m_TransparentMaterial; tmpObj.SetActive(false); tmpDicRayCastItem[aniDataEditorContainer.AniName].Add(tmpObj.GetOrAddComponent()); } } AnimationDataEditor.Instance.InitStepState(); return tmpDicRayCastItem; } /// /// 生成Operation /// private void GeneraterOperationForPC(Dictionary> 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; } } /// /// 生成Operation /// private void GeneraterOperationForVR(Dictionary> 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 RayCastItems) { OpTrigger_ToolPack tmpOpTrigger_ToolPack = null; GameObject tmpOpDataContainerObj = new GameObject(); tmpOpDataContainerObj.transform.parent = OperationManager.Instance.transform; tmpOpDataContainerObj.name = aniName; tmpOpTrigger_ToolPack = tmpOpDataContainerObj.AddComponent(); 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 cvrTriggerObj) { OpTrigger_VRObjTriggerElement tmpOpTrigger_ToolPack = null; GameObject tmpOpDataContainerObj = new GameObject(); tmpOpDataContainerObj.transform.parent = OperationManager.Instance.transform; tmpOpDataContainerObj.name = aniName; tmpOpTrigger_ToolPack = tmpOpDataContainerObj.AddComponent(); tmpOpTrigger_ToolPack.operationName = aniName; tmpOpTrigger_ToolPack.operationDescription = desript; tmpOpTrigger_ToolPack.triggerObjs = cvrTriggerObj; return tmpOpTrigger_ToolPack; } /// /// 生成步骤控制 /// 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() != null && FindObjectOfType() != null && FindObjectOfType() != null; } } #endif