bool SlopeLimit()
{
Vector3 n = currentGround.PrimaryNormal();
float a = Vector3.Angle(n, up);
if (a > currentGround.superCollisionType.SlopeLimit)
{
Vector3 absoluteMoveDirection = Math3d.ProjectVectorOnPlane(n, transform.position - initialPosition);
// Retrieve a vector pointing down the slope
Vector3 r = Vector3.Cross(n, down);
Vector3 v = Vector3.Cross(r, n);
float angle = Vector3.Angle(absoluteMoveDirection, v);
if (angle <= 90.0f)
return false;
// Calculate where to place the controller on the slope, or at the bottom, based on the desired movement distance
Vector3 resolvedPosition = Math3d.ProjectPointOnLine(initialPosition, r, transform.position);
Vector3 direction = Math3d.ProjectVectorOnPlane(n, resolvedPosition - transform.position);
RaycastHit hit;
// Check if our path to our resolved position is blocked by any colliders
if (Physics.CapsuleCast(SpherePosition(feet), SpherePosition(head), radius, direction.normalized, out hit, direction.magnitude, Walkable, triggerInteraction))
{
transform.position += v.normalized * hit.distance;
}
else
{
transform.position += direction;
}
return true;
}
return false;
}