unityzgy/.svn/pristine/0e/0e25208b094bcb5a20eabace6e53c814a28e3d4e.svn-base
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

214 lines
6.0 KiB
Plaintext

using XFramework;
using UnityEngine.UI;
using UnityEngine;
using System;
using VRTK;
using UnityEngine.Events;
//千斤顶控制器 到达指定位置时可以升起
public class QianJinDingCtrl : VRGrabInterractableBase
{
Transform transform_rootrod;
Transform transform_firstrod;
Transform transform_secondrod;
CollisionCtrl collisionctrl_dingban;
float currentChangeDir;//当前千斤顶长度变化方向 1伸长 2缩短
public float changeSpeed = 0.03f;
float firstTargetValue = 0.1f;
float secondTargetValue=1.4f;
UnityAction startUserOver;//开始使用完成
UnityAction stopUserOver;//结束使用完成
Collider[] thisColliders;
protected override void Awake()
{
base.Awake();
vRTK_Interactable.touchHighlightColor = Color.yellow;
vRTK_Interactable.touchHighlightColor.a = 0.4f;
InitEvent();
onFixedPos = false;
SetUseInteractable(false);
thisColliders = this.GetComponents<Collider>();
//SetRightPos(new Vector3(-1.329f,0.197f,0),0.1f);
}
private void SetUseInteractable(bool v)
{
vRTK_Interactable.isUsable = v;
}
void InitEvent()
{
//transform_rootrod = this.transform.FindChildTrans("Transform_RootRod").GetComponent<Transform>();
transform_firstrod = this.transform.FindChildTrans("Transform_FirstRod").GetComponent<Transform>();
transform_secondrod = this.transform.FindChildTrans("Transform_SecondRod").GetComponent<Transform>();
collisionctrl_dingban = this.GetComponent<CollisionCtrl>();
collisionctrl_dingban.AddCollisionChangedEvent(CollisionEvent);
vRTK_Interactable.InteractableObjectUsed += StartUsing;
}
//顶起车辆时 禁用抓取状态
private void CollisionEvent(CollisionEnum arg0, Collision arg1)
{
//在工作位置顶起了一个质量较大的物体 禁用抓取状态
if (onFixedPos && arg1.gameObject.GetComponent<Rigidbody>()?.mass > 500)
{
switch (arg0)
{
case CollisionEnum.enter:
SetGrabInteractable(false);
break;
case CollisionEnum.exit:
SetGrabInteractable(true);
break;
default:
break;
}
}
}
//根据当前流程 确定Using执行逻辑
public void StartUsing(object sender, InteractableObjectEventArgs e)
{
SetUseInteractable(false);//执行过程 先关闭 避免再次触发
if (currentProcess == ProcessEnum.teardown)
Open();
else if(currentProcess== ProcessEnum.assemble)
Close();
}
//被抓取时 禁用use
protected override void OnGrabbed(object sender, InteractableObjectEventArgs e)
{
base.OnGrabbed(sender, e);
for (int i = 0; i < thisColliders.Length; i++)
{
thisColliders[i].isTrigger = true;
}
SetUseInteractable(false);
}
protected override void Ungrabbed(object sender, InteractableObjectEventArgs e)
{
base.Ungrabbed(sender, e);
for (int i = 0; i < thisColliders.Length; i++)
{
thisColliders[i].isTrigger = false;
}
}
//完成归位 启用交互逻辑
protected override void HomgingOver()
{
base.HomgingOver();
SetUseInteractable(true);
}
//撑开
private void Open()
{
currentChangeDir = 1;
}
//缩回
private void Close()
{
currentChangeDir = -1;
}
protected void FixedUpdate()
{
if (currentChangeDir != 0)
{
ChangeLength(currentChangeDir);
}
if (Input.GetKeyDown(KeyCode.Space))
{
Open();
}
if (Input.GetKeyDown(KeyCode.A))
{
Close();
}
}
private void ChangeLength(float dir)
{
if (dir > 0)
{
HoistUp(dir);
}
else
{
ComeDown(dir);
}
}
//升起
private void HoistUp(float upDir)
{
if (transform_firstrod.localPosition.z < firstTargetValue)
{
transform_firstrod.localPosition += new Vector3(0, 0, upDir) * Time.fixedDeltaTime * changeSpeed;
}
else if (transform_secondrod!=null&&transform_secondrod.localPosition.z < secondTargetValue)
{
transform_secondrod.localPosition += new Vector3(0, 0, upDir) * Time.fixedDeltaTime * changeSpeed;
}
else//到达目标长度 顶起了装备
{
currentChangeDir = 0;
startUserOver?.Invoke();
}
}
//降下
private void ComeDown(float downDir)
{
if (transform_firstrod.localPosition.z > -0.03f)
{
transform_firstrod.localPosition += new Vector3(0, 0, downDir) * Time.fixedDeltaTime * changeSpeed;
}
else if (transform_secondrod != null && transform_secondrod.localPosition.z > 0.44f)
{
transform_secondrod.localPosition += new Vector3(0, 0, downDir) * Time.fixedDeltaTime * changeSpeed;
}
else//到达目标长度
{
currentChangeDir = 0;
stopUserOver?.Invoke();
SetGrabInteractable(true);//降下之后启用抓取逻辑
}
}
//激活操作 注册操作完成事件
public override void Active(ProcessEnum stepName, UnityAction finishedEvent)
{
vRTK_Interactable.usingState = 0;
currentProcess = stepName;
if (stepName == ProcessEnum.assemble)//组装流程时
{
SetUseInteractable(true);//启用升降逻辑
atFreePos = finishedEvent;//移除特定位置时认为操作完成
}
else if(stepName == ProcessEnum.teardown)//拆卸流程时
{
SetGrabInteractable(true);//启用抓取逻辑
startUserOver = finishedEvent;//升起完成后 视为流程完成
}
}
//退出激活状态
public override void UnActive(ProcessEnum stepName)
{
base.UnActive(stepName);
SetGrabInteractable(false);
SetUseInteractable(false);
startUserOver = null;
}
}