Files
2026-03-04 09:37:33 +08:00

46 lines
1.2 KiB
C#

using UnityEngine;
namespace RootMotion.FinalIK
{
public class CCDStretch : MonoBehaviour
{
public CCDIK ik;
[Range(0f, 0.999f)]
public float maxSquash;
public float maxStretch = 2f;
private Vector3[] defaultLocalPositions = new Vector3[0];
private void Start()
{
defaultLocalPositions = new Vector3[ik.solver.bones.Length - 1];
for (int i = 1; i < ik.solver.bones.Length; i++)
{
defaultLocalPositions[i - 1] = ik.solver.bones[i].transform.localPosition;
}
}
private void LateUpdate()
{
for (int i = 1; i < ik.solver.bones.Length; i++)
{
ik.solver.bones[i].transform.localPosition = defaultLocalPositions[i - 1];
}
float num = Vector3.Magnitude(((ik.solver.target != null) ? ik.solver.target.position : ik.solver.IKPosition) - ik.solver.bones[0].transform.position);
float num2 = 0f;
for (int j = 1; j < ik.solver.bones.Length; j++)
{
num2 += Vector3.Magnitude(ik.solver.bones[j].transform.position - ik.solver.bones[j - 1].transform.position);
}
maxStretch = Mathf.Max(maxStretch, 1f);
float num3 = Mathf.Clamp(num / num2, 1f - maxSquash, maxStretch);
for (int k = 1; k < ik.solver.bones.Length; k++)
{
ik.solver.bones[k].transform.localPosition *= num3;
}
}
}
}