You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
4.1 KiB
C#

using UnityEngine;
namespace Fusion.Addons.SimpleKCC
{
internal static class GroundSnapProcessor
{
private static KCCOverlapInfo _overlapInfo = new KCCOverlapInfo();
public static void AfterMoveStep(KCC kcc, KCCData data, KCCOverlapInfo baseOverlapInfo)
{
if (kcc.Settings.SnapDistance <= 0f || data.IsGrounded || !data.WasGrounded || data.JumpFrames > 0 || data.IsSteppingUp || data.WasSteppingUp || data.DynamicVelocity.y > 0f)
{
return;
}
float snapDistance = kcc.Settings.SnapDistance;
float num = kcc.Settings.Radius * 0.25f;
int num2 = Mathf.CeilToInt(snapDistance / num);
float num3 = snapDistance / (float)num2;
kcc.CapsuleOverlap(_overlapInfo, data.TargetPosition - new Vector3(0f, kcc.Settings.SnapDistance, 0f), kcc.Settings.Radius, kcc.Settings.Height + kcc.Settings.SnapDistance, QueryTriggerInteraction.Ignore);
if (_overlapInfo.ColliderHitCount == 0)
{
return;
}
Vector3 vector = data.TargetPosition;
Vector3 vector2 = new Vector3(0f, 0f - num3, 0f);
for (int i = 0; i < num2; i++)
{
vector = kcc.ResolvePenetration(_overlapInfo, data, vector, vector + vector2, probeGrounding: false, 0, 0, resolveTriggers: false);
if (data.IsGrounded)
{
float num4 = kcc.Settings.SnapSpeed * data.UpdateDeltaTime;
Vector3 vector3 = vector - data.TargetPosition;
if (!data.WasSnappingToGround)
{
num4 *= 0.5f;
}
Vector3 vector4 = (data.TargetPosition = ((!(vector3.sqrMagnitude <= num4 * num4)) ? (data.TargetPosition + vector3.normalized * num4) : vector));
data.GroundDistance = Mathf.Max(0f, vector4.y - vector.y);
data.IsSnappingToGround = true;
kcc.UpdateHits(baseOverlapInfo, EKCCHitsOverlapQuery.Default);
break;
}
}
}
public static void AfterMoveStep(KCCOffline kcc, KCCData data, KCCOverlapInfo baseOverlapInfo)
{
if (kcc.Settings.SnapDistance <= 0f || data.IsGrounded || !data.WasGrounded || data.JumpFrames > 0 || data.IsSteppingUp || data.WasSteppingUp || data.DynamicVelocity.y > 0f)
{
return;
}
float snapDistance = kcc.Settings.SnapDistance;
float num = kcc.Settings.Radius * 0.25f;
int num2 = Mathf.CeilToInt(snapDistance / num);
float num3 = snapDistance / (float)num2;
kcc.CapsuleOverlap(_overlapInfo, data.TargetPosition - new Vector3(0f, kcc.Settings.SnapDistance, 0f), kcc.Settings.Radius, kcc.Settings.Height + kcc.Settings.SnapDistance, QueryTriggerInteraction.Ignore);
if (_overlapInfo.ColliderHitCount == 0)
{
return;
}
Vector3 vector = data.TargetPosition;
Vector3 vector2 = new Vector3(0f, 0f - num3, 0f);
for (int i = 0; i < num2; i++)
{
vector = kcc.ResolvePenetration(_overlapInfo, data, vector, vector + vector2, probeGrounding: false, 0, 0, resolveTriggers: false);
if (data.IsGrounded)
{
float num4 = kcc.Settings.SnapSpeed * data.UpdateDeltaTime;
Vector3 vector3 = vector - data.TargetPosition;
if (!data.WasSnappingToGround)
{
num4 *= 0.5f;
}
Vector3 vector4 = (data.TargetPosition = ((!(vector3.sqrMagnitude <= num4 * num4)) ? (data.TargetPosition + vector3.normalized * num4) : vector));
data.GroundDistance = Mathf.Max(0f, vector4.y - vector.y);
data.IsSnappingToGround = true;
kcc.UpdateHits(baseOverlapInfo, EKCCHitsOverlapQuery.Default);
break;
}
}
}
}
}