Exemplo n.º 1
0
    // Update is called once per frame
    void Update()
    {
        CharNumber = PlayerHandler.CharDecider;
        if (CharNumber == 1)
        {
            CharAssignment = 1;
        }
        else
        {
            CharAssignment = 2;
        }

        if (rb.velocity.y > 0f)
        {
            flyingUp = true;
        }
        else
        {
            flyingUp = false;
        }

        if (StartDelay)
        {
            MovePause();
            MoveStop         = true;
            StartDelayTimer -= Time.deltaTime;
            if (StartDelayTimer <= 0f)
            {
                StartDelay = false;
                MoveStop   = false;
            }
        }

        //prevents player from wall jumping. Used in the OnCollisionStay function
        foot = new Vector2(transform.position.x, transform.position.y - 0.5f);

        //updates the right thumbstick's current values
        xAim = Input.GetAxis("R_horizontal" + CharAssignment);
        yAim = Input.GetAxis("R_vertical" + CharAssignment) * -1;
        //Debug.Log(xAim + ", " + yAim);

        //handles player movement in the horizontal
        float moveDirection = Input.GetAxis("L_horizontal" + CharAssignment) + Input.GetAxis("Dpad" + CharAssignment);
        float move          = moveDirection * moveSpeed * Time.deltaTime;

        if (move > 0 || move < 0)
        {
            anim.SetBool("isWalking", true);
        }
        else
        {
            anim.SetBool("isWalking", false);
        }

        //this if/else slows the player's movement while airborne
        if (!Input.GetButton("Square" + CharAssignment) && !MoveStop)
        {
            if (grounded)
            {
                if (rb.velocity.x < topMoveSpeed && rb.velocity.x > -topMoveSpeed)
                {
                    rb.AddForce(transform.right * move);
                }
            }
            else
            {
                if (-airTopMoveSpeed <= rb.velocity.x && rb.velocity.x <= airTopMoveSpeed)
                {
                    rb.AddForce((transform.right * move) / airborneDampen);
                }
                else if (rb.velocity.x > airTopMoveSpeed && move <= 0f)
                {
                    rb.AddForce((transform.right * move) / airborneDampen);
                }
                else if (rb.velocity.x < -airTopMoveSpeed && move >= 0f)
                {
                    rb.AddForce((transform.right * move) / airborneDampen);
                }
            }
        }

        // prevents player from exceeding a set maximum velocity
        if (rb.velocity.x >= maxPossibleSpeed)
        {
            rb.velocity = new Vector2(maxPossibleSpeed, rb.velocity.y);
        }
        if (rb.velocity.y >= maxPossibleSpeed)
        {
            rb.velocity = new Vector2(rb.velocity.x, maxPossibleSpeed);
        }

        //freezes character and plays victory animation
        if (victory)
        {
            VictoryPause();
        }
        if (MoveStop)
        {
            MovePause();
        }

        //scene reset
        if (Input.GetButton("Triangle" + CharAssignment))
        {
            // call to restart moved to PlayerDeath.cs
            deathScript.RestartLevel();
        }

        if ((Input.GetButton("Circle" + CharAssignment) || Input.GetButtonDown("L1jump" + CharAssignment)) && grounded)
        {
            rb.velocity = rb.velocity / 2;
        }

        //code for jumping, checks if player is contacting ground before allowing jump
        if ((Input.GetButtonDown("X" + CharAssignment) || Input.GetButtonDown("R1jump" + CharAssignment)) && paused == false)
        {
            if (Physics2D.OverlapCircle(foot, 0.7f, cornerLayer))
            {
                grounded = true;
            }
            if (grounded)
            {
                anim.SetBool("jump", true);
                SoundManagerScript.PlaySound("Jump1");
                rb.AddForce(transform.up * jumpHeight);
                grounded = false;
                //Debug.Log("Jumped!");
            }
        }

        //"aimer" is an attachable object, the prefab can be changed in the future
        //changes the position of the aimer based on the right thumbstick inputs
        if (xAim > 0.01f || xAim < -0.01f)
        {
            if (xAim > yAim && xAim > 0f)
            {
                lookDirection               = Vector2.right;
                aimer.transform.position    = new Vector3(transform.position.x + aimerOffset, transform.position.y, 0);
                aimer.transform.eulerAngles = new Vector3(0, 0, 270);
                lookDir = 0;
            }
            if (xAim < yAim && xAim < 0f)
            {
                lookDirection               = Vector2.left;
                aimer.transform.position    = new Vector3(transform.position.x - aimerOffset, transform.position.y, 0);
                aimer.transform.eulerAngles = new Vector3(0, 0, 90);
                lookDir = 0;
            }
        }
        if (yAim > 0.01f || yAim < -0.01f)
        {
            if (yAim > xAim && yAim > 0f)
            {
                lookDirection               = Vector2.up;
                aimer.transform.position    = new Vector3(transform.position.x, transform.position.y + aimerOffset, 0);
                aimer.transform.eulerAngles = new Vector3(0, 0, 0);
                lookDir = 1;
            }
            if (yAim < xAim & yAim < 0f)
            {
                lookDirection               = Vector2.down;
                aimer.transform.position    = new Vector3(transform.position.x, transform.position.y - aimerOffset, 0);
                aimer.transform.eulerAngles = new Vector3(0, 0, 180);
                lookDir = 2;
            }
        }


        //sets direction of sprite
        if (moveDirection > 0 && !facingRight)
        {
            Flip();
            if (lookDirection == Vector2.left)
            {
                aimer.transform.position    = new Vector3(transform.position.x - aimerOffset, transform.position.y, 0);
                aimer.transform.eulerAngles = new Vector3(0, 0, 90);
            }
            if (lookDirection == Vector2.right)
            {
                aimer.transform.position    = new Vector3(transform.position.x + aimerOffset, transform.position.y, 0);
                aimer.transform.eulerAngles = new Vector3(0, 0, 270);
            }
        }
        else if (moveDirection < 0 && facingRight)
        {
            Flip();
            if (lookDirection == Vector2.right)
            {
                aimer.transform.position    = new Vector3(transform.position.x + aimerOffset, transform.position.y, 0);
                aimer.transform.eulerAngles = new Vector3(0, 0, 270);
            }
            if (lookDirection == Vector2.left)
            {
                aimer.transform.position    = new Vector3(transform.position.x - aimerOffset, transform.position.y, 0);
                aimer.transform.eulerAngles = new Vector3(0, 0, 90);
            }
        }
        anim.SetInteger("pullDirection", lookDir);
        //switches the player between push and pull, for playtesting
        //REMOVE FOR FINAL IMPLEMENTATION
        if (Input.GetKeyDown("p"))
        {
            directionSwitcher = directionSwitcher * -1;
        }

        //changes width of linerenderer
        if (lineState)
        {
            if (wid1 <= maxWide)
            {
                wid1 += lineRate;
            }
            else
            {
                wid2 += lineRate;
            }
            if (wid2 >= maxWide)
            {
                lineState = false;
            }
        }
        else
        {
            if (wid1 >= minWide)
            {
                wid1 -= lineRate;
            }
            else
            {
                wid2 -= lineRate;
            }
            if (wid2 <= minWide)
            {
                lineState = true;
            }
        }
        line.SetWidth(wid2, wid1);

        //activation code for radial burst function
        //Debug.Log(Input.GetButton("Fire2"));
        if (Input.GetButton("LT" + CharAssignment))
        {
            if (!burstOnCooldown)
            {
                SoundManagerScript.PlaySound("Radial" + CharAssignment);
                RadialBurst();
                burstAnim.Play("BurstPull");
                burstOnCooldown = true;
            }
        }

        //handles the radial burst cooldown
        //PLAYTEST NOTE: should this be a cooldown? should the cooldown be based on the number of affected objects?
        burstCooldownTimer += Time.deltaTime;
        if (burstCooldownTimer >= burstCooldown)
        {
            burstOnCooldown    = false;
            burstCooldownTimer = 0f;
        }

        //code for pulling / pushing objects, using Raycasts
        //Debug.Log(Input.GetAxis("RT" + CharAssignment));
        if (Input.GetButton("RT" + CharAssignment))
        {
            //sound for looping beam activation
            Beam.enabled = true;
            Beam.loop    = true;
            FlipSet();

            anim.SetBool("pulling", true);
            //Debug.Log("Firing ray");
            RaycastHit2D hit       = Physics2D.Raycast(aimer.transform.position, lookDirection, Mathf.Infinity, magLayer);
            RaycastHit2D groundHit = Physics2D.Raycast(aimer.transform.position, lookDirection, Mathf.Infinity, groundLayer);
            //exit case, happens if nothing is in range of magnet
            line.enabled = true;
            line.SetPosition(0, aimer.transform.position);
            // if(groundHit.collider == null){
            //     return;
            // }

            if (hit.collider == null)
            {
                //line.enabled = false;
                line.SetPosition(1, groundHit.point);
                if (groundHit.collider.gameObject.tag == "Glass")
                {
                    line.SetPosition(1, groundHit.point + lookDirection * 2);
                }
                return;
            }
            if (groundHit.distance < hit.distance)
            {
                if (groundHit.collider.gameObject.tag != "Glass")
                {
                    return;
                }
            }

            if (hit.collider.gameObject.tag == "FreeMagnet" || hit.collider.gameObject.tag == "Player" || hit.collider.gameObject.tag == "HeavyMetal")
            {
                if (flyingUp)
                {
                    return;
                }
                line.enabled = true;
                line.SetPosition(0, aimer.transform.position);
                line.SetPosition(1, hit.point);

                Debug.Log("Hitting FreeMagnet");
                Rigidbody2D rbOther = hit.collider.gameObject.GetComponent <Rigidbody2D>();
                if (lookDirection == Vector2.up || lookDirection == Vector2.down)
                {
                    rbOther.velocity = new Vector2(0, rbOther.velocity.y);
                }
                rbOther.AddForce(-lookDirection * pullStrength * directionSwitcher);
                //add force in perpendicular direction here, to keep things in the beam
                rbOther.AddForce(Centralizer(rbOther));
            }
            if (hit.collider.gameObject.tag == "LockMagnet")
            {
                line.enabled = true;
                line.SetPosition(0, aimer.transform.position);
                line.SetPosition(1, hit.point);

                Debug.Log("Hitting LockMagnket");
                rb.AddForce(lookDirection * pullStrength * directionSwitcher);
            }
        }
        else
        {
            //turns off beam loop audio
            Beam.enabled = false;
            Beam.loop    = false;
            anim.SetBool("pulling", false);

            line.enabled = false;
        }



        StartCoroutine("Footsteps");
    }