Esempio n. 1
0
    private Vector2 SetVelocityBasedOnCollisionType(CollisionType colType, CollisionSide colSide, ICollider collidingObject, float endSpeed, Vector2 actualVelocity)
    {
        switch (colType)
        {
        case CollisionType.Frame:
        case CollisionType.Enemy:
            return(SetVelocity(colSide, endSpeed, LastFrameVelocity));

        case CollisionType.Ship:
            return(SetVelocity(colSide, endSpeed, actualVelocity));

        case CollisionType.StrikerLeft:
        case CollisionType.StrikerRight:
            Striker striker = collidingObject as Striker;
            Vector2 vel     = striker.GetForceOnBallHit(this, colSide);
            Rigidbody.velocity = vel;
            return(vel);

        default:
            return(Vector2.zero);
        }
    }
Esempio n. 2
0
    public List <IRayCollider> HandleCollision(List <IRayCollider> collidersToSkip)
    {
        if (skipOneFrameFromCollisionSystem)
        {
            return(new List <IRayCollider>());
        }
        List <IRayCollider> collidedWith = new List <IRayCollider>();

        Vector2 direction      = currentCenterPoint - LastFrameCenterPoint;
        float   distanceForRay = direction.magnitude;
        float   radius         = Collider.radius / 2;

        int safe = 0;

        while (rayHits.Length > 0 && distanceForRay > 0)
        {
            rayHits.SortByLength();
            if (rayHits.Length > 1)
            {
                for (int i = 0; i < rayHits.Length; i++)
                {
                    //Debug.LogWarningFormat("[{0}] point: {1} centroid: {2} length: {3}", i, rayHits[i].point, rayHits[i].centroid, rayHits[i].distance);
                }
            }
            RaycastHit2D  rayHit  = rayHits[0];
            CollisionSide colSide = CollisionSide.Bottom;
            if (rayHit.collider.CompareTag(GameTags.Frame))
            {
                FrameCollider frameCollider = rayHit.collider.GetComponent <FrameCollider>();
                IRayCollider  col           = frameCollider as IRayCollider;
                if (!collidersToSkip.Contains(col))
                {
                    if (frameCollider.DestroyBallAndProjectiles)
                    {
                        GameController.Instance.RemoveBallFromPlay(this);
                    }
                    else
                    {
                        colSide = frameCollider.CollisionSide;
                        OnCollision(this, rayHit, colSide, CollisionType.Frame, defaultToTotalDistance, LastFrameVelocity.magnitude, safe, frameCollider, out distanceForRay);
                    }

                    if (!collidedWith.Contains(col))
                    {
                        collidedWith.Add(col);
                    }
                }
            }
            else if (rayHit.collider.CompareTag(GameTags.Enemy))
            {
                // Debug.DrawLine(currentCenterPoint, LastFrameCenterPoint, Color.green, 2);
                EnemyBase    enemy = rayHit.collider.GetComponent <EnemyBase>();
                IRayCollider col   = enemy as IRayCollider;

                if (!collidersToSkip.Contains(col))
                {
                    colSide = CollisionSideDetect.GetCollisionSide(rayHit.centroid, rayHit.point);
                    OnCollision(this, rayHit, colSide, CollisionType.Enemy, defaultToTotalDistance, PhysicsConstants.BallSpeedAfterEnemyHit, safe, enemy, out distanceForRay);
                    enemy.OnCollisionWithBall(this);
                    if (!collidedWith.Contains(col))
                    {
                        collidedWith.Add(col);
                    }
                }
            }
            else if (rayHit.collider.CompareTag(GameTags.Ship))
            {
                ShipCollider ship = rayHit.collider.GetComponent <ShipCollider>();
                IRayCollider col  = ship as IRayCollider;
                if (!collidersToSkip.Contains(col))
                {
                    colSide = ship.GetCollisionSideWithBall(this, LastFrameCenterPoint);
                    OnCollision(this, rayHit, colSide, CollisionType.Ship, defaultToTotalDistance, PhysicsConstants.BallSpeedAfterShipHit, safe, ship, out distanceForRay);
                }

                if (!collidedWith.Contains(col))
                {
                    collidedWith.Add(col);
                }
            }
            else if (rayHit.collider.CompareTag(GameTags.Striker))
            {
                Striker      striker = rayHit.collider.GetComponent <Striker>();
                IRayCollider col     = striker as IRayCollider;
                if (!collidersToSkip.Contains(col))
                {
                    colSide = striker.GetCollisionSideWithBall(LastFrameCenterPoint);
                    OnCollision(this, rayHit, colSide, striker.CollisionType, defaultToTotalDistance, striker.GetForceOnBallHit(this, colSide).magnitude, safe, striker, out distanceForRay);
                }

                if (!collidedWith.Contains(col))
                {
                    collidedWith.Add(col);
                }
            }

            //Debug.LogFormat("{0} collision with {1} on side {2}", safe, rayHit.collider.gameObject.name, colSide);

            safe++;
        }

        return(collidedWith);
    }
Esempio n. 3
0
    private Vector2 GetPositionOnStrikerHit(CollisionSide colSide, ICollider collidingObject, Vector2 centroidPoint, Vector2 velocity, float distanceAfterHit)
    {
        Striker striker = collidingObject as Striker;

        return(centroidPoint + striker.GetForceOnBallHit(this, colSide).normalized *distanceAfterHit);
    }