When we made the prefab system we wanted to try something different. We wanted to think of prefabs more like interfaces, where you'd expose only certain properties and objects to be accessed and edited externally.

Turns out that was all a load of shit. So we overhauled it to work like everyone would expect. Now when you drop a prefab into a scene you'll see all the GameObjects like you would expect. You'll be able to modify that instance of it, and apply changes back to the prefab, or revert those changes back to the prefab values.



You don't have to do anything to migrate to the new system, existing prefabs, prefab variables and prefab instances will automatically convert to the new system. Once you save a prefab or scene, contained prefab instances will be written to the disk in the new format.

In addition you can now also specify the transform of prefab roots.
We were really happy with last month's holiday challenge that we decided to continue work on this project - and we've been busy. We've added rollercoasters, staff that perform tasks in the park, as well as revamped the whole UI system. 
Theme Park is playable right now, check it out!
We've made some initial iterative changes to the editor UI - the first of many steps towards a more cohesive editor experience. We've mainly focused on the basics, trying to build a design language as foundations for more changes to come.

So far we've:
  • Unified our colour palette, sizing variables, rounding, etc.
  • Switched to a nicer font
  • Updated widgets, controls, docks to match each other for consistency
As an example - here's what the cloud browser looks like now:
We added a Bitmap class a while back. It's a really cool class. It lets you create a bitmap, load a jpg/png, clear it, draw on it, rotate it, save it as a png/jpg. It's a useful little class.

Now you can render a scene onto it. Just call CameraComponent.RenderToBitmap to draw straight to it.

This is particularly useful if you want to create thumbnails or something. It works both in editor and in game.

I did a sprint on the avatar system this month. My end goal is to make it so we can start adding community-created cosmetics in the same way we do in Rust. This was a stepping stone towards being able to view and rate them in the Avatar Editing scene.
The end result of this work is that we have a much cleaner, straightforward experience when customising your avatar. Citizen skin color and age are sliders. Changing the tint of things is much easier. Clothing is organised into groups and categories.
We've made adjustments to the female heads and body, making them look a lot more natural. Originally we were focused on making hair and beards work across male to female; which meant morphing the jaw and cranium, which resulted in the female faces looking uncanny. The picture below is a before and after of the changes made.
We've decided to rework the female heads, creating results that we are a lot happier with.
Alongside this, we've been working on how we tackle hair for the female human. A lot of our hairs were made with the intention of being androgynous, to work across the male and female head types. We're moving away from that and making sure all hair has female alternatives that compliment the female faces more appropriately.
Here you can see a new hairstyle we are working on that sets the bar of quality we are looking to make when created our adjusted female versions of existing hairs. 
We had a big problem with stuttering like many modern games, different combinations of shaders getting compiled at draw time causing hitches of anywhere from 100ms to 3000ms.

Most games usually solve this by prewarming every single combination possible at the loading screen, which is the long "compiling shaders" loading screen when you first play these games. It's difficult for us to figure out all the combinations that can be used on a UGC platform and honestly this wait kind of sucks.

Solution

Source 2 has a better solution with VK_EXT_graphics_pipeline_library, instead of recompiling the entire shader every time, the shader gets split into stages (input, vertex, fragment, output) that can be linked together very quickly at draw time.

This makes the number of shader compilations additive instead of multiplicative, this drastically reduces work required.
We weren't able to take advantage of this before because shaders had to be setup in a very static way, not befitting of a UGC platform or easy to use engine.

We talked to Valve on how to best support this dynamically, and within a few days they had made a solution in Source 2 🎉 We backported this to our engine and the results have been fantastic.

Broken Shaders

Games with outdated shaders will be hidden until you've recompiled and republished your game.
If your game is affected you will have received a notification.
This is unfortunate but it's a fundamental change and we've added a new system to avoid this in the future.
I've tweaked the website again. I'd taken it into sidebar hell, so I wanted to escape that. I wanted to make the site friendlier to new people, to explain a bit more and to be less overwhelming.

This new change has enabled me to divide the site into separate sections, each with its own custom header. I feel like that has made the site feel less cluttered and more digestible.

We improved the built-in screen recorder (F6) optimized performance and fixed various crashes.
Video quality can now be adjusted using the video_bitrate cvar.

Additionally we enhanced stability and performance across all our multimedia components (VideoWriter, MusicPlayer, VideoPlayer).

Our UI's stylesheet system now supports ::before and ::after.
I've wanted to implement this for about a year, and I finally got around to it. It works the same as on the web, it feels great to have this functionality in our UI system.. it's so helpful to have.
Previously, when razor panels updated and deleted their children, they didn't call the :outro. This was on purpose, because I assumed that it'd break everything and be unreliable/unworkable.

Turns out that assumption was wrong. It is sometimes unreliable and sometimes unworkable, but the rest of the time it works fine. So now you can take that chance.
The renderer component now has two new functions that allow you to set a CommandList to execute immediately before and after rendering.

Why would you want to do this? Maybe you want to render something to a render texture and pass that to the renderer, but only when the object is rendered. Maybe you want to draw something immediately before, or immediately after?
Our previous SSR system came from early development when we did not have the scene system or much control of the rendering pipeline, using a raster pipeline to mask objects and you needed a special combo to have it work on your shader. While it was nice it was completely unmanageable.

It's been reworked into a component all using compute shaders, with the same G-Buffer prepass system we have we can infer all material information to trace on screen.


Sharing the same thought how we handle ambient occlusion; as post for indirect diffuse, we treat SSR as post for indirect specular, so it just works on any objects where it's applied in the scene, the API is much cleaner so it can be expanded to expose any kind of reflection method you want to composite to an object.

The Play Fund pool increased in April. The top earning user got a payment of just over $5,000.

I get that it's not mega money,  not compared to Roblox and Fortnite. We're still in developer preview and still developing the Play Fund - so the pool is relatively low right now.

The good news is that in May we increased the pool too. And will again in June.
Particle effects now have the option to use game time or real time, for the situations when you want particles to play normally when paused or in slow motion.
A few months back we removed the source engine vpcf particle editor. These particles still worked, but you couldn't create or edit them. This update removes the legacy particles completely. If a game is still using them they'll just show up as invisible.

There are undoubtedly things that you could do in the old particle system that you can't do in the component based system. The good thing is that the new particle system is moddable, so if you can't do something you can write a component that will do it. And because it's a component that means it's way easier to make it configurable so you can re-use it in a bunch of different situations.

I never want us to end up with an engine where we have multiple systems running in parallel, with different levels of support. In general it's better to improve a system incrementally instead of completely replacing it. In this case we replaced it because we knew it'd be impossible to iterate on.
The engine now includes a component to easily dress your characters. This lets you either choose specific clothes to give them or use a player's configured clothing.  It also allows you to use the height, age and skin tint to customise your characters. This has been something that required some manual coding to achieve before, so hopefully this makes it a lot easier.
You can also select community clothing that has been uploaded from the workshop.
Things are shaping up. Everything feels brand new again. Our whole thing now is to look at what we have and find ways to make it better. Every day. The community is a big help there - thanks to everyone who is using the engine and giving feedback, it's a massive help.

I'm going to bite the bullet and start making the Sandbox Mode in June. I expect that this will start off being very familiar, and then get experimental for a bit, and then collapse back into a nice place. There are a couple of tent poles with sandbox mode that I want to erect, like making addons work again. 
June Update
0.3.0
1 June 2025
🎁 Added
  • ::before and ::after to UI
  • New Prefab Instance System
  • Screen Space Reflections component
  • Dresser component - makes dressing avatars easier
  • Scene.FindInPhysics( Frustum )
  • Scene.Get<T>()
  • SequenceAccessor.Blending
  • ITagSet.GetDefaults
  • ParticleEffect.RealTime
  • Panel.SetRect
  • Plane.ReflectPoint
  • Plane.ReflectDirection
  • CameraComponent.BBoxToScreenPixels
  • Bitmap.Size
  • DebugOverlaySystem.Texture (draw texture on the screen)
  • Transform.Mirror
  • Application.OnWidgetClicked
  • Graphics.CameraTransform
  • Graphics.CameraRotation
  • Graphics.FieldOfView
  • Renderer CommandList wrappers
  • Renderer.ExecuteBefore (command list, executes before rendering object)
  • Renderer.ExecuteAfter (command list, executes after rendering object)
  • CommandList.DrawReflection
  • CommandList.DrawRefraction
  • CommandList.DrawRenderer
  • CommandList.DrawView
  • CommandList.Attributes.Set( bool )
  • CommandList.Attributes.SetCombo( bool )
  • CommandList.GlobalAttributes
  • Texture.Clear( Color )
  • TextureBuilder.WithInitialColor( Color )
  • Vector3.Dot( a, b )
  • [FilePath] attribute for string properties
  • accessors and constructor to Matrix class
  • Matrix.CreateObliqueProjection
  • Input.Suppressed
  • Gizmo.Draw.Sprite angle parameter added
🧼 Improved
  • Editor theme improved - new font, color scheme and many tweaks
  • Shader memory layout changed to drastically reduce stuttering
  • Time classes internally use doubles for improved precision
  • Video Recording has been greatly improved for stability and speed
  • Human female🙍‍♀️ models look a lot more female
  • GPU -> CPU readbacks use cached memory improving speed
  • VR gets it's projection matrix from the headset directly
  • Updated Roslyn - your games will generate more optimized code now
  • GameObjectReference serialization for prefab properties
  • Create GameResource Save button when using a customer inspector
  • Improved aspect ratio in asset browser thumbnails
  • Select prefab/network root when selecting object in viewport
  • Prefab instance UX improvements
  • Rebuild model hitboxes on renderer model change
  • Optimized NetworkTable causing excessive delta snapshot GC
  • Cameras rendering to textures use a HDR texture and matching MSAA
  • Make sure Screen.Size is correct on scene startup
  • Component Eye Dropper can be used directly on Components in the inspector
  • GameObject Eye Dropper can be used on Prefabs in the Asset Browser
  • GameObject & Component Eye Droppers can be used on other GameObject/Component properties
  • Load system scenes on any non-additive scene load
  • Creating a new project or opening a Sample Project will now correctly show the "LAUNCHING" text
  • Sample Projects no longer create duplicate entries in the Launcher when opened manually
  • NetworkFiles includes stuff on resource paths
  • Mixer Handles now support multi-edit
  • Can now unlink multiple prefabs at once with multi-select
  • Can apply/revert prefab instance changes with multi-select
  • Unsaved changes dialog prompt for resources
  • Update Skin shader with tint and age sliders
  • Steam Audio update (4.5.2 -> 4.6.1) and static linked
  • RenderTextures are cleared to magenta by default (to spot errors more easily)
  • Updated to SDL3 and gamecontrollerdb.txt
  • UI textures are mipbiased to avoid being blurry
  • Allow modifying the transform of the prefab root
  • Project settings UX improvements
  • Whitelist JsonStringEnumMemberNameAttribute
  • CameraComponent.RenderToTexture takes a ViewSetup allowing overrides
  • Yoga config uses UseWebDefaults
  • HudPainter.DrawLine uses SDF shape for much smoother lines
  • Exposed and documented ImageFormat
  • Whitelisted many requested types including BigInteger, Complex, Task.Is*, ReadFromJsonAsync and more..
  • GameOverlays use a viewport z-slice instead of an additional depth buffer
🪛 Fixed
  • Intel Integrated Graphics no longer crash on startup, device limitations are checked on startup now
  • SpriteRenderer crashing trying to render on dedicated servers
  • UI no longer renders over the Scene tab in the editor while in play mode
  • Various security exploits reported on HackerOne
  • MusicPlayer crashes
  • Razor elements now play :outro properly
  • WantsFrameBufferCopy doing nothing outside of regular models
  • Navmesh links triggering when not active
  • SceneCamera.GetFrustum returning nonsense on ortho cameras
  • Scene not being pushed before several prefab related editor actions
  • Scratch depth buffer not matching scratch color dimensions
  • UI corners being misaligned
  • UI sometimes getting 1 pixel gaps between panels
  • SetMaterialOverride( null ) not clearing any overrides
  • Prefab Root context menu giving options that resulted in error
  • TreeView not completing a SHIFT+CLICK action when the first item was selected outside of the tree
  • Locate Prefab option now always appearing when you'd expect it to
  • Depth-aware mask NaNs
  • Label scissoring with WorldPanels
  • Model renderer local bounds being wrong
  • Fix rotated off-center box trace
  • Null GameResource icons preventing editor start-up
  • Blending mode on translucent objects, default alpha blending mode additive
  • Missing project settings button on asset projects
  • Input binds not saving
  • Dedicated server crashes when trying to use lobby methods
  • Error when in Eye Dropper tool of a list entry and the entry in the list is removed
  • Fixes a discrepancy between the hashed identity of TypeLibrary methods and MethodIdentity in WrappedMethod from CodeGen when the method is on a class contained within another class
  • BytePack struct serialization
  • TypeLibrary is disabled during cctors / package load
  • Context menu on normal files in the Asset Browser
  • Error when multi-selecting an asset and a normal file in the Asset Browser
  • Flickering when dragging material on to scene mesh
  • Tooltips linger when mousing out of a tooltipped pannel
  • Depth Linearization in Oblique Matrices
  • Crash in CSceneAnimatableObject::MergeFrom
  • [Button] not showing if not returning void
  • Fixed menu addon not loading in editor (due to whitelist)
  • ISceneStage spans the wraps the entire scene update, not just OnUpdate
  • Prevent EditorUtility.RenameDirectory making a directory a subdirectory of itself
🚯 Removed
  • Legacy particle system - legacy particles will no longer render
  • Prefab variables
  • Deleted many unused DLLs reducing the game size
  • Removed unstable GPU shadow culling
  • NativeRenderingWidget now doesn't render without a scene
  • Graphics.RenderToTexture (use CameraComponent.RenderToTexture)
trophy 955
Apr 2021 45 posts
June Update : news/june-2025
trophy 60
Jul 2021 6 posts
Sandbox mode my beloved 
trophy 12827
Sep 2022 70 posts
Incredible 🔥🔥🔥🔥🔥🔥🔥
trophy 1205
Aug 2022 76 posts
Lovely 🥰
trophy 305
Oct 2021 20 posts
Yipee
trophy 1065
Sep 2022 21 posts
So cool
trophy 605
Feb 2024 21 posts
yesss new prefab  system!!!!
trophy 240
Jul 2022 1 post
I like it
trophy 1175
Sep 2021 1 post
my beloved
trophy 285
Jul 2023 22 posts
Love it!
trophy 505
Oct 2021 64 posts
So awesome! Excited to see sandbox mode started up soon.
trophy 0
Jul 2024 9 posts
Interesting idea about having prefabs work like interfaces. It sounds a lot like how HTML allows you to add new elements, you can define them but then hide everything so you just get a clean HTML tag with attributes, which hides the shadow DOM stuff.

With my Unity prefabs I tend to give them a dedicated script on the root object that controls any configurable properties for that prefab.

So maybe a good compromise solution here would be to add a prefab setting that locks all configuration for any prefab setting except the root object and its scripts and their properties. So you can still move it around or scale or rotate it or configure any properties on any script on the root.

This would be more of a developer control to indicate intent. Like controlling code styling. A dev could still go into the prefab itself and turn it off.
trophy 20
Dec 2022 1 post
big swag, thank you all !
trophy 1030
Sep 2021 77 posts
I've been wanting normal prefabs for a long time, and now there's the announcement of Sandbox Game (I remember Garry saying that s&box would be released after Sandbox Game). Thank you very much, good job.

Once I'm done with work, I'll go back to making games in s&box. All that's left is standalone export in Steam and private server code, and this summer is sure to be wonderful 💪
trophy 35
Apr 2025 1 post
The honesty of Facepunch is peak. "We did something new... but it sucked, so we removed it and did what everyone wanted." is way better than "We made the great decision to reimagine our PreFab System(TM) to give developers the best experience possible."
trophy 65
Oct 2022 1 post
Рад добавлению before, after в UI
people
Log in to reply
You can't reply if you're not logged in. That would be crazy.