Devlog 11


Environmental Hazard

Since the beginning of the design process, our team felt that the Arena shouldn't merely be a static battlefield—it needed to be alive and unpredictable. One of the ideas that was highlighted during our concept presentation was the inclusion of elemental disruptions—and the first to make it into production was the sandstorm. The sandstorm is not merely a visual effect, but a gameplay-affecting mechanic. When active, it alters the physics settings of all vehicles in the arena, causing loss of control, wild movement, and a sense of chaos that increases the intensity of combat

I started with a pre-existing sandstorm package from the Unity Asset Store as the base. While the visuals were top-notch, it needed tweaking:

  1. I manually resized the bounds of the storm to fit our custom arena scene.
  2. I adjusted the VFX density and wind distortion to work with our lighting rig.
  3. And most importantly, I made sure that it didn't visually clip outside of the map or look disconnected.

The sandstorm prefab would spawn outside of the playable map, breaking immersion and making the effect pointless. To fix this, I repurposed my pre-existing ground-based spawn sampling algorithm—the same algorithm that dynamically places cars in both the lobby and arena.

By raycasting from a high distance to find a valid ground surface, I was able to ground the sandstorm properly inside the arena so that it would always spawn in a reasonable location. This logic made the storm placement map-aware and scalable, so we could recycle this system for additional dynamic threats in upcoming builds.

Once the sandstorm was in place and fine-tuned, we tested it several times to measure its effect. The outcome was as we had hoped: it disrupted player control just enough to create tension, but not quite enough to qualify as unfair.

The SandstormManager is the conductor of the storm cycle. It only exists on the server and uses a coroutine to:

  1. Wait for a random time (between minDelay and maxDelay)
  2. Show a warning UI panel to all clients using WarningClientRpc()
  3. Activate sandstorm VFX and physics disruption via StormClientRpc(true)
  4. Automatically roll back changes after stormDuration seconds via StormClientRpc(false)

ClientRPC usage ensures all players receive synchronized storm visuals and warnings, without client-side prediction or timers. It's server-controlled for fairness, clean, and reliable. This system also disables the storm and warning visuals on non-host clients at startup to prevent premature triggering.

TornadoController – Intelligent Storm Rotation Positioning

The visual storm effect is controlled by the TornadoController:

  1. It constantly spins by using transform.Rotate(), providing the storm with a lifelike feel.
  2. It raycasts below from an arbitrary height to stop it from spinning when not above proper ground.
  3. This stops rotation glitches or graphics whirling off-map.

 StormController – Dynamic Car Disruption

The gameplay impact itself is produced by StormController, which is attached to every player-controlled car. When the storm begins, the static method StormBeganClientStatic() is called via StormClientRpc. It gets a set of active StormController objects and applies a series of disordering physics modifiers:

  1. Mass reduced → Vehicles get lighter and less stable.
  2. Linear & angular damping increased → Makes vehicles slow and hard to control.
  3. Throttle and steering inputs lowered → Players struggle to move or turn properly.

These alterations simulate what it would be like to drive during a real sandstorm: visibility decreases, control is taken away, and chaos erupts. After the storm passes, StormEndedClientStatic() reverses all modifiers and restores the car to its original parameters.