unityzgy/.svn/pristine/e0/e06fffde979bf71d313d4576439fdc6efbaa2707.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

84 lines
2.1 KiB
Plaintext

//======= Copyright (c) Valve Corporation, All rights reserved. ===============
//
// Purpose: Triggers haptic pulses based on a linear mapping
//
//=============================================================================
using UnityEngine;
using UnityEngine.Events;
using System.Collections;
namespace Valve.VR.InteractionSystem
{
//-------------------------------------------------------------------------
[RequireComponent( typeof( Interactable ) )]
public class HapticRack : MonoBehaviour
{
[Tooltip( "The linear mapping driving the haptic rack" )]
public LinearMapping linearMapping;
[Tooltip( "The number of haptic pulses evenly distributed along the mapping" )]
public int teethCount = 128;
[Tooltip( "Minimum duration of the haptic pulse" )]
public int minimumPulseDuration = 500;
[Tooltip( "Maximum duration of the haptic pulse" )]
public int maximumPulseDuration = 900;
[Tooltip( "This event is triggered every time a haptic pulse is made" )]
public UnityEvent onPulse;
private Hand hand;
private int previousToothIndex = -1;
//-------------------------------------------------
void Awake()
{
if ( linearMapping == null )
{
linearMapping = GetComponent<LinearMapping>();
}
}
//-------------------------------------------------
private void OnHandHoverBegin( Hand hand )
{
this.hand = hand;
}
//-------------------------------------------------
private void OnHandHoverEnd( Hand hand )
{
this.hand = null;
}
//-------------------------------------------------
void Update()
{
int currentToothIndex = Mathf.RoundToInt( linearMapping.value * teethCount - 0.5f );
if ( currentToothIndex != previousToothIndex )
{
Pulse();
previousToothIndex = currentToothIndex;
}
}
//-------------------------------------------------
private void Pulse()
{
if ( hand && ( hand.controller != null ) && ( hand.GetStandardInteractionButton() ) )
{
ushort duration = (ushort)Random.Range( minimumPulseDuration, maximumPulseDuration + 1 );
hand.controller.TriggerHapticPulse( duration );
onPulse.Invoke();
}
}
}
}