12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- using UnityEngine;
- using System.Collections;
- using RootMotion;
- namespace RootMotion.FinalIK {
- public partial class Grounding {
- /// <summary>
- /// The %Grounding %Pelvis.
- /// </summary>
- public class Pelvis {
-
- /// <summary>
- /// Offset of the pelvis as a Vector3.
- /// </summary>
- public Vector3 IKOffset { get; private set; }
- /// <summary>
- /// Scalar vertical offset of the pelvis.
- /// </summary>
- public float heightOffset { get; private set; }
- private Grounding grounding;
- private Vector3 lastRootPosition;
- private float damperF;
- private bool initiated;
- private float lastTime;
- // Initiating the pelvis
- public void Initiate(Grounding grounding) {
- this.grounding = grounding;
-
- initiated = true;
- OnEnable();
- }
- // Set everything to 0
- public void Reset() {
- this.lastRootPosition = grounding.root.transform.position;
- lastTime = Time.deltaTime;
- IKOffset = Vector3.zero;
- heightOffset = 0f;
- }
-
- // Should be called each time the pelvis is (re)activated
- public void OnEnable() {
- if (!initiated) return;
- this.lastRootPosition = grounding.root.transform.position;
- lastTime = Time.time;
- }
-
- // Updates the pelvis position offset
- public void Process(float lowestOffset, float highestOffset, bool isGrounded) {
- if (!initiated) return;
- float deltaTime = Time.time - lastTime;
- lastTime = Time.time;
- if (deltaTime <= 0f) return;
-
- float offsetTarget = lowestOffset + highestOffset;
- if (!grounding.rootGrounded) offsetTarget = 0f;
-
- // Interpolating the offset
- heightOffset = Mathf.Lerp(heightOffset, offsetTarget, deltaTime * grounding.pelvisSpeed);
- // Damper
- Vector3 rootDelta = (grounding.root.position - lastRootPosition);
- lastRootPosition = grounding.root.position;
-
- // Fading out damper when ungrounded
- damperF = Interp.LerpValue(damperF, isGrounded? 1f: 0f, 1f, 10f);
-
- // Calculating the final damper
- heightOffset -= grounding.GetVerticalOffset(rootDelta, Vector3.zero) * grounding.pelvisDamper * damperF;
- // Update IK value
- IKOffset = grounding.up * heightOffset;
- }
- }
- }
- }
|