// 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"); }