Reverse Time Clones
Concept
In this game, players can rewind time at any moment. When they resume, a clone of their character appears, reenacting their exact actions from before the rewind. This allows players to strategize and solve challenges by working together with previous incarnations of themselves.
2024
Solo project
2 weeks

Key Feature - Reverse Objects and Events
1. Reverse Objects: Developed a component to reverse object and player movement in the world.
2. Time Stamps: Implemented a system to track the timing of actions, enabling replication or reversal of them.
3. Replicate Player Actions: Created a system to spawn clones that mimic the player’s past actions.
Finding the Concept
I came up with this idea during a brainstorming period of a group project. Although it wasn’t selected, I was intrigued by its potential and the technical challenge.
To explain it to my teammates, I created a video prototype using Unreal Engine’s Take Recorder. I recorded my movements, played them back, and edited the footage (including reversing and adding effects) to demonstrate the mechanic. The video shows the player die, reverse time and shoot the one that killed the player (twice).
Reversing Time
I started by testing with simple objects like cubes. I created a component that saves the owner's transform every tick. When time is reversed (hold button), it replays these transforms in order, starting with the latest, to move the object backward through time.

I knew saving object states every tick could be performance heavy, but I used it to quickly prototype and test the idea before worrying about optimization.
Reverse time component
Spawning Clones
When a clone spawns after a rewind, it receives data on the player's past movements and actions, including position, rotation, and time of shooting, allowing it to replicate them accurately.

Each clone is bound to the time window in which it was created, acting only between the start and stop of the rewind. Clones turn blue when they reach the end of their timeline.

Time reverse logic in player
Clone logic for replicating movement and actions
Reverse Player Damage and Death
Rewinding time not only reverts movement but also restores lost health. If the player takes damage, they can rewind past that point to recover. They can even reverse back from death. This works by storing damage values with timestamps. When rewinding past a damage event, the player's health is restored.

Reverse health
Doors
To encourage cooperation with clones, I introduced doors that require multiple buttons to be pressed at the same time to open.

A big challenge was making the door respect the time reversal mechanic. The door needed to close if you rewound past the point it was opened, and if you stopped the rewind while it was closing, it had to pick up from where it left off and continue opening.

I used an enum to define door states(closed, opening, open, closing), controlling transitions between them to ensure consistent behavior during time manipulation.
Door control
Enemy Targeting
I wanted enemies to target the closest "alive" pawn, whether it’s the player or a clone. This allows the player to use clones as shields by standing further away than them to avoid getting shot.
This was done by adding sensed pawns(player and clones) to an array and firing a line trace towards the closest one. Only clones that are within their "alive" time are added. This is performed once per second by setting the pawn sensing interval to 1.
Enemy fire at closest pawn
Reflections
Prototyping this novel mechanic was a highly rewarding experience. While I haven’t yet established a clear gameplay loop, the concept shows promise and offers a unique feel.
Through this process, I had the opportunity to dive deep into handling and looping through arrays. In hindsight, I realize that using structs could have been a great tool to better organize and collect data, such as transferring information to clones or tracking damage alongside the time it occurred.
At the start, this project felt overwhelming, but breaking it down into smaller tasks kept my progress steady and my motivation high.
The main goal of this prototype was to test the viability and appeal of the concept. I can now see that it’s both viable and interesting, and I’m excited to continue refining the design and implementation to build a cohesive and engaging experience.