unityzgy/.svn/pristine/10/101e5055857f110901ef179c9e677d43b66140c7.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

149 lines
4.0 KiB
Plaintext

//======= Copyright (c) Valve Corporation, All rights reserved. ===============
//
// Purpose: Drives a linear mapping based on position between 2 positions
//
//=============================================================================
using UnityEngine;
using System.Collections;
namespace Valve.VR.InteractionSystem
{
//-------------------------------------------------------------------------
[RequireComponent( typeof( Interactable ) )]
public class LinearDrive : MonoBehaviour
{
public Transform startPosition;
public Transform endPosition;
public LinearMapping linearMapping;
public bool repositionGameObject = true;
public bool maintainMomemntum = true;
public float momemtumDampenRate = 5.0f;
private float initialMappingOffset;
private int numMappingChangeSamples = 5;
private float[] mappingChangeSamples;
private float prevMapping = 0.0f;
private float mappingChangeRate;
private int sampleCount = 0;
//-------------------------------------------------
void Awake()
{
mappingChangeSamples = new float[numMappingChangeSamples];
}
//-------------------------------------------------
void Start()
{
if ( linearMapping == null )
{
linearMapping = GetComponent<LinearMapping>();
}
if ( linearMapping == null )
{
linearMapping = gameObject.AddComponent<LinearMapping>();
}
initialMappingOffset = linearMapping.value;
if ( repositionGameObject )
{
UpdateLinearMapping( transform );
}
}
//-------------------------------------------------
private void HandHoverUpdate( Hand hand )
{
if ( hand.GetStandardInteractionButtonDown() )
{
hand.HoverLock( GetComponent<Interactable>() );
initialMappingOffset = linearMapping.value - CalculateLinearMapping( hand.transform );
sampleCount = 0;
mappingChangeRate = 0.0f;
}
if ( hand.GetStandardInteractionButtonUp() )
{
hand.HoverUnlock( GetComponent<Interactable>() );
CalculateMappingChangeRate();
}
if ( hand.GetStandardInteractionButton() )
{
UpdateLinearMapping( hand.transform );
}
}
//-------------------------------------------------
private void CalculateMappingChangeRate()
{
//Compute the mapping change rate
mappingChangeRate = 0.0f;
int mappingSamplesCount = Mathf.Min( sampleCount, mappingChangeSamples.Length );
if ( mappingSamplesCount != 0 )
{
for ( int i = 0; i < mappingSamplesCount; ++i )
{
mappingChangeRate += mappingChangeSamples[i];
}
mappingChangeRate /= mappingSamplesCount;
}
}
//-------------------------------------------------
private void UpdateLinearMapping( Transform tr )
{
prevMapping = linearMapping.value;
linearMapping.value = Mathf.Clamp01( initialMappingOffset + CalculateLinearMapping( tr ) );
mappingChangeSamples[sampleCount % mappingChangeSamples.Length] = ( 1.0f / Time.deltaTime ) * ( linearMapping.value - prevMapping );
sampleCount++;
if ( repositionGameObject )
{
transform.position = Vector3.Lerp( startPosition.position, endPosition.position, linearMapping.value );
}
}
//-------------------------------------------------
private float CalculateLinearMapping( Transform tr )
{
Vector3 direction = endPosition.position - startPosition.position;
float length = direction.magnitude;
direction.Normalize();
Vector3 displacement = tr.position - startPosition.position;
return Vector3.Dot( displacement, direction ) / length;
}
//-------------------------------------------------
void Update()
{
if ( maintainMomemntum && mappingChangeRate != 0.0f )
{
//Dampen the mapping change rate and apply it to the mapping
mappingChangeRate = Mathf.Lerp( mappingChangeRate, 0.0f, momemtumDampenRate * Time.deltaTime );
linearMapping.value = Mathf.Clamp01( linearMapping.value + ( mappingChangeRate * Time.deltaTime ) );
if ( repositionGameObject )
{
transform.position = Vector3.Lerp( startPosition.position, endPosition.position, linearMapping.value );
}
}
}
}
}