// Update is called once per frame void Update() { if (!PauseManager.paused && !PauseManager.reading) { // if the player is not in the air set their y velocity to 0 if (controller.isGrounded && velocity.y < 0) { velocity.y = 0; } // get inputs from WASD keys float x = Input.GetAxis("Horizontal"); float z = Input.GetAxis("Vertical"); // raycast from player to the ground to determine what kind of terrain they are on if (Physics.Raycast(transform.position, transform.TransformDirection(-Vector3.up), out toFloor, 1, layerMask)) { // get current terrain object player is standing on, if none returns null terrain = tEdit.GetTerrainAtObject(toFloor.transform.gameObject); if (terrain != null) { tEdit.SetEditValues(terrain); // get heightmap coords tEdit.GetCoords(toFloor, out int terX, out int terZ); if (tEdit.CheckIce(terX, terZ)) { onIce = true; } else { onIce = false; } } } else { onIce = false; } // if any of these keys are pressed appropriate animations should play if (z != 0 || x != 0) { // play different sound effects if the player is currently moving on sand vs ice if (onIce) { if (!footstepSound[iceSound].isPlaying) { footstepSound[sandSound].Stop(); footstepSound[iceSound].Play(); } } else { if (!footstepSound[sandSound].isPlaying) { footstepSound[iceSound].Stop(); footstepSound[sandSound].Play(); } } // sprint button changes player's speed if (Input.GetKey(KeyCode.LeftShift)) { anim.SetBool("IsWalking", false); anim.SetBool("IsRunning", true); speed = sprintSpeed; } else { anim.SetBool("IsRunning", false); anim.SetBool("IsWalking", true); speed = walkSpeed; } } else { anim.SetBool("IsWalking", false); if (footstepSound[iceSound].isPlaying) { footstepSound[iceSound].Stop(); } if (footstepSound[sandSound].isPlaying) { footstepSound[sandSound].Stop(); } } // move forwards/backwards with z and left/right with x Vector3 move = transform.right * x + transform.forward * z; // character controller handles the movement controller.Move(move * speed * Time.deltaTime); // play jump animation and calculate upwards velocity if (Input.GetButtonDown("Jump")) { anim.SetTrigger("Jump"); velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity); } // gradually brings play back to ground velocity.y += gravity * Time.deltaTime; // if player is on ice then they gradually gain speed if (onIce) { velocity += transform.forward * 0.7f * z; } else { // this will gradually slow down the player velocity.x *= 90f / 100f; velocity.z *= 90f / 100f; } // apply the velocity to the player controller.Move(velocity * Time.deltaTime); } }