streamingle-unity-utilities/Runtime/Constraints/LerpPositionConstraint.cs

55 lines
1.8 KiB
C#

using UnityEngine;
using UnityEngine.Scripting.APIUpdating;
namespace Streamingle.Utils.LerpConstraints
{
[MovedFrom(true, "Streamingle.Utils.RoughConstraints", "Assembly-CSharp", "RoughPositionConstraint")]
[ExecuteAlways]
[AddComponentMenu("Streamingle Utilities/Constraints/Lerp Position Constraint")]
public class LerpPositionConstraint : LerpConstraintBase
{
[Header("Position")]
public Vector3Bool constrainedAxis = Vector3Bool.All;
public Vector3 positionOffset;
public bool offsetInSourceSpace = true;
protected override void ExecuteConstraint(float followT)
{
if (!TryGetWeightedPosition(out var targetPosition))
{
return;
}
if (offsetInSourceSpace && sources.Count > 0 && sources[0].sourceTransform != null)
{
targetPosition += sources[0].sourceTransform.TransformVector(positionOffset);
}
else
{
targetPosition += positionOffset;
}
targetPosition = ApplyAxisMask(transform.position, targetPosition, constrainedAxis);
transform.position = Vector3.Lerp(transform.position, targetPosition, followT * weight);
}
protected override void CaptureOffsetsFromCurrentPose()
{
if (!TryGetWeightedPosition(out var sourcePosition))
{
return;
}
var delta = transform.position - sourcePosition;
if (offsetInSourceSpace && sources.Count > 0 && sources[0].sourceTransform != null)
{
positionOffset = sources[0].sourceTransform.InverseTransformVector(delta);
}
else
{
positionOffset = delta;
}
}
}
}