55 lines
1.5 KiB
C#
55 lines
1.5 KiB
C#
|
using UnityEngine;
|
||
|
|
||
|
namespace RoR2.Mecanim;
|
||
|
|
||
|
public class CrouchMecanim : MonoBehaviour
|
||
|
{
|
||
|
public float duckHeight;
|
||
|
|
||
|
public Animator animator;
|
||
|
|
||
|
public float smoothdamp;
|
||
|
|
||
|
public float initialVerticalOffset;
|
||
|
|
||
|
public Transform crouchOriginOverride;
|
||
|
|
||
|
private float crouchCycle;
|
||
|
|
||
|
private const float crouchRaycastFrequency = 2f;
|
||
|
|
||
|
private float crouchStopwatch;
|
||
|
|
||
|
private static readonly int crouchCycleOffsetParamNameHash = Animator.StringToHash("crouchCycleOffset");
|
||
|
|
||
|
private void FixedUpdate()
|
||
|
{
|
||
|
crouchStopwatch -= Time.fixedDeltaTime;
|
||
|
if (crouchStopwatch <= 0f)
|
||
|
{
|
||
|
crouchStopwatch = 0.5f;
|
||
|
Transform transform = (crouchOriginOverride ? crouchOriginOverride : base.transform);
|
||
|
Vector3 up = transform.up;
|
||
|
RaycastHit hitInfo;
|
||
|
bool flag = Physics.Raycast(new Ray(transform.position - up * initialVerticalOffset, up), out hitInfo, duckHeight + initialVerticalOffset, LayerIndex.world.mask, QueryTriggerInteraction.Ignore);
|
||
|
crouchCycle = (flag ? Mathf.Clamp01(1f - (hitInfo.distance - initialVerticalOffset) / duckHeight) : 0f);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void Update()
|
||
|
{
|
||
|
if ((bool)animator)
|
||
|
{
|
||
|
animator.SetFloat(crouchCycleOffsetParamNameHash, crouchCycle, smoothdamp, Time.deltaTime);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void OnDrawGizmos()
|
||
|
{
|
||
|
Gizmos.color = Color.yellow;
|
||
|
Gizmos.DrawLine(base.transform.position, base.transform.position + base.transform.up * duckHeight);
|
||
|
Gizmos.color = Color.red;
|
||
|
Gizmos.DrawLine(base.transform.position, base.transform.position + -base.transform.up * initialVerticalOffset);
|
||
|
}
|
||
|
}
|