
In this Unit, I programmed a car moving side-to-side on a road, trying to avoid (or hit) obstacles in the way. In addition to becoming familiar with the Unity editor and workflow, I learned how to create new C# scripts and do some simple programming. By the end of the Unit, I was able to call basic functions, then declare and tweak new variables to modify the results of those functions.

https://meta.dwdenney.com/unit1/
Project Outcome:
You will have a moving vehicle with its own C# script and a road full of objects, all of which may collide with each other using physics components.
Project Milestone:
The camera will follow the vehicle down the road through the scene, allowing the player to see where it’s going.
Project Milestone:
When the player presses the up/down arrows, the vehicle will move forward and backward. When the player presses the left/right arrows, the vehicle will turn.
C# code sample
public class PlayerController : MonoBehaviour
{
    // our custom variables
    private float speed=20.0f;
    private float turnSpeed = 45.0f;
    private float horizontalInput;
    private float verticalInput;
   
    // Update is called once per frame
    void Update()
    {
        // get horizonal input to use for turning vehicle
        horizontalInput = Input.GetAxis("Horizontal");
        // get vertical input to use for moving vehicle forward/backward
        verticalInput = Input.GetAxis("Vertical");
        // move the vehicle forward based on the users  vertical input value
        transform.Translate(Vector3.forward * Time.deltaTime * speed * verticalInput);
        //rotate the vehicle based on the users horizonal input value
        transform.Rotate(Vector3.up, Time.deltaTime * turnSpeed * horizontalInput);
    }
}
public class FollowPlayer : MonoBehaviour
{
    // variable to hold the player object which is the vehicle that the player will drive.
    public GameObject player;
    // variable to hold the camera offset to provide the best view
    private Vector3 offset = new Vector3(0.37f, 10.63f, -18.44f);
    // Start is called before the first frame update
    void Start()
    {
        
    }
    // Update is called once per frame
    void LateUpdate()
    {
        transform.position = player.transform.position + offset;
    }
}
An advanced mod to the code was learned later on. I changed the private variables to [SerializeField] so they will show up in the UI view without making them public.
 [SerializeField] private float turnSpeed = 45.0f;