Exemplo n.º 1
0
    float GetDistanceToInteractable(Vector2 interPos, Controller2D boxController)
    {
        float dist = 0;

        if ((interPos.y - boxController.box.bounds.size.y / 2) < (transform.position.y - controller.box.bounds.size.y / 2))
        {
            //chacter staat hoger
            castInfo i = controller.HorizontalCast(Mathf.Abs(transform.position.x - interPos.x) * Mathf.Sign(interPos.x - transform.position.x), transform.position, pushObject);

            if (i.hasHit)
            {
                dist = i.hitDistance;
            }
        }
        else
        {
            //box staat hoger
            castInfo i = boxController.HorizontalCast(Mathf.Abs(interPos.x - transform.position.x) * Mathf.Sign(transform.position.x - interPos.x), interPos, gameObject);

            if (i.hasHit)
            {
                dist = -i.hitDistance;
            }
        }


        return(dist);
    }
Exemplo n.º 2
0
    public castInfo VerticalCast(float distance, Vector2 origin)
    {
        float s = skinWidth * 2;

        castInfo info = new castInfo();

        info.hitNormal = Vector2.up;

        info.hitDistance = distance;

        Vector2 size      = (Vector2)box.bounds.size - (Vector2.one * s * 2);
        Vector2 direction = Vector2.up * Mathf.Sign(distance);

        RaycastHit2D hit = Physics2D.BoxCast(origin, size, 0, direction, Mathf.Abs(distance) + s, collisionMask);


        if (hit)
        {
            info.hitDistance = (hit.distance - s) * Mathf.Sign(distance);
            info.hitObject   = hit.transform.gameObject;
            info.hasHit      = true;
            info.hitNormal   = hit.normal;
        }

        return(info);
    }
Exemplo n.º 3
0
    void Update()
    {
        if (controller.collisions.above || controller.collisions.below)
        {
            if (controller.collisions.slidingDownMaxSlope)
            {
                velocity.y += controller.collisions.slopeNormal.y * -gravity * Time.deltaTime;
            }

            else
            {
                velocity.y = 0;
            }
        }

        transform.localScale = (Mathf.Sign(velocity.x) * scale.x * Vector2.right) + scale.y * Vector2.up;

        Vector2 input = new Vector2(Mathf.Sign(target.transform.position.x - transform.position.x), 0);

        velocity.x = input.x * moveSpeed;

        velocity.y -= gravity;

        castInfo i = controller.HorizontalCast((velocity.x * 3) * Time.deltaTime, transform.position);

        if (i.hasHit && Vector2.Angle(i.hitNormal, Vector2.up) > controller.maxAngle)
        {
            velocity.y = jumpVelocity;
        }



        controller.Move(velocity * Time.deltaTime);
    }
Exemplo n.º 4
0
    void PushBox(GameObject box, castInfo info)
    {
        Controller2D boxController = box.GetComponent <Controller2D>();

        if (Input.GetAxisRaw("Fire1") != 0 && controller.VerticalCast(-1, transform.position).hasHit&& box != null)
        {
            float dist = GetDistanceToInteractable(box.transform.position, boxController);


            if (Mathf.Abs(Mathf.Abs(dist) - distToInteractble) < 0.1f && velocity.x != 0)
            {
                if (Mathf.Sign(transform.position.x - box.transform.position.x) == Mathf.Sign(velocity.x))
                {
                    //Pulling
                    controller.Move(velocity * Time.deltaTime);

                    float m = GetDistanceToInteractable(box.transform.position, boxController);

                    if (m == 100)
                    {
                        DisconectFromInteractable();
                        return;
                    }


                    boxController.Move(Vector2.right * -(m - (distToInteractble * Mathf.Sign(m))) - (Vector2.up * Time.deltaTime));
                }
                else
                {
                    //Pusing
                    boxController.Move((Vector2.right * velocity.x - Vector2.up) * Time.deltaTime);

                    float m = GetDistanceToInteractable(box.transform.position, boxController);

                    if (m == 100)
                    {
                        DisconectFromInteractable();
                        return;
                    }

                    controller.Move(((Vector2.right * (m - (distToInteractble * Mathf.Sign(m)))) + (Vector2.up * velocity.y * Time.deltaTime)));
                }
            }

            if (dist != distToInteractble)
            {
                float d = (Mathf.Abs(dist) - distToInteractble) * 30;
                controller.Move(((Vector2.right * Mathf.Sign(box.transform.position.x - transform.position.x) * d) - Vector2.up * gravity) * Time.deltaTime);
            }
        }
        else
        {
            Debug.Log("kak");
            DisconectFromInteractable();
        }
    }
Exemplo n.º 5
0
    // Update is called once per frame
    void Update()
    {
        if (controller.collisions.above || controller.collisions.below)
        {
            if (controller.collisions.slidingDownMaxSlope)
            {
                velocity.y += controller.collisions.slopeNormal.y * -gravity * Time.deltaTime;
            }

            else
            {
                velocity.y = 0;
            }
        }



        Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));

        velocity.x = input.x * moveSpeed;

        velocity.y -= gravity;



        castInfo side = controller.HorizontalCast(checkDistance * Mathf.Sign(velocity.x), transform.position);

        if (side.hitObject != null && Input.GetAxisRaw("Fire1") != 0)
        {
            if (side.hitObject.tag == "box")
            {
                pushObject = side.hitObject;
            }
        }

        if (pushObject != null)
        {
            PushBox(pushObject, side);
            return;
        }

        if (Input.GetAxisRaw("Jump") != 0 && controller.collisions.below)
        {
            velocity.y = jumpVelocity;
        }

        controller.Move(velocity * Time.deltaTime);
    }
Exemplo n.º 6
0
    public castInfo HorizontalCast(float distance, Vector2 origin, GameObject searchObject)
    {
        float s = skinWidth * 2;

        castInfo info = new castInfo();

        info.hitNormal = Vector2.up;

        info.hitDistance = distance;

        info.hasHit = false;

        Vector2 size      = (Vector2)box.bounds.size - (Vector2.one * s * 2);
        Vector2 direction = Vector2.right * Mathf.Sign(distance);

        RaycastHit2D[] hits = Physics2D.BoxCastAll(origin, size, 0, direction, Mathf.Abs(distance) + s, collisionMask);
        RaycastHit2D   hit  = new RaycastHit2D();

        bool hasHit = false;

        for (int i = 0; i < hits.Length; i++)
        {
            if (hits[i].transform.gameObject == searchObject)
            {
                hit    = hits[i];
                hasHit = true;
                break;
            }
        }


        if (hasHit)
        {
            info.hitDistance = (hit.distance - s) * Mathf.Sign(distance);
            info.hitObject   = hit.transform.gameObject;
            info.hasHit      = true;
            info.hitNormal   = hit.normal;
        }

        return(info);
    }