namespace ChivaXR.VR { using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class CVR_ToolManager : MonoSingleton { //交互工具 public Dictionary> dic_Tools = new Dictionary>(); //触发工具 public Dictionary> dic_TriggerTools = new Dictionary>(); //模拟工具辅助点 public Dictionary> dic_SimulationPoints = new Dictionary>(); /// /// 所有工器具的触发事件 /// public event CVRInteractableTriggerEventHandler InteractableTrigger; /// /// 注册交互工具 /// /// /// public void RegisterTool(CVR_ToolType toolType, IVR_Interactable interactable) { var toolTypes = EnumHelper.GetEnumValuesFromFlagsEnum((int)toolType); foreach (var item in toolTypes) { if (!dic_Tools.ContainsKey(item)) { dic_Tools.Add(item, new List() { interactable }); } else if (!dic_Tools[item].Contains(interactable)) { dic_Tools[item].Add(interactable); } } } /// /// 添加触发模块 /// /// /// public void RegisterTriggerTool(CVR_ToolType toolType, CVR_TriggerTool triggerTool) { var toolTypes = EnumHelper.GetEnumValuesFromFlagsEnum((int)toolType); foreach (var item in toolTypes) { if (!dic_TriggerTools.ContainsKey(item)) { dic_TriggerTools.Add(item, new List() { triggerTool }); } else if (!dic_TriggerTools[item].Contains(triggerTool)) { dic_TriggerTools[item].Add(triggerTool); } } UpDateTriggerList(triggerTool); triggerTool.InteractableTrigger += InteractableToolTrigger; } public void UpDateTriggerList(CVR_TriggerTool triggerTool) { //如果目标工具不支持脚本检测方式,添加脚本检测 if ((triggerTool.TriggerList.checkType & CVR_TriggerList.CheckTypes.Script) == 0) { triggerTool.TriggerList.checkType = triggerTool.TriggerList.checkType | CVR_TriggerList.CheckTypes.Script; } //如果目标工具不支持当前系统Data检测,添加Data检测 if (!triggerTool.TriggerList.identifiers.Contains(typeof(CVR_ValueElement).Name)) { triggerTool.TriggerList.identifiers.Add(typeof(CVR_ValueElement).Name); } if (!triggerTool.TriggerList.identifiers.Contains(typeof(CVR_TriggerElement).Name)) { triggerTool.TriggerList.identifiers.Add(typeof(CVR_TriggerElement).Name); } } /// /// 交互工具触发(已注册所有工具的触发事件) /// /// /// public void InteractableToolTrigger(object sender, CVR_InteractableTriggerEventArgs e) { if (InteractableTrigger != null) { InteractableTrigger(sender, e); } CheckTriggerElementInColliders(e); } private static void CheckTriggerElementInColliders(CVR_InteractableTriggerEventArgs e) { for (int i = 0; i < e.triggerObjects.Length; i++) { IVR_OperationElement operationElement = (IVR_OperationElement)e.triggerObjects[i].GetComponentInParent(); if (operationElement == null || (operationElement.GetToolType() & e.toolType) == 0 || !operationElement.GetActive()) continue; operationElement.Trigger(e); Debug.Log(operationElement.GetToolType()); //一个工具优先只触发一种TriggerElement return; } } /// /// 添加模拟模块 /// /// /// public void RegisterToolSimulationPoint(CVR_ToolType toolType, CVR_SimulationPoint _simulationPoint) { var toolTypes = EnumHelper.GetEnumValuesFromFlagsEnum((int)toolType); foreach (var item in toolTypes) { if (!dic_SimulationPoints.ContainsKey(item)) { dic_SimulationPoints.Add(item, new List() { _simulationPoint }); } else if (!dic_SimulationPoints[item].Contains(_simulationPoint)) { dic_SimulationPoints[item].Add(_simulationPoint); } } } /// /// 创建模拟操作辅助点 /// /// /// public CVR_SimulationPoint CreatSimulationPoint(CVR_ToolType toolType) { var toolTypes = EnumHelper.GetEnumValuesFromFlagsEnum((int)toolType); CVR_SimulationPoint point = CVR_SimulationPool.Instance.GetSimulationPoint(); foreach (var item in toolTypes) { RegisterToolSimulationPoint(toolType, point); } return point; } /// /// 清除模拟操作辅助点 /// /// /// public void ClearSimulationPoint(CVR_ToolType toolType, CVR_SimulationPoint point) { var toolTypes = EnumHelper.GetEnumValuesFromFlagsEnum((int)toolType); foreach (var item in toolTypes) { if (dic_SimulationPoints.ContainsKey(toolType)) { if (dic_SimulationPoints[toolType].Contains(point)) { dic_SimulationPoints[toolType].Remove(point); } if (dic_SimulationPoints[toolType].Count == 0) { dic_SimulationPoints.Remove(toolType); } } } //回收至对象池 CVR_SimulationPool.Instance.RecycleSimulationPoint(point); } /// /// 根据多选枚举获取对应IVR_Interactable /// /// /// public IVR_Interactable[] GetTools(CVR_ToolType toolType) { var toolTypes = EnumHelper.GetEnumValuesFromFlagsEnum((int)toolType); List _tools = new List(); foreach (var item in toolTypes) { if (dic_Tools.ContainsKey(item)) { _tools.AddRange(dic_Tools[item].ToArray()); } } return _tools.ToArray(); } /// /// 根据多选枚举获取对应TriggerTool /// /// /// public CVR_TriggerTool[] GetTool_Triggers(CVR_ToolType toolType) { var toolTypes = EnumHelper.GetEnumValuesFromFlagsEnum((int)toolType); List _triggerTools = new List(); foreach (var item in toolTypes) { if (dic_TriggerTools.ContainsKey(item)) { _triggerTools.AddRange(dic_TriggerTools[item].ToArray()); } } return _triggerTools.ToArray(); } } }