95 lines
2.3 KiB
C#
95 lines
2.3 KiB
C#
|
using UnityEngine;
|
||
|
|
||
|
namespace RoR2;
|
||
|
|
||
|
public class IKTargetPassive : MonoBehaviour, IIKTargetBehavior
|
||
|
{
|
||
|
private float smoothedTargetHeightOffset;
|
||
|
|
||
|
private float targetHeightOffset;
|
||
|
|
||
|
private float smoothdampVelocity;
|
||
|
|
||
|
public float minHeight = -0.3f;
|
||
|
|
||
|
public float maxHeight = 1f;
|
||
|
|
||
|
public float dampTime = 0.1f;
|
||
|
|
||
|
public float baseOffset;
|
||
|
|
||
|
[Tooltip("The IK weight float parameter if used")]
|
||
|
public string animatorIKWeightFloat = "";
|
||
|
|
||
|
public Animator animator;
|
||
|
|
||
|
[Tooltip("The target transform will plant without any calls from external IK chains")]
|
||
|
public bool selfPlant;
|
||
|
|
||
|
public float selfPlantFrequency = 5f;
|
||
|
|
||
|
[Tooltip("Whether or not to cache where the raycast begins. Used when not attached to bones, who reset themselves via animator.")]
|
||
|
public bool cacheFirstPosition;
|
||
|
|
||
|
private Vector3 cachedLocalPosition;
|
||
|
|
||
|
private float selfPlantTimer;
|
||
|
|
||
|
public void UpdateIKState(int targetState)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
private void Awake()
|
||
|
{
|
||
|
if (cacheFirstPosition)
|
||
|
{
|
||
|
cachedLocalPosition = base.transform.localPosition;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void LateUpdate()
|
||
|
{
|
||
|
selfPlantTimer -= Time.deltaTime;
|
||
|
if (selfPlant && selfPlantTimer <= 0f)
|
||
|
{
|
||
|
selfPlantTimer = 1f / selfPlantFrequency;
|
||
|
UpdateIKTargetPosition();
|
||
|
}
|
||
|
UpdateYOffset();
|
||
|
}
|
||
|
|
||
|
public void UpdateIKTargetPosition()
|
||
|
{
|
||
|
ResetTransformToCachedPosition();
|
||
|
if (Physics.Raycast(base.transform.position + Vector3.up * (0f - minHeight), Vector3.down, out var hitInfo, maxHeight - minHeight, LayerIndex.world.mask))
|
||
|
{
|
||
|
targetHeightOffset = hitInfo.point.y - base.transform.position.y;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
targetHeightOffset = 0f;
|
||
|
}
|
||
|
targetHeightOffset += baseOffset;
|
||
|
}
|
||
|
|
||
|
public void UpdateYOffset()
|
||
|
{
|
||
|
float t = 1f;
|
||
|
if ((bool)animator && animatorIKWeightFloat.Length > 0)
|
||
|
{
|
||
|
t = animator.GetFloat(animatorIKWeightFloat);
|
||
|
}
|
||
|
smoothedTargetHeightOffset = Mathf.SmoothDamp(smoothedTargetHeightOffset, targetHeightOffset, ref smoothdampVelocity, dampTime, float.PositiveInfinity, Time.deltaTime);
|
||
|
ResetTransformToCachedPosition();
|
||
|
base.transform.position = new Vector3(base.transform.position.x, base.transform.position.y + Mathf.Lerp(0f, smoothedTargetHeightOffset, t), base.transform.position.z);
|
||
|
}
|
||
|
|
||
|
private void ResetTransformToCachedPosition()
|
||
|
{
|
||
|
if (cacheFirstPosition)
|
||
|
{
|
||
|
base.transform.localPosition = new Vector3(cachedLocalPosition.x, cachedLocalPosition.y, cachedLocalPosition.z);
|
||
|
}
|
||
|
}
|
||
|
}
|