JW / JAMIE WILLIAMS

Projects / Unity & physical input

RFID Abilities Platformer

A small platformer where physical RFID tokens select movement abilities inside Unity.

I built the original version solo in two to three days, then kept developing the controller, movement and game systems.

RoleSolo developer
ToolsUnity, C#, ESP32
InputRFID + Bluetooth HID
StatusIn development

Project overview

The project grew from a previous gravity-themed jam game and the physical interaction of toys-to-life games such as Disney Infinity. Each token represents an ability: dash, wall jump, gravity flip or time stop.

Scanning a token changes the active ability in the game. The same abilities remain available on the number keys, so the browser build can be played without the physical controller.

RFID controller

  1. 01RFID tokenA physical token is scanned.
  2. 02MFRC522 readerThe reader sends the token ID over SPI.
  3. 03ESP32The ID is matched to an ability.
  4. 04Bluetooth HIDA number key is sent wirelessly.
  5. 05UnityThe matching ability becomes active.

Using Bluetooth HID lets the controller arrive as ordinary keyboard input, keeping the game-side integration straightforward.

Gameplay systems

The platforming controller includes acceleration, coyote time, jump buffering and a variable jump height. Moving hazards, HUD feedback and ability-specific visuals help make each state clear while the player is moving.

The project also includes a leaderboard and ghost replay system, plus tutorial support for both keyboard and RFID input.

Movement tuning

The controller uses separate acceleration and deceleration instead of snapping straight to its target speed. A short input buffer and coyote-time window make jumps more forgiving without removing the need for precise timing.

Coyote time
0.08 s
Jump buffer
0.10 s
Dash duration
0.20 s
Time stop
3.00 s
Inspect PlayerController.cs ↗

Ghost replay and leaderboard

The ghost recorder samples the player's position during Unity's fixed physics updates and stores each point with a timestamp. Playback finds the samples around the current time and interpolates between them, so the ghost moves smoothly even though the run is stored as discrete frames.

The leaderboard keeps the five fastest local results. When a new fastest time is submitted, that run becomes the ghost for the next attempt.

Current progress

The browser build is playable now. I am still refining movement feel, visual readability, the HUD, crush and reset behaviour, and leaderboard edge cases.

Gameplay and controller footage will be added here after the next recording pass.

Development process

I designed, built and iterated the project as the solo developer. I used AI tools for programming assistance, debugging, explanations and documentation. The ghost time-trial system involved more substantial assistance because it was one of the harder systems to put together.

The repository keeps the full source and development notes available for inspection.

PROJECT LINKS