Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Game Development How to Make a Video Game Player Input and Cameras Rotate the Player Towards the Target

Gabor Galantai
PLUS
Gabor Galantai
Courses Plus Student 17,247 Points

My frog turns alright but seems to change its speed of movement

My frog turns very nicely, but sometimes it barely moves in the direction it's supposed to move, seeming almost as if it would be jumping in place, other times it goes off the screen in 2 jumps... I can't see a reason why it does that.

Here is my code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour {

    private Animator playerAnimator;
    private float moveHorizontal;
    private float moveVertical;
    private Vector3 movement;
    private float turningSpeed = 20f;
    private Rigidbody playerRigidbody;

    // Use this for initialization
    void Start () {

        // Gather components from the Player GameObject
        playerAnimator = GetComponent<Animator>();
        playerRigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update () {
        moveHorizontal = Input.GetAxisRaw("Horizontal");
        moveVertical = Input.GetAxisRaw("Vertical");

        movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
    }

    void FixedUpdate () {
        // If player's movement vector doesn't equal zero...
        if (movement != Vector3.zero) {
            // ...then create a target rotation based on the movement vector
            Quaternion targetRotation = Quaternion.LookRotation(movement, Vector3.up);
            // ...and create another rotation that moves from the current rotation to the target rotation
            Quaternion newRotation = Quaternion.Lerp(playerRigidbody.rotation, targetRotation, turningSpeed * Time.deltaTime);
            // ...and change the player's rotation to the new incremental rotation
            playerRigidbody.MoveRotation(newRotation);
            // ...then accelerate the player to play the jump animation
            playerAnimator.SetFloat("Speed", 3f);
        } else {
            playerAnimator.SetFloat("Speed", 0f);
        }
    }
}

1 Answer

Hm. Weird. Here's my code which works fine. See if it works for you

using System.Collections; using System.Collections.Generic; using UnityEngine;

public class PlayerMovement : MonoBehaviour {

private Animator playerAnimator;
//When the player presses keys on the keyboard, this is where the information will go.
private float moveHorizontal;
private float moveVertical; 
private Vector3 movement; 
private float turningSpeed = 20f;
private Rigidbody playerRigidbody;

// Use this for initialization
void Start () {

    // Gather components fromt the Player GameObject
    playerAnimator = GetComponent<Animator> ();
    playerRigidbody = GetComponent<Rigidbody> ();
}

// Update is called once per frame
void Update () {
    //sets a decimal number called moveHorizontal that's going to tell us whether the player is trying to move left or right. 
    moveHorizontal = Input.GetAxisRaw ("Horizontal");
    moveVertical = Input.GetAxisRaw ("Vertical");

    movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
}

//This method is good for objects that rely on physics
//It doesn't run as often
void FixedUpdate () {
    //If it's anything other than all zeros then the player is pressing keys
    if (movement != Vector3.zero) {
        //player animation
        //set the player speed
        //This rotation should happen before the player moves forward
        // ...then create a target rotation based on the movement vector
        Quaternion targetRotation = Quaternion.LookRotation(movement, Vector3.up);

        //...and create another roation that moves from the current roation to the target rotation
        Quaternion newRotation = Quaternion.Lerp (playerRigidbody.rotation, targetRotation, turningSpeed * Time.deltaTime);


        // ...and change the players rotation to the new incremental rotation.
        playerRigidbody.MoveRotation(newRotation);

        playerAnimator.SetFloat ("Speed", 3f);

    } else {
        playerAnimator.SetFloat ("Speed", 0f);
    }

}

}

Gabor Galantai
Gabor Galantai
Courses Plus Student 17,247 Points

It still doesn't work properly. When I navigate the frog, sometimes it goes at seemingly normal pace, other times it's as if it would be jumping almost in one place.