Ejemplo n.º 1
0
        void HorizontalCollisions(ref Vector3 velocity)
        {
            float directionX = Mathf.Sign(velocity.x);
            float rayLength  = Mathf.Abs(velocity.x) + SkinWidth;

            for (int i = 0; i < HorizontalRayCount; i++)
            {
                Vector2 rayOrigin = (directionX == -1) ? raycastOrigins.bottomLeft : raycastOrigins.bottomRight;
                rayOrigin += Vector2.up * (_horizontalRaySpacing * i);
                RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.right * directionX, rayLength, CollisionMask);

                Debug.DrawRay(rayOrigin, Vector2.right * directionX * rayLength, Color.red);

                if (hit)
                {
                    float slopeAngle = Vector2.Angle(hit.normal, Vector2.up);


                    if (i == 0 && slopeAngle <= MaxClimbAngle)
                    {
                        if (collisions.descendingSlope)
                        {
                            collisions.descendingSlope = false;
                            velocity = collisions.velocityOld;
                        }
                        float distanceToSlopeStart = 0;
                        if (slopeAngle != collisions.slopeAngleOld)
                        {
                            distanceToSlopeStart = hit.distance - SkinWidth;
                            velocity.x           = distanceToSlopeStart * directionX;
                        }
                        ClimbSlope(ref velocity, slopeAngle);
                        velocity.x += distanceToSlopeStart * directionX;
                    }

                    if (!collisions.climbingSlope || slopeAngle > MaxClimbAngle)
                    {
                        movement.HoldLeftWall(directionX);
                        velocity.x = (hit.distance - SkinWidth) * directionX;
                        rayLength  = hit.distance;

                        if (collisions.climbingSlope)
                        {
                            velocity.y = Mathf.Tan(collisions.slopeAngle * Mathf.Deg2Rad) * Mathf.Abs(velocity.x);
                        }

                        collisions.left  = directionX == -1;
                        collisions.right = directionX == 1;
                    }
                    ////////////////////////////////////////
                    if (!collisions.climbingSlope && !collisions.descendingSlope)
                    {
                        if (movement.climbKeyOn && slopeAngle < MaxWallClimbAngle && slopeAngle > MaxClimbAngle)
                        {
                            if (!movement.climbUp && !movement.climbDown)
                            {
                                velocity.y = 0;
                            }

                            movement.isClimbing = true;
                        }
                        else
                        {
                            movement.isClimbing = false;
                        }
                    }
                    else
                    {
                        movement.isClimbing = false;
                    }
                    ////////////////////////////////////////
                }
            }
        }