public static SplitPair Split(Vector2 original, CollisionEvent collision) { Vector2 second = Vector2.zero; CollisionAlignment alignment = CollisionAlignment.NoSplit; if (collision) { var angle = Vector2.SignedAngle(original, collision.normal); if (Mathf.Abs(angle) <= MinimumAngleOfReflection) { alignment = CollisionAlignment.Aligned; } else if (Mathf.Abs(angle) < MaximumAngleOfReflection) { alignment = CollisionAlignment.NonOpposed; } else { alignment = CollisionAlignment.Opposed; } Vector2 normPerp = Vector2.Perpendicular(collision.normal).normalized; if (angle < 0) { normPerp *= -1f; } second = (original * (1 - collision.percentToHit)).Project(normPerp); } return(new SplitPair(original * collision.percentToHit, second, alignment)); }
public SplitPair(Vector2 first, Vector2 second, CollisionAlignment alignment) { this.First = first; this.Second = second; this.Alignment = alignment; }