Files
Ultimate-Fishing-Simulator-…/Assets/Scripts/Assembly-CSharp/RootMotion/FinalIK/Inertia.cs
2026-03-04 09:37:33 +08:00

111 lines
2.6 KiB
C#

using System;
using UnityEngine;
namespace RootMotion.FinalIK
{
public class Inertia : OffsetModifier
{
[Serializable]
public class Body
{
[Serializable]
public class EffectorLink
{
[Tooltip("Type of the FBBIK effector to use")]
public FullBodyBipedEffector effector;
[Tooltip("Weight of using this effector")]
public float weight;
}
[Tooltip("The Transform to follow, can be any bone of the character")]
public Transform transform;
[Tooltip("Linking the body to effectors. One Body can be used to offset more than one effector")]
public EffectorLink[] effectorLinks;
[Tooltip("The speed to follow the Transform")]
public float speed = 10f;
[Tooltip("The acceleration, smaller values means lazyer following")]
public float acceleration = 3f;
[Tooltip("Matching target velocity")]
[Range(0f, 1f)]
public float matchVelocity;
[Tooltip("gravity applied to the Body")]
public float gravity;
private Vector3 delta;
private Vector3 lazyPoint;
private Vector3 direction;
private Vector3 lastPosition;
private bool firstUpdate = true;
public void Reset()
{
if (!(transform == null))
{
lazyPoint = transform.position;
lastPosition = transform.position;
direction = Vector3.zero;
}
}
public void Update(IKSolverFullBodyBiped solver, float weight, float deltaTime)
{
if (!(transform == null))
{
if (firstUpdate)
{
Reset();
firstUpdate = false;
}
direction = Vector3.Lerp(direction, (transform.position - lazyPoint) / deltaTime * 0.01f, deltaTime * acceleration);
lazyPoint += direction * deltaTime * speed;
delta = transform.position - lastPosition;
lazyPoint += delta * matchVelocity;
lazyPoint.y += gravity * deltaTime;
EffectorLink[] array = effectorLinks;
foreach (EffectorLink effectorLink in array)
{
solver.GetEffector(effectorLink.effector).positionOffset += (lazyPoint - transform.position) * effectorLink.weight * weight;
}
lastPosition = transform.position;
}
}
}
[Tooltip("The array of Bodies")]
public Body[] bodies;
[Tooltip("The array of OffsetLimits")]
public OffsetLimits[] limits;
public void ResetBodies()
{
lastTime = Time.time;
Body[] array = bodies;
for (int i = 0; i < array.Length; i++)
{
array[i].Reset();
}
}
protected override void OnModifyOffset()
{
Body[] array = bodies;
for (int i = 0; i < array.Length; i++)
{
array[i].Update(ik.solver, weight, base.deltaTime);
}
ApplyLimits(limits);
}
}
}