unityzgy/Assets/Scripts/PublicTool/SyncGO/NetSyncCtrl/Handler/VRPersonSyncHandlerCtrl.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

180 lines
6.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XFramework;
public class VRPersonSyncHandlerCtrl : MonoBehaviour, ISyncHand
{
private Transform headTrans;
private Transform leftHandTrans;
private Transform rightHandTrans;
float interval;//帧同步数据正常情况下应该进入的时间间隔
bool lerpTrans;//是否开启lerp同步
bool lerping = false;//当前数据是否需要执行Lerp
float lerpTimer;//开启Lerp时的计时器 用于计算每帧的位置
//Lerp 时记录接到数据时当前同步物体的所有位置和角度
TransGesture currentHead;
TransGesture currentLH;
TransGesture currentRH;
Text3DCtrl Text3DCtrl_showName;
//接收到的同步数据
PersonSyncData personSyncData;
[SerializeField]
string soleName;
// Start is called before the first frame update
void Awake()
{
headTrans = this.transform.FindChildTrans("Head");
leftHandTrans = this.transform.FindChildTrans("LeftHand");
rightHandTrans = this.transform.FindChildTrans("RightHand");
Text3DCtrl_showName = this.GetComponentInChildren<Text3DCtrl>();
}
/// <summary>
/// 设置学员信息 确定同步时的唯一名称和显示的名字
/// 加入同步处理队列
/// </summary>
/// <param name="user"></param>
/// <param name="ip"></param>
public void SetUser(string user, string ip)
{
Text3DCtrl_showName.SetName(user);
soleName = $"VRPerson_{ip}";//名称创建时根据IP自动获取
JoinHandList();
}
public string GetSoleName()
{
return soleName;
}
public void HandleSyncData(object msg, string msgType = null)
{
//if (msgType == "Trans")//位置同步处理 人物只有位置同步需要处理 无需使用消息标签
//{
personSyncData = (PersonSyncData)msg;
CheckDataForActive();
if (!lerpTrans)//未开启Lerp 模式时直接同步
{
SyncData();
}
else//重置计时器 记录当前位置 等待FixedUpdate Lerp
{
MarkCurrentPos();
lerpTimer = 0;
lerping = true;
}
//}
}
//检查数据 显示隐藏无效数据对应的部位
private void CheckDataForActive()
{
if (personSyncData.head.GetPos() == Vector3.zero && headTrans.gameObject.activeSelf)//无有效同步数据时 隐藏物体
{
headTrans.gameObject.SetActive(false);
}
else if (personSyncData.head.GetPos() != Vector3.zero && !headTrans.gameObject.activeSelf)
{
headTrans.gameObject.SetActive(true);
}
if (personSyncData.LH.GetPos() == Vector3.zero && leftHandTrans.gameObject.activeSelf)//无有效同步数据时 隐藏物体
{
leftHandTrans.gameObject.SetActive(false);
}
else if (personSyncData.LH.GetPos() != Vector3.zero && !leftHandTrans.gameObject.activeSelf)
{
leftHandTrans.gameObject.SetActive(true);
}
if (personSyncData.RH.GetPos() == Vector3.zero && rightHandTrans.gameObject.activeSelf)//无有效同步数据时 隐藏物体
{
rightHandTrans.gameObject.SetActive(false);
}
else if (personSyncData.RH.GetPos() != Vector3.zero && !rightHandTrans.gameObject.activeSelf)
{
rightHandTrans.gameObject.SetActive(true);
}
}
//直接同步位置
private void SyncData()
{
headTrans.transform.localPosition = personSyncData.head.GetPos();
headTrans.transform.eulerAngles = personSyncData.head.GetRotAnlgle();
leftHandTrans.transform.localPosition = personSyncData.LH.GetPos();
leftHandTrans.transform.eulerAngles = personSyncData.LH.GetRotAnlgle();
rightHandTrans.transform.localPosition = personSyncData.RH.GetPos();
rightHandTrans.transform.eulerAngles = personSyncData.RH.GetRotAnlgle();
}
//Lerp同步位置
private void LerpSyncData(float progress)
{
//headTrans.transform.localPosition = Vector3.Lerp(currentHead.GetPos(), personSyncData.head.GetPos(),progress);
//headTrans.transform.eulerAngles = Vector3.Lerp(currentHead.GetRotAnlgle(), personSyncData.head.GetRotAnlgle(), progress);
//leftHandTrans.transform.localPosition = Vector3.Lerp(currentLH.GetPos(), personSyncData.LH.GetPos(), progress);
//leftHandTrans.transform.eulerAngles = Vector3.Lerp(currentLH.GetRotAnlgle(), personSyncData.LH.GetRotAnlgle(),progress);
//rightHandTrans.transform.localPosition = Vector3.Lerp(currentRH.GetPos(),personSyncData.RH.GetPos(),progress);
//rightHandTrans.transform.eulerAngles = Vector3.Lerp(currentRH.GetRotAnlgle(), personSyncData.RH.GetRotAnlgle(), progress) ;
LerpOneTrans(headTrans, currentHead, personSyncData.head, progress);
LerpOneTrans(leftHandTrans, currentLH, personSyncData.LH, progress);
LerpOneTrans(rightHandTrans, currentRH, personSyncData.RH, progress);
}
private void LerpOneTrans( Transform target,TransGesture a,TransGesture b,float progress)
{
target.localPosition = Vector3.Lerp(a.GetPos(), b.GetPos(), progress);
target.transform.localRotation =Quaternion.Lerp(Quaternion.Euler(a.GetRotAnlgle()), Quaternion.Euler(b.GetRotAnlgle()), progress);
}
public void JoinHandList()
{
SyncGOManager.Instance.AddHandler(this);
}
public void ExitHandList()
{
SyncGOManager.Instance.RemoHandler(this);
}
private void FixedUpdate()
{
if (lerpTrans&& lerping)
{
if (lerpTimer <= interval)
{
lerpTimer += Time.fixedUnscaledDeltaTime;
LerpSyncData(lerpTimer / interval);
}
else//Lerp完成了
{
lerping = false;
}
}
}
//记录当前位置
private void MarkCurrentPos()
{
currentHead = new TransGesture(headTrans.localPosition, headTrans.localEulerAngles);
currentLH = new TransGesture(leftHandTrans.localPosition, leftHandTrans.localEulerAngles);
currentRH = new TransGesture(rightHandTrans.localPosition, rightHandTrans.localEulerAngles);
}
public void InitInterval(float time)
{
interval = time;
if (interval > 0.04f)
lerpTrans = true;
}
}