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