private void FixedUpdate() { float speed; if (!RotateMode) { GetInput(out speed); // always move along the camera forward as it is the direction that it being aimed at Vector3 desiredMove = transform.forward * input.y + transform.right * input.x; // get a normal for the surface that is being touched to move along it RaycastHit hitInfo; Physics.SphereCast(transform.position, CharacterController.radius, Vector3.down, out hitInfo, CharacterController.height / 2f, Physics.DefaultRaycastLayers, QueryTriggerInteraction.Ignore); desiredMove = Vector3.ProjectOnPlane(desiredMove, hitInfo.normal).normalized; MoveDir.x = desiredMove.x * speed; MoveDir.z = desiredMove.z * speed; } else { Holding.Adjust(CrossPlatformInputManager.GetAxisRaw("Horizontal"), CrossPlatformInputManager.GetAxisRaw("Vertical"), CrossPlatformInputManager.GetAxisRaw("VerticalRotate")); speed = 0; MoveDir.x = 0; MoveDir.z = 0; } if (CharacterController.isGrounded) { MoveDir.y = -StickToGroundForce; if (Jump) { MoveDir.y = JumpSpeed; PlayJumpSound(); Jump = false; Jumping = true; } } else { MoveDir += Physics.gravity * GravityMultiplier * Time.fixedDeltaTime; } CollisionFlags = CharacterController.Move(MoveDir * Time.fixedDeltaTime); if (Holding != null) { WalkSpeed = Holding.Follow(transform.position) ? 1f : OriginalSpeed; if ((Holding.myCollider.ClosestPoint(Camera.transform.position) - Camera.transform.position).magnitude >= holdingDistance) { WalkSpeed = OriginalSpeed; overlayEffect.DropEffect(Holding.LetGo()); Holding = null; RotateMode = false; print("Dropped"); } } ProgressStepCycle(speed); UpdateCameraPosition(speed); MouseLook.UpdateCursorLock(); }