Note: I cleared the lightmap before I uploaded the project because it doubled the size of the project. So remember to bake it again when you open the project.
Here’s some of the key features:
- Can be used with mouse, keyboard or gamepad. It probably works just fine with touch as well seeing as that is pretty much the same as a mouse.
- Let’s you choose graphics presets or customize everything just the way you want it with what I feel is the most intuitive approach I’ve seen in any game. The game environment is visible at all times and every setting updates immediately giving you instant feedback on what it does.
- Every setting clearly shows what it’s currently set to and what its min and max values are. No guesswork involved like in a lot of games where “Ultra” is the highest for some settings, but others just go to “High”. Or games which only show the current setting with a previous/next arrow forcing you to click the next arrow for every single setting just to be sure they are maxed out, or even worse, doing so makes them loop back around to the lowest setting, arrgh.
- The code is broken up into separate classes per graphics setting which lets you easily add new graphics settings and set their defaults per preset. I still have some more work to do here with a namespace perhaps and some other stuff, but it’s a good starting point.
- A field of view slider which clearly states that it’s vertical field of view, but also shows the current horizontal field of view for your screen setup. Total Biscuit would be proud. It even goes from zero to infinity, pretty much.
- Audio sliders for everything you want which are mapped logarithmically to the audio mixer giving you a natural volume curve from min to max.
- Mouseover and click sounds for everything, and tick sounds when you increase/decrease the sliders.
- Keeps track of the selected UI element. Moving your mouse pointer over an element selects it for the keyboard so pressing up on the keyboard continues from that element. Remembers which button you clicked to open a panel and selects it again when you return.
- The scroll view can be scrolled both with a keyboard and a gamepad.
- Includes my brightness slider image effect which is the first image effect I’ve ever made. It’s extremely simple, but still very useful.

Try it out or download the entire project from the link above. Hope you like it, and I hope you use it in one form or another in your own project. I see way too many Unity projects use the default launcher. No more, I say! Customize or go home!
The only thing I ask in return for your time is that you critique it a bit. Both the menu itself and my code. I learned a lot of new stuff with this project and I tried even more new stuff. ![]()
And last, but not least. Some questions I hope you can help me with:
- Soft particles can’t be set through script?
- Shadow quality can’t be set through script?
- Shadows ON, soft, hard can’t be set through script?
- Do you still need a third party solution to remap controls runtime in Unity?
Ohh, and there’s a few things I made a note about when I was making this project:
-
Calling Select() on a selectable doesn’t invoke OnSelect() This seems a bit odd to me.
-
Color Swap should really be an option for color transition in addition to Color Tint. I had to implement my own. A neat effect I use often in web design is to have an invisible button which turns opaque on mouseover. You can’t tint something invisible.
That’s why swapping colors is preferable. And it’s much easier to work with I feel. I don’t know what the end result would be if I applied a red tint to a green button - brown? I would much rather have the button fade from green to red. -
This isn’t related to the UI system, but working with prefabs can be really scary. Especially if you make a lot of changes to each instance. I was considering making just the “base” of a panel into a prefab, with the content unique per instance, but then if I accidentally hit “Revert” on a panel I would lose all the content in it. My sliders, buttons etc. are instances now, but if you accidentally revert one of them you lose a lot of customization. Should perhaps be able to lock the instance or something.
