unityzgy/Assets/ThirdPackages/VRPackage/VRTK/Scripts/Utilities/ObjectFollow/VRTK_RigidbodyFollow.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

109 lines
3.6 KiB
C#

// Rigidbody Follow|Utilities|90061
namespace VRTK
{
using UnityEngine;
/// <summary>
/// Changes one game object's rigidbody to follow another game object's rigidbody.
/// </summary>
[AddComponentMenu("VRTK/Scripts/Utilities/Object Follow/VRTK_RigidbodyFollow")]
public class VRTK_RigidbodyFollow : VRTK_ObjectFollow
{
/// <summary>
/// Specifies how to position and rotate the rigidbody.
/// </summary>
/// <param name="Set">Use <see cref="Rigidbody.position"/> and <see cref="Rigidbody.rotation"/>.</param>
/// <param name="Move">Use <see cref="Rigidbody.MovePosition"/> and <see cref="Rigidbody.MoveRotation"/>.</param>
/// <param name="Add">Use <see cref="Rigidbody.AddForce(Vector3)"/> and <see cref="Rigidbody.AddTorque(Vector3)"/>.</param>
public enum MovementOption
{
Set,
Move,
Add
}
[Tooltip("Specifies how to position and rotate the rigidbody.")]
public MovementOption movementOption = MovementOption.Set;
protected Rigidbody rigidbodyToFollow;
protected Rigidbody rigidbodyToChange;
public override void Follow()
{
CacheRigidbodies();
base.Follow();
}
protected virtual void OnDisable()
{
rigidbodyToFollow = null;
rigidbodyToChange = null;
}
protected virtual void FixedUpdate()
{
Follow();
}
protected override Vector3 GetPositionToFollow()
{
return rigidbodyToFollow.position;
}
protected override void SetPositionOnGameObject(Vector3 newPosition)
{
switch (movementOption)
{
case MovementOption.Set:
rigidbodyToChange.position = newPosition;
break;
case MovementOption.Move:
rigidbodyToChange.MovePosition(newPosition);
break;
case MovementOption.Add:
// TODO: Test if this is correct
rigidbodyToChange.AddForce(newPosition - rigidbodyToChange.position);
break;
}
}
protected override Quaternion GetRotationToFollow()
{
return rigidbodyToFollow.rotation;
}
protected override void SetRotationOnGameObject(Quaternion newRotation)
{
switch (movementOption)
{
case MovementOption.Set:
rigidbodyToChange.rotation = newRotation;
break;
case MovementOption.Move:
rigidbodyToChange.MoveRotation(newRotation);
break;
case MovementOption.Add:
// TODO: Test if this is correct
rigidbodyToChange.AddTorque(newRotation * Quaternion.Inverse(rigidbodyToChange.rotation).eulerAngles);
break;
}
}
protected override Vector3 GetScaleToFollow()
{
return rigidbodyToFollow.transform.localScale;
}
protected virtual void CacheRigidbodies()
{
if (gameObjectToFollow == null || gameObjectToChange == null
|| (rigidbodyToFollow != null && rigidbodyToChange != null))
{
return;
}
rigidbodyToFollow = gameObjectToFollow.GetComponent<Rigidbody>();
rigidbodyToChange = gameObjectToChange.GetComponent<Rigidbody>();
}
}
}