125 lines
4.0 KiB
C#
125 lines
4.0 KiB
C#
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<bool, VRTK_SDKManager.LoadedSetupChangeEventArgs> openEvent;//设备开启回调事件
|
|
UnityAction<bool> shoutDownEvent;//设备关闭回调事件
|
|
//指定VRTK预制件名称 并创建预制体 等待开始
|
|
public VRManager(string vrtkPrefabName, Vector3 postion)
|
|
{
|
|
SDKManager = GameObject.Instantiate<GameObject>(Resources.Load<GameObject>(ResourcesManager.GetPath(vrtkPrefabName))).GetComponent<VRTK_SDKManager>();
|
|
SDKManager.transform.position = postion;
|
|
SDKManager.gameObject.AddComponent<VRControllerTooltipLocalizer>();
|
|
SDKManager.LoadedSetupChanged += SDKManager_LoadedSetupChanged;
|
|
VRTK_Logger.instance.throwExceptions = false;
|
|
//leftInput = SDKManager.scriptAliasLeftController.GetComponent<IVRInput>();
|
|
rightInput = SDKManager.scriptAliasRightController.GetComponent<IVRInput>();
|
|
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;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 尝试启动VR 启动结果由事件回馈
|
|
/// </summary>
|
|
public void OpenVR(UnityAction<bool, VRTK_SDKManager.LoadedSetupChangeEventArgs> openResult)
|
|
{
|
|
this.openEvent = openResult;
|
|
SDKManager.TryLoadSDKSetupFromList();//加载VR
|
|
if (mainCamera)
|
|
mainCamera.GetComponent<AudioListener>().enabled = false;
|
|
}
|
|
|
|
public void ShoutDwonVR(UnityAction<bool> shoutdownResult)
|
|
{
|
|
this.shoutDownEvent = shoutdownResult;
|
|
SDKManager.UnloadSDKSetup(true);//卸载VR
|
|
if (mainCamera)
|
|
mainCamera.GetComponent<AudioListener>().enabled = true;
|
|
if (GroupLearnHelper.isGroup)//组协同训练时 退出同步队列
|
|
{
|
|
StopNetSync();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注册连接状态变化事件 连接失败时回馈
|
|
/// </summary>
|
|
/// <param name="loadedSetupChange"></param>
|
|
public void AddLoadedSetupChanged(LoadedSetupChangeEventHandler loadedSetupChange)
|
|
{
|
|
SDKManager.LoadedSetupChanged += loadedSetupChange;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注销连接状态变化事件
|
|
/// </summary>
|
|
/// <param name="loadedSetupChange"></param>
|
|
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<VRPersonSyncSender>();
|
|
netSyncSendCtrl.JoinSendList();
|
|
}
|
|
|
|
//虚拟人物退出网络同步
|
|
protected void StopNetSync()
|
|
{
|
|
netSyncSendCtrl?.ExitSendList();
|
|
}
|
|
|
|
}
|