using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using VRTK; using XFramework; using static VRTK.VRTK_SDKManager; //加载VRTK预制件 提供开启和关闭接口 管理初始化网络同步逻辑 public class VRManager : IVRInput { VRTK_SDKManager SDKManager; public Camera mainCamera; VRPersonSyncSender netSyncSendCtrl; //IVRInput leftInput; IVRInput rightInput; UnityAction openEvent;//设备开启回调事件 UnityAction shoutDownEvent;//设备关闭回调事件 //指定VRTK预制件名称 并创建预制体 等待开始 public VRManager(string vrtkPrefabName, Vector3 postion) { SDKManager = GameObject.Instantiate(Resources.Load(ResourcesManager.GetPath(vrtkPrefabName))).GetComponent(); SDKManager.transform.position = postion; SDKManager.gameObject.AddComponent(); SDKManager.LoadedSetupChanged += SDKManager_LoadedSetupChanged; VRTK_Logger.instance.throwExceptions = false; //leftInput = SDKManager.scriptAliasLeftController.GetComponent(); rightInput = SDKManager.scriptAliasRightController.GetComponent(); mainCamera = Camera.main; } //连接状态改变 private void SDKManager_LoadedSetupChanged(VRTK_SDKManager sender, VRTK_SDKManager.LoadedSetupChangeEventArgs e) { if (string.IsNullOrEmpty(e.errorMessage)) { openEvent?.Invoke(true, e); openEvent = null; shoutDownEvent?.Invoke(true); shoutDownEvent = null; if (GroupLearnHelper.isGroup)//组协同训练时 加入同步队列 { StartNetSync(); } } else { openEvent?.Invoke(false, e); openEvent = null; shoutDownEvent?.Invoke(false); shoutDownEvent = null; } } /// /// 尝试启动VR 启动结果由事件回馈 /// public void OpenVR(UnityAction openResult) { this.openEvent = openResult; SDKManager.TryLoadSDKSetupFromList();//加载VR if (mainCamera) mainCamera.GetComponent().enabled = false; } public void ShoutDwonVR(UnityAction shoutdownResult) { this.shoutDownEvent = shoutdownResult; SDKManager.UnloadSDKSetup(true);//卸载VR if (mainCamera) mainCamera.GetComponent().enabled = true; if (GroupLearnHelper.isGroup)//组协同训练时 退出同步队列 { StopNetSync(); } } /// /// 注册连接状态变化事件 连接失败时回馈 /// /// public void AddLoadedSetupChanged(LoadedSetupChangeEventHandler loadedSetupChange) { SDKManager.LoadedSetupChanged += loadedSetupChange; } /// /// 注销连接状态变化事件 /// /// public void RemoveLoadedSetupChanged(LoadedSetupChangeEventHandler loadedSetupChange) { SDKManager.LoadedSetupChanged -= loadedSetupChange; } public void Destroy() { SDKManager.LoadedSetupChanged -= SDKManager_LoadedSetupChanged; } //启用交互操作 public void SetInteractable(bool interactable) { //leftInput.SetInteractable(interactable); rightInput.SetInteractable(interactable); } //虚拟人物加入网络同步 protected void StartNetSync() { if (netSyncSendCtrl == null) netSyncSendCtrl = SDKManager.transform.GetOrAddComponent(); netSyncSendCtrl.JoinSendList(); } //虚拟人物退出网络同步 protected void StopNetSync() { netSyncSendCtrl?.ExitSendList(); } }