- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg) - LoginPanel: InputField placeholder本地化、字体颜色保持 - HistoryPanel: 用时数据本地化、placeholder本地化 - RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建) - AppraiseWindowBase: 评价等级本地化、操作消息重建 - EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized - StudentOperateRecorder: 新增InjectOperateMsgLocalized方法 - LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选 - 字体切换时保留颜色和verticalOverflow
109 lines
3.6 KiB
C#
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>();
|
|
}
|
|
}
|
|
} |