
I recently implemented an in-game options menu in Unity. Mine looks something like the thing above. A surprising amount of the required functionality is already implemented in Unity, you just have to write some code to hook into it. In the cases when Unity didn't already have a static variable for a particular setting, like mouse sensitivity or menu language, then I'd implement my own static variable that worked with a specific PlayerPrefs key.
Anyway, here's a bunch of workflow / specific API calls that I found very useful when I did it...
- Create a separate UI Canvas for your options menu, then save that whole object as your menu prefab. You can now instantiate this menu prefab into every game scene with minimal mess.
- For in-game master volume, use AudioListener.volume
- To pause in-game sounds, use AudioListener.pause = true; don't forget to unpause the sound if you exit the menu or change the current scene.
- To pause in-game action, use Time.timeScale = 0f; again, don't forget to reset it if you exit the menu or change the current scene.
- For an in-game brightness / gamma correction slider, I used a simple fullscreen shader. The built-in color correction Image Effects were kind of overkill for this, so I went with the simpler implementation by willywill here. (I've also archived the files as a public Gist here.)
- When detecting the user's screen resolution, be careful: Screen.currentResolution is the full screen resolution, but Screen.width and height is the actual window size.
- I would recommend letting the user change graphics quality only from the main menu, and not in the pause menu, since it's expensive to call QualitySettings.SetQualityLevel( ) sometimes.
- You can detect the user's OS language with Application.systemLanguage, but then you're kind of stuck with using Unity's SystemLanguage enum which doesn't have many options.
- If you are using PlayerPrefs, you can call PlayerPrefs.DeleteAll( ) to give the user the option to easily clear all their game data.
- If you're making something for Steam, the most used Unity wrapper is probably Riley Labrecque's Steamworks.NET here.