コード例 #1
0
    // Update is called once per frame
    void Update()
    {
        // Get the input vector from keyboard or analog stick
        Vector3 directionVector = new Vector3(Input.GetAxis("Horizontal"), Mathf.Abs(Input.GetAxis("Vertical")), 0);
        Vector3 inputVector     = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0);

        if (powerUps.HasPowerUp(PowerUp.Rush))
        {
            motor.movement.maxForwardSpeed = 20;
        }
        else
        {
            motor.movement.maxForwardSpeed = 10; //TODO: use value from inspector instead of hardcoded
        }
        motor.movement.canClimb = powerUps.HasPowerUp(PowerUp.Climb);


        if (directionVector != Vector3.zero)
        {
            // Get the length of the directon vector and then normalize it
            // Dividing by the length is cheaper than normalizing when we already have the length anyway
            var directionLength = directionVector.magnitude;
            directionVector = directionVector / directionLength;

            // Make sure the length is no bigger than 1
            directionLength = Mathf.Min(1, directionLength);

            // Make the input vector more sensitive towards the extremes and less sensitive in the middle
            // This makes it easier to control slow speeds when using analog sticks
            directionLength = directionLength * directionLength;

            // Multiply the normalized direction vector by the modified length
            directionVector = directionVector * directionLength;
        }

        // Rotate the input vector into camera space so up is camera's up and right is camera's right
        directionVector = Camera.main.transform.rotation * directionVector;

        // Rotate input vector to be perpendicular to character's up vector
        Quaternion camToCharacterSpace = Quaternion.FromToRotation(-Camera.main.transform.forward, transform.up);

        directionVector = (camToCharacterSpace * directionVector);

        // Apply the direction to the CharacterMotor
        motor.inputMoveDirection = inputVector;
        motor.inputJump          = Input.GetButton("Jump");

        Vector3 newForward = ConstantSlerp(transform.forward, directionVector, maxRotationSpeed * Time.deltaTime);

        newForward         = ProjectOntoPlane(newForward, transform.up);
        transform.rotation = Quaternion.LookRotation(newForward, transform.up);

        // Reset to SpawnPoint if too low.
        if (motor.transform.position.y < lowestPoint.position.y && !respawnRunning)
        {
            StartCoroutine(Respawn());
        }
        // Set Animation Variables
        SetAnimationVars();
    }