public static MotionTestResult TestMotion(
        this Collider2D collider,
        Vector2 motion,
        float margin = 0f)
    {
        var collisionBox = collider.GetCollisionBox();

        var raycastHit2d = Physics2D.BoxCast(
            origin: collisionBox.center,
            size: collisionBox.size,
            angle: 0,
            direction: motion.normalized,
            distance: motion.magnitude
            );

        if (raycastHit2d)
        {
            var collision2d = new ByteBrosCollision2D {
                Owner    = collider,
                Target   = raycastHit2d.collider,
                Position = raycastHit2d.point,
                Normal   = raycastHit2d.normal,
                Distance = raycastHit2d.distance
            };

            return(new MotionTestResult {
                HasCollision = true,
                Collision = collision2d,
                Direction = motion.normalized,
                Distance = raycastHit2d.distance - margin,
                Remainder = motion.magnitude - raycastHit2d.distance + margin
            });
        }

        return(new MotionTestResult {
            HasCollision = false,
            Collision = null,
            Direction = motion.normalized,
            Distance = motion.magnitude,
            Remainder = 0f
        });
    }
 private void OnWallRightCollision(ByteBrosCollision2D collision)
 {
     _wallRightContactNormal = collision.Normal.normalized;
     WallRight.FutureOn      = true;
 }
 private void OnGroundCollision(ByteBrosCollision2D collision)
 {
     _groundContactNormal += collision.Normal.normalized;
     Ground.FutureOn       = true;
 }
Beispiel #4
0
 public void OnCollisionNext(ByteBrosCollision2D collision)
 {
     _onCollision.OnNext(collision);
 }
 public static bool IsGroundCollision(
     this ByteBrosCollision2D collision,
     float maxAngle)
 {
     return(collision.Normal.WithinDegrees(Vector2.up, maxAngle));
 }
 public static bool IsWallRightCollision(
     this ByteBrosCollision2D collision,
     float maxAngle)
 {
     return(collision.Normal.WithinDegrees(Vector2.left, maxAngle));
 }