Quality Game Settings Menu, a good looking UI ready for use

Thank you very much!

Hey :slight_smile:

I have a little question about the apparence.

Do you think I can use the style of this ASSETif YES it is easy to do it ?

Thank you :wink:

It requires some work to modify the look of menu, since the buttons and sliders don’t reuse a common widget template.
Unreal 4.16 included UMG Preconstruct that will allow the settings menu to support such live templates, but I have not updated menu to make use of that yet.

To modify look of settings menu now, you have to select the items one by one and replace texture, text size, colors and so on.
On similar components, you can CTRL click multiple widgets, and change them all at once in detail panel. See part 7.7 of manual.

Thanks for your help :slight_smile:

I will check this in the week.

Hello @, I’m currently working on Survival horror game and it has “Zoom” by holding right mouse and when release it’s will back to normal camera it’s look like this

However it doesn’t work anymore after i put your setting into my project, I did add this in InputAction but still deosn’t work so i think it’s have to do with FOV option in setting maybe?
please tell me how to fix this i really want to kept this zooming in my game it’s really important! Thank you!!

Hi, Field of view, gamma, gain and bloom is overrided in camera modifier BP_SettingsCameraModifier.
You can modify this blueprint to add custom effects such as zoom.


When you “Add New Camera Modifier”, you can cast the return value and call the modifier when you want to apply an effect there.

Good evening, with 4.17 released, a few thing went awry with the settings menu. Some visual errors, and combobox dropdown list stopped working.
A quick patch has been submitted to marketplace team and should be live soon.

For those who already have added the settings menu and dont want to re-implement it for 4.17, you can follow these steps to patch the issues.

Open the project in UE 4.17
Open WB_ClassicSettingsMain

Select all checkbox in tabs.


Under Details Set all to toggle button. (This is then applied to all selected items)


Select all the size boxes


Set Horizontal Alignment to be filled


Select size box containing all menu tabs.


Set its padding to be 0


Download widget WB_ClassicComboBoxButton and put it in folder QualityMenu -> HUD_UMG_Classic -> UtilWidgets
Download Widget Link


Open WB_ClassicResolutionComboBox and WB_ClassicComboBoxItem and do the following for both.

Delete old button


Replace it with the downloaded WB_ClassicComboBoxButton


Set its horizontal and vertical alignment to fill


Set its visibility to “Visible”


Please contact me if you find any other issues with 4.17 update.

Got it! Thanks man!

Hi I updated my project from 4.15 to 4.17 and its not working for me. I tried this fix but I don’t think this is the issue I am having as I still get the below error.

Hi, do you have a custom game instance? This error usually appears when game instance has problems with the game settings variable it receives from game instance.

Can you confirm that your game instance is creating a “Game Settings Wrapper” during Init?


Then make sure the Game Settings Wrapper value is returned in “Get Settings Instance”.


If the problem is was not here, its most likely has encountered problems in creating save game object in “Init Game Settings”.
Please post or email me the output log so I can try to pinpoint the issue.


You can also try to update project from 4.15 to 4.16, and see if the same issue occurs there. The 4.15 to 4.16 transition should be seamless with settings menu.
If that was not a problem, then update it from 4.16 to 4.17 and see if the intermediate step helped.

Thanks that was it. I migrated the custom settings I made to a new 4.17 project. Forgot that I had to change the game instance.

@ I would like to know your advice on this… Last month your rep my question and i just realized that day the cinematic mode is not designed for real time games and i knew i’m f*cked up big time
because my whole game was made base on that setting so damnnnnnn…!! even i set to epic or lower than that the graphics looks like minecraft ****! some mesh are even dissappear and foliage was super close even i’m set everything to max (epic - 3) i don’t know where to start to fix this? could you give me an idea since you are very professional one

Thank you!

Ok, I have not used cinematic, so the following I say contains a bit of “guesstimates”.

Foliage density is affected by “Foliage Quality”, while “View Distance” limits how far you can see.
Assets and meshes inside Cull Volumes are also hidded by “View Distance”

In older versions of unreal, view distance was limited to max 1. So cull distance never exceeded maximum value. So the menu is coded to have max view distance of 1.
Since then unreal has been updated and can go beyond view distance “1” and exceed what the level designer set as foliage max cull distance.

If we check out “BaseScalability.ini” in C:\Program Files\Epic Games\UE_4.17\Engine\Config, we can see that foliage/view distance is multiplied by ten in cinematic.


[ViewDistanceQuality@0]r.SkeletalMeshLODBias=2
r.ViewDistanceScale=0.4


[ViewDistanceQuality@1]
r.SkeletalMeshLODBias=1
r.ViewDistanceScale=0.6


[ViewDistanceQuality@2]
r.SkeletalMeshLODBias=0
r.ViewDistanceScale=0.8


[ViewDistanceQuality@3]
r.SkeletalMeshLODBias=0
r.ViewDistanceScale=1.0


[ViewDistanceQuality@Cine]
r.SkeletalMeshLODBias=0
r.ViewDistanceScale=10.0

You have most likely designed your levels with this 10x multipler enabled.

We should be able to remap our view distance scale slider with this in mind.

The fastest way of doing it is in BP_GameSettings > Modify View Distance so anytime we set the view distance, it is multiplied by 10. (So “1” in settings menu is actually “10”)

Fixing other quality artifacts will require a bit more trial and error.

When settings menu changes between low-med-high-epic, it sends console commands for the related settings.

Example
“sg.EffectsQuality 0” (low)
“sg.EffectsQuality 1” (medium)
“sg.EffectsQuality 2” (high)
“sg.EffectsQuality 3” (epic)

“sg.EffectsQuality 4” is for cinematic quality.

These commands are really made up of several console commands, that you can customize for your game.

In BaseScalability.ini, you can find default values for these settings.
(When you see “EffectsQuality@Cine”, it is the same as “sg.EffectsQuality 4”)

BaseScalability.ini (In unreal 4.16)


;; Base scalability settings
; =========================
;
; The definitions here affect the console variables starting with "sg." and define the user quality levels (game/editor video settings)
; To override a specific platform use DeviceProfile.ini (whach out for the different syntax).
;
;-----------------------------------------------------------------------------------------------------------------


; Note: [ResolutionQuality] isn't using the usual 0/1/2/3 quality levels, the value directly maps to r.ScreenPercentage.
; This is because we want custom scaling aligned with the screen/window resolution with more fine grained control
;


;-----------------------------------------------------------------------------------------------------------------


[ScalabilitySettings]
; PerfIndexThresholds define the thresholds that determine what the autodetected quality should be for each group.
; When you auto detect performance, both a CPUIndex and GPUIndex are calculated on the machine.
; Use the console command "scalability auto" to print these values for a machine.
; The type of perfindex used to determine the quality for a group is either the GPU, CPU or Min.
; GPU means the quality is based on the speed of the graphics card. CPU means the quality is based on the processor, and Min means the group quality is based on the slower of either the CPU or GPU.
; Each group has a type followed by three numbers.
; The first number is the perfindex threshold that changes quality from 0 to 1. The second is the threshold from 1 to 2, the third is the threshold from 2 to 3.
PerfIndexThresholds_ResolutionQuality="GPU 18 42 115"
PerfIndexThresholds_ViewDistanceQuality="Min 18 42 105"
PerfIndexThresholds_AntiAliasingQuality="GPU 18 42 115"
PerfIndexThresholds_ShadowQuality="Min 18 42 105"
PerfIndexThresholds_PostProcessQuality="GPU 18 42 115"
PerfIndexThresholds_TextureQuality="GPU 18 42 115"
PerfIndexThresholds_EffectsQuality="Min 18 42 105"
PerfIndexThresholds_FoliageQuality="GPU 18 42 115"


; This is the screen percentage for the resolution quality, corresponding to 25% pixels, 50% pixels, 75% pixels, and 100% pixels
PerfIndexValues_ResolutionQuality="50 71 87 100 100"


[AntiAliasingQuality@0]
r.PostProcessAAQuality=0


[AntiAliasingQuality@1]
r.PostProcessAAQuality=2


[AntiAliasingQuality@2]
r.PostProcessAAQuality=3


[AntiAliasingQuality@3]
r.PostProcessAAQuality=4


[AntiAliasingQuality@Cine]
r.PostProcessAAQuality=6


;-----------------------------------------------------------------------------------------------------------------


[ViewDistanceQuality@0]
r.SkeletalMeshLODBias=2
r.ViewDistanceScale=0.4


[ViewDistanceQuality@1]
r.SkeletalMeshLODBias=1
r.ViewDistanceScale=0.6


[ViewDistanceQuality@2]
r.SkeletalMeshLODBias=0
r.ViewDistanceScale=0.8


[ViewDistanceQuality@3]
r.SkeletalMeshLODBias=0
r.ViewDistanceScale=1.0


[ViewDistanceQuality@Cine]
r.SkeletalMeshLODBias=0
r.ViewDistanceScale=10.0


;-----------------------------------------------------------------------------------------------------------------


[ShadowQuality@0]
r.LightFunctionQuality=0
r.ShadowQuality=0
r.Shadow.CSM.MaxCascades=1
r.Shadow.MaxResolution=512
r.Shadow.MaxCSMResolution=512
r.Shadow.RadiusThreshold=0.06
r.Shadow.DistanceScale=0.6
r.Shadow.CSM.TransitionScale=0
r.DistanceFieldShadowing=0
r.DistanceFieldAO=0
r.VolumetricFog=0
r.LightMaxDrawDistanceScale=0


[ShadowQuality@1]
r.LightFunctionQuality=1
r.ShadowQuality=3
r.Shadow.CSM.MaxCascades=1
r.Shadow.MaxResolution=1024
r.Shadow.MaxCSMResolution=1024
r.Shadow.RadiusThreshold=0.05
r.Shadow.DistanceScale=0.7
r.Shadow.CSM.TransitionScale=0.25
r.DistanceFieldShadowing=0
r.DistanceFieldAO=0
r.VolumetricFog=0
r.LightMaxDrawDistanceScale=.5


[ShadowQuality@2]
r.LightFunctionQuality=1
r.ShadowQuality=5
r.Shadow.CSM.MaxCascades=4
r.Shadow.MaxResolution=1024
r.Shadow.MaxCSMResolution=2048
r.Shadow.RadiusThreshold=0.04
r.Shadow.DistanceScale=0.85
r.Shadow.CSM.TransitionScale=0.8
r.DistanceFieldShadowing=1
r.DistanceFieldAO=1
r.VolumetricFog=1
r.VolumetricFog.GridPixelSize=16
r.VolumetricFog.GridSizeZ=64


[ShadowQuality@3]
r.LightFunctionQuality=1
r.ShadowQuality=5
r.Shadow.CSM.MaxCascades=10
r.Shadow.MaxResolution=2048
r.Shadow.MaxCSMResolution=2048
r.Shadow.RadiusThreshold=0.03
r.Shadow.DistanceScale=1.0
r.Shadow.CSM.TransitionScale=1.0
r.DistanceFieldShadowing=1
r.DistanceFieldAO=1
r.VolumetricFog=1
r.VolumetricFog.GridPixelSize=8
r.VolumetricFog.GridSizeZ=128


[ShadowQuality@Cine]
r.LightFunctionQuality=1
r.ShadowQuality=5
r.Shadow.CSM.MaxCascades=10
r.Shadow.MaxResolution=4096
r.Shadow.MaxCSMResolution=4096
r.Shadow.RadiusThreshold=0.03
r.Shadow.DistanceScale=1.0
r.Shadow.CSM.TransitionScale=1.0
r.DistanceFieldShadowing=1
r.DistanceFieldAO=1
r.VolumetricFog=1
r.VolumetricFog.GridPixelSize=4
r.VolumetricFog.GridSizeZ=128


;-----------------------------------------------------------------------------------------------------------------


[PostProcessQuality@0]
r.MotionBlurQuality=0
r.AmbientOcclusionMipLevelFactor=1.0
r.AmbientOcclusionMaxQuality=0
r.AmbientOcclusionLevels=0
r.AmbientOcclusionRadiusScale=1.2
r.DepthOfFieldQuality=0
r.RenderTargetPoolMin=300
r.LensFlareQuality=0
r.SceneColorFringeQuality=0
r.EyeAdaptationQuality=0
r.BloomQuality=4
r.FastBlurThreshold=0
r.Upscale.Quality=1
r.Tonemapper.GrainQuantization=0
r.LightShaftQuality=0
r.Filter.SizeScale=0.6
r.Tonemapper.Quality=0


[PostProcessQuality@1]
r.MotionBlurQuality=3
r.AmbientOcclusionMipLevelFactor=1.0
r.AmbientOcclusionMaxQuality=60
r.AmbientOcclusionLevels=-1
r.AmbientOcclusionRadiusScale=1.5
r.DepthOfFieldQuality=1
r.RenderTargetPoolMin=350
r.LensFlareQuality=0
r.SceneColorFringeQuality=0
r.EyeAdaptationQuality=0
r.BloomQuality=4
r.FastBlurThreshold=2
r.Upscale.Quality=2
r.Tonemapper.GrainQuantization=0
r.LightShaftQuality=0
r.Filter.SizeScale=0.7
r.Tonemapper.Quality=2


[PostProcessQuality@2]
r.MotionBlurQuality=3
r.AmbientOcclusionMipLevelFactor=0.6
r.AmbientOcclusionMaxQuality=100
r.AmbientOcclusionLevels=-1
r.AmbientOcclusionRadiusScale=1.5
r.DepthOfFieldQuality=2
r.RenderTargetPoolMin=400
r.LensFlareQuality=2
r.SceneColorFringeQuality=1
r.EyeAdaptationQuality=2
r.BloomQuality=5
r.FastBlurThreshold=3
r.Upscale.Quality=2
r.Tonemapper.GrainQuantization=1
r.LightShaftQuality=1
r.Filter.SizeScale=0.8
r.Tonemapper.Quality=5


[PostProcessQuality@3]
r.MotionBlurQuality=4
r.AmbientOcclusionMipLevelFactor=0.4
r.AmbientOcclusionMaxQuality=100
r.AmbientOcclusionLevels=-1
r.AmbientOcclusionRadiusScale=1.0
r.DepthOfFieldQuality=2
r.RenderTargetPoolMin=400
r.LensFlareQuality=2
r.SceneColorFringeQuality=1
r.EyeAdaptationQuality=2
r.BloomQuality=5
r.FastBlurThreshold=100
r.Upscale.Quality=3
r.Tonemapper.GrainQuantization=1
r.LightShaftQuality=1
r.Filter.SizeScale=1
r.Tonemapper.Quality=5


[PostProcessQuality@Cine]
r.MotionBlurQuality=4
r.AmbientOcclusionMipLevelFactor=0.4
r.AmbientOcclusionMaxQuality=100
r.AmbientOcclusionLevels=-1
r.AmbientOcclusionRadiusScale=1.0
r.DepthOfFieldQuality=4
r.RenderTargetPoolMin=1000
r.LensFlareQuality=3
r.SceneColorFringeQuality=1
r.EyeAdaptationQuality=2
r.BloomQuality=5
r.FastBlurThreshold=100
r.Upscale.Quality=3
r.Tonemapper.GrainQuantization=1
r.LightShaftQuality=1
r.Filter.SizeScale=1
r.Tonemapper.Quality=5


;-----------------------------------------------------------------------------------------------------------------


[TextureQuality@0]
r.Streaming.MipBias=1.5
r.MaxAnisotropy=0
r.Streaming.LimitPoolSizeToVRAM=1
r.Streaming.PoolSize=400
r.Streaming.MaxEffectiveScreenSize=0


[TextureQuality@1]
r.Streaming.MipBias=1
r.MaxAnisotropy=2
r.Streaming.LimitPoolSizeToVRAM=1
r.Streaming.PoolSize=600
r.Streaming.MaxEffectiveScreenSize=0


[TextureQuality@2]
r.Streaming.MipBias=0
r.MaxAnisotropy=4
r.Streaming.LimitPoolSizeToVRAM=1
r.Streaming.PoolSize=800
r.Streaming.MaxEffectiveScreenSize=0


[TextureQuality@3]
r.Streaming.MipBias=0
r.MaxAnisotropy=8
r.Streaming.LimitPoolSizeToVRAM=0
r.Streaming.PoolSize=1000
r.Streaming.MaxEffectiveScreenSize=0


[TextureQuality@Cine]
r.Streaming.MipBias=0
r.MaxAnisotropy=8
r.Streaming.LimitPoolSizeToVRAM=0
r.Streaming.PoolSize=3000
r.Streaming.MaxEffectiveScreenSize=0


;-----------------------------------------------------------------------------------------------------------------


[EffectsQuality@0]
r.TranslucencyLightingVolumeDim=24
r.RefractionQuality=0
r.SSR.Quality=0
r.SceneColorFormat=3
r.DetailMode=0
r.TranslucencyVolumeBlur=0
r.MaterialQualityLevel=0 ; Low quality
r.SSS.Scale=0
r.SSS.SampleSet=0
r.SSS.Quality=0
r.SSS.HalfRes=1
r.EmitterSpawnRateScale=0.125
r.ParticleLightQuality=0


[EffectsQuality@1]
r.TranslucencyLightingVolumeDim=32
r.RefractionQuality=0
r.SSR.Quality=0
r.SceneColorFormat=3
r.DetailMode=1
r.TranslucencyVolumeBlur=0
r.MaterialQualityLevel=2 ; Medium quality
r.SSS.Scale=0.75
r.SSS.SampleSet=0
r.SSS.Quality=0
r.SSS.HalfRes=1
r.EmitterSpawnRateScale=0.25
r.ParticleLightQuality=0


[EffectsQuality@2]
r.TranslucencyLightingVolumeDim=48
r.RefractionQuality=2
r.SSR.Quality=2
r.SceneColorFormat=3
r.DetailMode=1
r.TranslucencyVolumeBlur=1
r.MaterialQualityLevel=1 ; High quality
r.SSS.Scale=1
r.SSS.SampleSet=1
r.SSS.Quality=-1
r.SSS.HalfRes=1
r.EmitterSpawnRateScale=0.5
r.ParticleLightQuality=1


[EffectsQuality@3]
r.TranslucencyLightingVolumeDim=64
r.RefractionQuality=2
r.SSR.Quality=3
r.SceneColorFormat=4
r.DetailMode=2
r.TranslucencyVolumeBlur=1
r.MaterialQualityLevel=1 ; High quality
r.SSS.Scale=1
r.SSS.SampleSet=2
r.SSS.Quality=1
r.SSS.HalfRes=1
r.EmitterSpawnRateScale=1.0
r.ParticleLightQuality=2


[EffectsQuality@Cine]
r.TranslucencyLightingVolumeDim=64
r.RefractionQuality=2
r.SSR.Quality=4
r.SceneColorFormat=4
r.DetailMode=2
r.TranslucencyVolumeBlur=1
r.MaterialQualityLevel=1 ; High quality
r.SSS.Scale=1
r.SSS.SampleSet=2
r.SSS.Quality=1
r.SSS.HalfRes=0
r.EmitterSpawnRateScale=1.0
r.ParticleLightQuality=2


;-----------------------------------------------------------------------------------------------------------------


[FoliageQuality@0]
foliage.DensityScale=0
grass.DensityScale=0
;foliage.DiscardDataOnLoad=1 ; having this enabled will reduce ram use but will require reloading the level when changing FoliageQuality setting
;grass.DiscardDataOnLoad=1   ; having this enabled will reduce ram use but will require reloading the level when changing FoliageQuality setting


[FoliageQuality@1]
foliage.DensityScale=0.4
grass.DensityScale=0.4
;foliage.DiscardDataOnLoad=0
;grass.DiscardDataOnLoad=0


[FoliageQuality@2]
foliage.DensityScale=0.8
grass.DensityScale=0.8
;foliage.DiscardDataOnLoad=0
;grass.DiscardDataOnLoad=0


[FoliageQuality@3]
foliage.DensityScale=1.0
grass.DensityScale=1.0
;foliage.DiscardDataOnLoad=0
;grass.DiscardDataOnLoad=0


[FoliageQuality@Cine]
foliage.DensityScale=1.0
grass.DensityScale=1.0
;foliage.DiscardDataOnLoad=0
;grass.DiscardDataOnLoad=0




Now comes the heavy job. You need to figure out what what setting values from cinematic you need to keep when quality is lowered so it dont look broken.
In your projects config folder, create a new file called DefaultScalability.ini
In this file, we will override console commands for the different quality levels low-med-high-epic
You can read more details here:

This file does not work in editor, but when you package the game, the DefaultScalability.ini settings will be applied.
To find the right commands, you can reference BaseScalability.ini as mentioned above.

You can test out the commands by opening console in game and try them one by one.


If it works as expected, you can copy the same values from BaseScalability.ini to DefaultScalability.ini
If not, you have to apply the higher quality level to all steps in DefaultScalability.ini

These steps are usually done with the profiler to optimisme quality levels, to gain the best visuals to performance ratio on each game.

In your case, we need to find what “Cinematic” settings we need to keep.

Unfortunately, there is not much documentation on all console commands, and some interact with each others, so it can be a bit tiresome to figure out what affects your game.
I have not tested them all, so you have to guess a bit from the names. You can find information on a few of them here:
http://www.kosmokleaner.de/ownsoft/UE4CVarBrowser.html

Hope this will help you get the settings levels under some control.

@ Oh man that’s a big information there! I really apperciated this and I’d liket apologize for this too because it’s not about being cinemetic or not the cause why my graphics went to **** was “Texture Streaming pool over” and I found it just a second ago and here to report back but i’m stunt for the reply you gave it’s amazing such a useful inform!
anyway thanks alot and i have to clear that QGS is the best nothing is wrong with it but mostly fail or error happened by user (as me)
and again Thank you so much you are the most amazing supporter i’ve ever seen :smiley:

Hey There,
So I’m having issues with the QGS and I’m seeing if you know anything about these errors.
While trying to change keybinds I’m met with this error: Err: QualityMenu is missing Action Manager. Cannot remap keys. Please add ActionManager to Widget Creation.
I don’t know what its talking about here as I’m calling it when I launch the widget: Screenshot - fb8837bbbdd27e59b86933a75a0af389 - Gyazo
It also brings me to this Blueprint Part in WB_ClassicMappingItem: Screenshot - 3e00edb0199845c90b650d1b72f19bd1 - Gyazo and also gives these errors: Screenshot - 5e2379e08592e481fdc1f0248c6f010f - Gyazo

Thanks in advanced!

I see that you have made a custom widget “PMenu Base”. Please check that “PMenu Base” calls “Set Action Manager” on its “WB Classic Settings Keybinding” child widget during “Event Construct”.
“PMenu Base” don’t need the action manager, we only give it the component to forward it to “WB Classic Settings Keybinding”

@ this fixed my issue entirely. Thank you very much!

Hey ,

So something I’m looking into and I don’t know if the QGS has functionality of this yet, but is there any current way to get the input key down time of a key embedded in the QGS? I’m searching for functionality to get a certain key in the input list and basically “charge” up an ability.
Thanks,
Austin

Hello, sorry for the late answer, the remapping system does not have a built in timer system since a keybinding can consist of multiple keys, and input from both primary and secondary binding.

You should get be able to create a simple timer by starting a clock when the input is active, and reset it when its released. Then add frame delta seconds to that timer.


​​​​​​

Hello ,
I’m back with more question last time we talk about custom fov for zooming in game now I facing some problem you might help
As you can see in my screenshot I’m using Timline by set the FOV Timeline from 110 to 45 which mean when I’m click zoom it’s zoom from 110 to 45 right?

And here’s the problem… Whenever I set FOV in QGS 90,100,120 etc… whatever number is. When “click Zoom” to zooming from current number to 45 It’s does right! however when zoom was “release” it’s automaticly set QGS and whole FOV to 110 which was not my Intended to be from what i set and that’s come from FOV_Timeline but i can’t leave it 0 so how to makes it follow what user intended to setting the exact FOV in QGS

Thanks