unityzgy/Assets/Scripts/Managers/VRManager.cs
ayuan9957 bf12e02276 feat: 多语言本地化系统 - 支持中/英/法/俄实时切换
- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg)
- LoginPanel: InputField placeholder本地化、字体颜色保持
- HistoryPanel: 用时数据本地化、placeholder本地化
- RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建)
- AppraiseWindowBase: 评价等级本地化、操作消息重建
- EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized
- StudentOperateRecorder: 新增InjectOperateMsgLocalized方法
- LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选
- 字体切换时保留颜色和verticalOverflow
2026-07-16 10:05:59 +08:00

124 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.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();
}
}