void Start()
    {
        m_BoxCollider    = GetComponent <BoxCollider2D>();
        m_RaycastOrigins = new RaycastOrigins();

        CalculateRaySpacing();
    }
Пример #2
0
 // Use this for initialization
 void Start()
 {
     controller = GetComponent <Controller2D>();
     rb         = GetComponent <Rigidbody2D>();
     origins    = new RaycastOrigins();
     controller.status.facingDirection = 1;
 }
Пример #3
0
        protected override void OnUpdate()
        {
            float deltaTime = Time.deltaTime;

            foreach (CollisionFilter entity in GetEntities <CollisionFilter>())
            {
                Movement      movement      = entity.MovementComponent;
                Collision     collisionData = entity.CollisionComponent;
                BoxCollider2D collider      = entity.ColliderComponent;

                ResetCollisionState(collisionData);

                float2 movementDelta = movement.Value;

                RaycastOrigins rayOrigins = CalculateRaycastOrigins(collisionData, collider);
                float2         raySpacing = CalculateRaySpacing(collisionData, collider);

                if (movementDelta.x != 0)
                {
                    HandleHorizontalCollisions(ref movementDelta, collisionData, rayOrigins, raySpacing.x);
                }

                if (movementDelta.y != 0)
                {
                    HandleVerticalCollisions(ref movementDelta, collisionData, rayOrigins, raySpacing.y);
                }

                movement.Value = movementDelta;
            }
        }
Пример #4
0
 void Start()
 {
     controller        = GetComponent <Controller2D>();
     powerupController = GetComponent <PowerupController>();
     ball           = GameObject.FindGameObjectWithTag("Ball").GetComponent <Rigidbody2D>();
     raycastOrigins = new RaycastOrigins();
     seeker         = GetComponent <Seeker>();
 }
 public void CalculateBounds()
 {
     colliderBounds = col.bounds;
     colliderBounds.Expand(-skinWidth * 2);
     raycastOrigins             = new RaycastOrigins();
     raycastOrigins.topLeft     = new Vector2(colliderBounds.min.x, colliderBounds.max.y);
     raycastOrigins.topRight    = new Vector2(colliderBounds.max.x, colliderBounds.max.y);
     raycastOrigins.bottomLeft  = new Vector2(colliderBounds.min.x, colliderBounds.min.y);
     raycastOrigins.bottomRight = new Vector2(colliderBounds.max.x, colliderBounds.min.y);
 }
Пример #6
0
    public static void UpdateRayOrigins(BoxCollider2D collider, float inset, ref RaycastOrigins origins)
    {
        Bounds insetBounds = collider.bounds;

        insetBounds.Expand(-2f * inset);

        origins.topLeft     = new Vector2(insetBounds.min.x, insetBounds.max.y);
        origins.bottomLeft  = insetBounds.min;
        origins.bottomRight = new Vector2(insetBounds.max.x, insetBounds.min.y);
    }
Пример #7
0
    void UpdateRaycastPositions()
    {
        Bounds bounds = boxCollider.bounds;

        bounds.Expand(skinWidth * -2);

        origins             = new RaycastOrigins();
        origins.topleft     = new Vector2(bounds.min.x, bounds.min.y);
        origins.topright    = new Vector2(bounds.max.x, bounds.min.y);
        origins.bottomleft  = new Vector2(bounds.min.x, bounds.max.y);
        origins.bottomright = new Vector2(bounds.max.x, bounds.max.y);
    }
Пример #8
0
        private RaycastOrigins CalculateRaycastOrigins(Collision collisionData, BoxCollider2D collider)
        {
            Bounds bounds = collider.bounds;

            bounds.Expand(collisionData.SkinWidth * -2f);

            RaycastOrigins origins = new RaycastOrigins();

            origins.TopLeft     = new Vector2(bounds.min.x, bounds.max.y);
            origins.TopRight    = bounds.max;
            origins.BottomLeft  = bounds.min;
            origins.BottomRight = new Vector2(bounds.max.x, bounds.min.y);

            return(origins);
        }
Пример #9
0
        private void HandleVerticalCollisions(ref float2 movementDelta, Collision collisionData, RaycastOrigins rayOrigins, float raySpacing)
        {
            float   direction   = math.sign(movementDelta.y);
            float   rayDistance = math.abs(movementDelta.y) + collisionData.SkinWidth;
            Vector2 rayOrigin   = (direction == -1) ?  rayOrigins.BottomLeft : rayOrigins.TopLeft;


            for (int i = 0; i < collisionData.VerticalRayCount; i++)
            {
                Vector2 ray = rayOrigin + (Vector2.right * (raySpacing * i + movementDelta.x));

                Debug.DrawRay(ray, Vector2.up * direction * rayDistance, Color.red, 0.1f);

                RaycastHit2D hit = Physics2D.Raycast(ray, Vector2.up * direction, rayDistance, collisionData.Mask);

                if (hit)
                {
                    movementDelta.y = (hit.distance - collisionData.SkinWidth) * direction;
                    rayDistance     = hit.distance;

                    collisionData.State.above = (direction == 1);
                    collisionData.State.below = (direction == -1);
                }
            }
        }
Пример #10
0
        private void HandleHorizontalCollisions(ref float2 movementDelta, Collision collisionData, RaycastOrigins rayOrigins, float raySpacing)
        {
            float   direction   = math.sign(movementDelta.x);
            float   rayDistance = math.abs(movementDelta.x) + collisionData.SkinWidth;
            Vector2 rayOrigin   = (direction == -1) ?  rayOrigins.BottomLeft : rayOrigins.BottomRight;

            for (int i = 0; i < collisionData.HorizontalRayCount; i++)
            {
                Vector2 ray = rayOrigin + (Vector2.up * raySpacing * i);

                Debug.DrawRay(ray, Vector2.right * direction * rayDistance, Color.red);

                RaycastHit2D hit = Physics2D.Raycast(ray, Vector2.right * direction, rayDistance, collisionData.Mask);

                if (hit)
                {
                    // Slope Handling
                    float slopeAngle = Vector2.Angle(hit.normal, Vector2.up);
                    if (i == 0 && slopeAngle <= MAX_CLIMB_ANGLE)
                    {
                        float distanceToSlopeStart = 0;
                        if (slopeAngle != collisionData.State.slopeAngle)
                        {
                            distanceToSlopeStart = hit.distance - collisionData.SkinWidth;
                            movementDelta.x     -= distanceToSlopeStart;
                        }
                        HandleVerticalSlope(ref movementDelta, collisionData, slopeAngle);
                        movementDelta.x += distanceToSlopeStart * direction;
                    }
                    else
                    {
                        movementDelta.x = (hit.distance - collisionData.SkinWidth) * direction;
                        rayDistance     = hit.distance;

                        collisionData.State.right = (direction == 1);
                        collisionData.State.left  = (direction == -1);
                    }
                }
            }
        }
Пример #11
0
    // Unity
    // =====================================================================

    private void Awake()
    {
        collider       = GetComponent <BoxCollider2D>();
        raycastOrigins = new RaycastOrigins();
    }
Пример #12
0
 private void AssignRaycastOrigins(Bounds bounds)
 {
     RaycastOrigins.AssignBounds(bounds);
 }