Quick Win 2: Make your movement feel real
We are not adding features. We are improving structure.
Yesterday, you built something important:
- A Player object
- Input separated from movement
- CharacterController driving motion
Today, we make it feel intentional instead of robotic.
What you are building
By the end of this step:
- Your player will rotate toward movement
- Movement will feel directional
- Your structure stays clean and scalable
Step 1: Update PlayerController
Open your existing PlayerController script and replace it with this:
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public sealed class PlayerController : MonoBehaviour
{
[SerializeField] private PlayerInputReader input;
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private float rotationSpeed = 10f;
private CharacterController controller;
private void Awake()
{
controller = GetComponent<CharacterController>();
if (input == null) input = GetComponent<PlayerInputReader>();
}
private void Update()
{
Vector2 move = input != null ? input.Move : Vector2.zero;
Vector3 worldMove = new Vector3(move.x, 0f, move.y);
if (worldMove.sqrMagnitude > 0.01f)
{
Quaternion targetRotation = Quaternion.LookRotation(worldMove);
transform.rotation = Quaternion.Slerp(
transform.rotation,
targetRotation,
rotationSpeed * Time.deltaTime
);
}
controller.Move(worldMove * moveSpeed * Time.deltaTime);
}
}
Step 2: Press play
Press Play.
Your player now turns toward the direction of movement.
Why this matters
You did not add a new system.
You improved an existing one.
- Input is still separate
- Movement is still isolated
- CharacterController still handles collisions
This is how real projects grow.
Stop here
Do not add jumping yet.
Do not refactor everything.
Do not start importing animation packs.
Small, deliberate improvements beat feature explosions.
Tomorrow
Tomorrow, we take the exact same structure and prepare it for more than one player.
Dan