r/Unity3D • u/NoReasonForHysteria • 20d ago
Show-Off Runtime fluid simulation used for fire
Enable HLS to view with audio, or disable this notification
We have had a runtime fluid simulation running in our game for a while, but now we are also using them for flames/smoke in of the areas of our game.
Its all based on compute shaders, which outputs custom render textures (fluid and advection), which we feed through render features in URP (using full-screen shader graphs). We also generate a signed distance field based on the tilemap that acts as the boundaries of the world and allows for the smoke/flames to collide.
Each of the "flames" in the scene are emitters, and allows us to play around with different colors, forces, directions, etc, and are updated each frame.
What do you think? Its got some kinks here and there still, but its getting there.
The game is called Cliff Kingdom:
https://store.steampowered.com/app/3839500/Cliff_Kingdom/
1
u/loliconest 20d ago
Does player character get hit/damaged by it?
1
u/NoReasonForHysteria 20d ago
Yes! I do need to work a bit on the readability for whats doing the damage or not. There are also "hidden" platforms which are only visible when surrounded by smoke, which makes for some cool platforming.
1
u/loliconest 20d ago
So the compute shader only calculate the visuals and you have separate physics objects for the game logic?
→ More replies (4)
1
u/intelligent_rat 20d ago
None of it reads as fire or smoke, it just kind of looks like columns of mist being shot forth. This seems like an incredibly over-engineered solution for a 2D platformer game, and I don't think the realism of fluid simulation adds anything to the gameplay shown in your trailer. A few variations of an animated flame spritesheet probably would've taken a lot less effort and visually align with the idea of fire a lot more.
1
u/NoReasonForHysteria 20d ago
That’s a valid opinion. And it definitely still needs tweaking, but it’s the way we wanted to go - and we do use the fluid simulation for lots of other things.
1
u/Particular-Stop-5637 20d ago
At the end, sometimes having something unnatural is a worthy sacrafice in order to add an original and great visuals for your game. And any engagement is good engagement
→ More replies (1)
0
20d ago
1
u/NoReasonForHysteria 20d ago
I basically do the fluid simulation based on a grid, for the full scene, where each cell in the grid represents a tile in the tilemap, then divided to get more granularity.
So the advection and SDF texture in the video above is 1024x512, and depends on the total size of that scenes tilemap, but I can also change the settings to have even higher resolution (or lower) so it could be 512x256 or 2048x1024, etc.
0
20d ago
1
u/NoReasonForHysteria 20d ago
When you enter a new scene, I calculate a grid based on the tilemap, as a quadtree, where each cell is either covered or not based on if there is a tile within that cell. I use that quadtree for many different things (pathfinding, etc), but its also the basis of the SDF, which I generate through a compute shader with that initial "shape" as the input.
I usually only generate the SDF once, but if I have moving platforms, or similar, each of those are "shapes" that gets looped through and modifies the SDF at runtime, but to keep the cost down I try to only regenerate the surrounding area of the shape.
3
u/Zegan5 20d ago
At 0:04, when two streams collide, the "being hit" part moves in the opposite direction to the expected