From b7893fb83352ce41cad38d4a84ca62be4d678081 Mon Sep 17 00:00:00 2001 From: iliaakm Date: Thu, 9 Jul 2020 13:34:57 +0300 Subject: [PATCH 1/2] fix --- .../Scripts/Controller/GraphicSettingsHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/NewResolutionDialog/Scripts/Controller/GraphicSettingsHandler.cs b/Assets/NewResolutionDialog/Scripts/Controller/GraphicSettingsHandler.cs index 1bc9ff5..95b0bb1 100644 --- a/Assets/NewResolutionDialog/Scripts/Controller/GraphicSettingsHandler.cs +++ b/Assets/NewResolutionDialog/Scripts/Controller/GraphicSettingsHandler.cs @@ -207,7 +207,7 @@ void PopulateMonitorDropdown() { var display = Display.displays[i]; - var displayString = "Diplay " + (i + 1) + " (" + GetResolutionString(display.systemWidth, display.systemHeight) + ")"; + var displayString = "Display " + (i + 1) + " (" + GetResolutionString(display.systemWidth, display.systemHeight) + ")"; var option = new Dropdown.OptionData(displayString); options.Add(option); From 1b92a413be70ab68a2a223a5dd2b541fac3cdc51 Mon Sep 17 00:00:00 2001 From: iliaakm Date: Thu, 9 Jul 2020 14:24:43 +0300 Subject: [PATCH 2/2] Add Display Save Feature Selected display saves in PlayerPref --- .../Controller/GraphicSettingsHandler.cs | 807 +++++++++--------- 1 file changed, 406 insertions(+), 401 deletions(-) diff --git a/Assets/NewResolutionDialog/Scripts/Controller/GraphicSettingsHandler.cs b/Assets/NewResolutionDialog/Scripts/Controller/GraphicSettingsHandler.cs index 95b0bb1..9d3ef73 100644 --- a/Assets/NewResolutionDialog/Scripts/Controller/GraphicSettingsHandler.cs +++ b/Assets/NewResolutionDialog/Scripts/Controller/GraphicSettingsHandler.cs @@ -1,512 +1,517 @@ using System.Collections; using System.Collections.Generic; -using System.Security.Cryptography; using System.Text; using UnityEngine; using UnityEngine.UI; #pragma warning disable 0649 -public class GraphicSettingsHandler : MonoBehaviour +namespace NewResolutionDialog.Scripts.Controller { - #region Fields and Stuff - [SerializeField] Dropdown resolution; - [SerializeField] Dropdown refreshRate; - [SerializeField] Dropdown fullScreenMode; - [SerializeField] Dropdown vSync; - [SerializeField] Text vSyncNote; - [SerializeField] Dropdown quality; - [SerializeField] Dropdown display; - [SerializeField] Text displayNote; - - static readonly string hzSuffix = " Hz"; - static readonly string prefsKey_RefreshRate = "NewResolutionDialog_RefreshRate"; - static readonly string prefsKey_VSyncCount = "NewResolutionDialog_vSyncCount"; - - Dictionary> refreshRates = new Dictionary>(); - bool updatingDialog = true; - #endregion - - #region Dialog Getters - string GetSelectedResolution() - { - return resolution.options[resolution.value].text; - } - string GetResolutionString() - { - return GetResolutionString(Screen.width, Screen.height); - } - string GetResolutionString(int w, int h) - { - return string.Format("{0}x{1}", w, h); - } + public class GraphicSettingsHandler : MonoBehaviour + { + #region Fields and Stuff + [SerializeField] Dropdown resolution; + [SerializeField] Dropdown refreshRate; + [SerializeField] Dropdown fullScreenMode; + [SerializeField] Dropdown vSync; + [SerializeField] Text vSyncNote; + [SerializeField] Dropdown quality; + [SerializeField] Dropdown display; + [SerializeField] Text displayNote; + + static readonly string hzSuffix = " Hz"; + static readonly string prefsKey_RefreshRate = "NewResolutionDialog_RefreshRate"; + static readonly string prefsKey_VSyncCount = "NewResolutionDialog_vSyncCount"; + + Dictionary> refreshRates = new Dictionary>(); + bool updatingDialog = true; + #endregion + + #region Dialog Getters + string GetSelectedResolution() + { + return resolution.options[resolution.value].text; + } + string GetResolutionString() + { + return GetResolutionString(Screen.width, Screen.height); + } + string GetResolutionString(int w, int h) + { + return string.Format("{0}x{1}", w, h); + } - string GetSelectedRefreshRate() - { - return refreshRate.options[refreshRate.value].text.Replace(hzSuffix, ""); - } + string GetSelectedRefreshRate() + { + return refreshRate.options[refreshRate.value].text.Replace(hzSuffix, ""); + } - FullScreenMode GetSelectedFullScreenMode() - { - var mode = (FullScreenMode)fullScreenMode.value; + FullScreenMode GetSelectedFullScreenMode() + { + var mode = (FullScreenMode)fullScreenMode.value; - // In the dropdown "MaximizedWindow" (#2 in enum) was removed because it ain't working, it is now "Windowed" (#3 in enum), hence this fix - // see: https://issuetracker.unity3d.com/issues/fullscreen-mode-maximized-window-functionality-is-broken-and-any-built-player-changes-to-non-window-mode-when-maximizing - if (mode == FullScreenMode.MaximizedWindow) - mode = FullScreenMode.Windowed; + // In the dropdown "MaximizedWindow" (#2 in enum) was removed because it ain't working, it is now "Windowed" (#3 in enum), hence this fix + // see: https://issuetracker.unity3d.com/issues/fullscreen-mode-maximized-window-functionality-is-broken-and-any-built-player-changes-to-non-window-mode-when-maximizing + if (mode == FullScreenMode.MaximizedWindow) + mode = FullScreenMode.Windowed; - return mode; - } - #endregion + return mode; + } + #endregion - #region Debug - void LogRefreshRates() - { - var sb = new StringBuilder("\n"); - foreach (var kvp in refreshRates) + #region Debug + void LogRefreshRates() { - sb.AppendFormat("{0} => ", kvp.Key); - foreach (var hz in kvp.Value) + var sb = new StringBuilder("\n"); + foreach (var kvp in refreshRates) { - sb.AppendFormat("{0}, ", hz); + sb.AppendFormat("{0} => ", kvp.Key); + foreach (var hz in kvp.Value) + { + sb.AppendFormat("{0}, ", hz); + } + sb.Append("\n"); } + sb.Append("\n"); + Debug.Log(sb); } + #endregion - sb.Append("\n"); - Debug.Log(sb); - } - #endregion - - #region Unity Startup - void Awake() - { - displayNote.gameObject.SetActive(false); - vSyncNote.gameObject.SetActive(false); - - var hz = PlayerPrefs.GetInt(prefsKey_RefreshRate, 0); - if (hz != 0) + #region Unity Startup + void Awake() { - if (hz != Screen.currentResolution.refreshRate) + displayNote.gameObject.SetActive(false); + vSyncNote.gameObject.SetActive(false); + + var hz = PlayerPrefs.GetInt(prefsKey_RefreshRate, 0); + if (hz != 0) { - SetResolution(Screen.width, Screen.height, Screen.fullScreenMode, PlayerPrefs.GetInt(prefsKey_RefreshRate, 0)); - UpdateDialogAfterEndOfFrame(); + if (hz != Screen.currentResolution.refreshRate) + { + SetResolution(Screen.width, Screen.height, Screen.fullScreenMode, PlayerPrefs.GetInt(prefsKey_RefreshRate, 0)); + UpdateDialogAfterEndOfFrame(); + } } - } - var vSyncCount = PlayerPrefs.GetInt(prefsKey_VSyncCount, QualitySettings.vSyncCount); - if (vSyncCount != QualitySettings.vSyncCount) - QualitySettings.vSyncCount = PlayerPrefs.GetInt(prefsKey_VSyncCount, QualitySettings.vSyncCount); - } + var vSyncCount = PlayerPrefs.GetInt(prefsKey_VSyncCount, QualitySettings.vSyncCount); + if (vSyncCount != QualitySettings.vSyncCount) + QualitySettings.vSyncCount = PlayerPrefs.GetInt(prefsKey_VSyncCount, QualitySettings.vSyncCount); + } - void OnEnable() - { - PopulateDropdowns(); - ApplyCurrentSettingsToDialog(); - UpdateDialogInteractability(); - } - #endregion + void OnEnable() + { + PopulateDropdowns(); + ApplyCurrentSettingsToDialog(); + UpdateDialogInteractability(); + } + #endregion - #region PopulateDropdowns - void PopulateDropdowns() - { - PopulateResolutionsDropdown(); - PopulateRefresRateDropdown(); - PopulateQualityDropdown(); - PopulateMonitorDropdown(); - } + #region PopulateDropdowns + void PopulateDropdowns() + { + PopulateResolutionsDropdown(); + PopulateRefresRateDropdown(); + PopulateQualityDropdown(); + PopulateMonitorDropdown(); + } - void PopulateResolutionsDropdown() - { - refreshRates.Clear(); - resolution.ClearOptions(); - var options = new List(); - var resolutions = Screen.resolutions; - var isWindowed = Screen.fullScreenMode == FullScreenMode.Windowed; - var isFullScreenWindow = Screen.fullScreenMode == FullScreenMode.FullScreenWindow; - var systemWidth = Display.main.systemWidth; - var systemHeight = Display.main.systemHeight; - - foreach (var res in resolutions) - { - var resParts = res.ToString().Split(new char[] { 'x', '@', 'H' }); - var width = int.Parse(resParts[0].Trim()); - var height = int.Parse(resParts[1].Trim()); - - // skip resolutions that won't fit in windowed modes - if (isWindowed && (width >= systemWidth || height >= systemHeight)) - continue; - if (isFullScreenWindow && (width > systemWidth || height > systemHeight)) - continue; - - // resolution - var resString = GetResolutionString(width, height); - if (refreshRates.ContainsKey(resString) == false) + void PopulateResolutionsDropdown() + { + refreshRates.Clear(); + resolution.ClearOptions(); + var options = new List(); + var resolutions = Screen.resolutions; + var isWindowed = Screen.fullScreenMode == FullScreenMode.Windowed; + var isFullScreenWindow = Screen.fullScreenMode == FullScreenMode.FullScreenWindow; + var systemWidth = Display.main.systemWidth; + var systemHeight = Display.main.systemHeight; + + foreach (var res in resolutions) { - refreshRates.Add(resString, new List()); - var option = new Dropdown.OptionData(resString); - options.Add(option); + var resParts = res.ToString().Split(new char[] { 'x', '@', 'H' }); + var width = int.Parse(resParts[0].Trim()); + var height = int.Parse(resParts[1].Trim()); + + // skip resolutions that won't fit in windowed modes + if (isWindowed && (width >= systemWidth || height >= systemHeight)) + continue; + if (isFullScreenWindow && (width > systemWidth || height > systemHeight)) + continue; + + // resolution + var resString = GetResolutionString(width, height); + if (refreshRates.ContainsKey(resString) == false) + { + refreshRates.Add(resString, new List()); + var option = new Dropdown.OptionData(resString); + options.Add(option); + } + + // refresh rates without 'Hz' suffix + var hz = resParts[2].Trim(); + refreshRates[resString].Add(hz); } - // refresh rates without 'Hz' suffix - var hz = resParts[2].Trim(); - refreshRates[resString].Add(hz); + resolution.AddOptions(options); } + void PopulateRefresRateDropdown() + { + refreshRate.ClearOptions(); + var options = new List(); - resolution.AddOptions(options); - } - void PopulateRefresRateDropdown() - { - refreshRate.ClearOptions(); - var options = new List(); + var selectedRes = GetResolutionString(); - var selectedRes = GetResolutionString(); + if (refreshRates.ContainsKey(selectedRes)) + { + var refreshRatesForCurrentRes = refreshRates[selectedRes]; - if (refreshRates.ContainsKey(selectedRes)) - { - var refreshRatesForCurrentRes = refreshRates[selectedRes]; + foreach (var hz in refreshRatesForCurrentRes) + { + var option = new Dropdown.OptionData(hz + hzSuffix); + options.Add(option); + } - foreach (var hz in refreshRatesForCurrentRes) - { - var option = new Dropdown.OptionData(hz + hzSuffix); - options.Add(option); + refreshRate.AddOptions(options); } - - refreshRate.AddOptions(options); } - } - - void PopulateQualityDropdown() - { - var options = new List(); - Dropdown.OptionData currentOption = null; - var currentLevel = QualitySettings.GetQualityLevel(); - var qualityLevels = QualitySettings.names; - foreach (var quality in qualityLevels) + void PopulateQualityDropdown() { - var option = new Dropdown.OptionData(quality); - options.Add(option); + var options = new List(); - // remember initial quality level - if (quality == qualityLevels[currentLevel]) - currentOption = option; - } + Dropdown.OptionData currentOption = null; + var currentLevel = QualitySettings.GetQualityLevel(); + var qualityLevels = QualitySettings.names; + foreach (var quality in qualityLevels) + { + var option = new Dropdown.OptionData(quality); + options.Add(option); - quality.ClearOptions(); - quality.AddOptions(options); - } + // remember initial quality level + if (quality == qualityLevels[currentLevel]) + currentOption = option; + } - void PopulateMonitorDropdown() - { - display.ClearOptions(); - var options = new List(); + quality.ClearOptions(); + quality.AddOptions(options); + } - Dropdown.OptionData currentOption = null; - for (int i = 0; i < Display.displays.Length; i++) + void PopulateMonitorDropdown() { - var display = Display.displays[i]; - - var displayString = "Display " + (i + 1) + " (" + GetResolutionString(display.systemWidth, display.systemHeight) + ")"; - var option = new Dropdown.OptionData(displayString); - options.Add(option); + display.ClearOptions(); + var options = new List(); - // select active display - if (display.active) - currentOption = option; - } + Dropdown.OptionData currentOption = null; + for (int i = 0; i < Display.displays.Length; i++) + { + var display = Display.displays[i]; - display.AddOptions(options); - } - #endregion + var displayString = "Display " + (i + 1) + " (" + GetResolutionString(display.systemWidth, display.systemHeight) + ")"; + var option = new Dropdown.OptionData(displayString); + options.Add(option); - #region UpdateDialogWithCurrentSettings - void ApplyCurrentSettingsToDialog() - { - updatingDialog = true; + // select active display + if (display.active) + currentOption = option; + } - SelectCurrentResolutionDropdownItem(); - SelectCurrentRefreshRateDropdownItem(); - SelectCurrentFullScreenModeDropdownItem(); - SelectCurrentVSyncCountDropdownItem(); - SelectCurrentQualityLevelDropdownItem(); - SelectCurrentDisplayDropdownItem(); + display.AddOptions(options); + } + #endregion - updatingDialog = false; - } + #region UpdateDialogWithCurrentSettings + void ApplyCurrentSettingsToDialog() + { + updatingDialog = true; - void SelectCurrentResolutionDropdownItem() - { - // select highest by default - resolution.value = resolution.options.Count - 1; + SelectCurrentResolutionDropdownItem(); + SelectCurrentRefreshRateDropdownItem(); + SelectCurrentFullScreenModeDropdownItem(); + SelectCurrentVSyncCountDropdownItem(); + SelectCurrentQualityLevelDropdownItem(); + SelectCurrentDisplayDropdownItem(); - var res = GetResolutionString(); - for (int i = 0; i < resolution.options.Count; i++) - { - if (resolution.options[i].text == res) - { - resolution.value = i; - break; - } + updatingDialog = false; } - } - - void SelectCurrentRefreshRateDropdownItem() - { - // try to find closest Hz - var hz = Screen.currentResolution.refreshRate; - var closestDiff = int.MaxValue; - var closestOptionIndex = refreshRate.options.Count - 1; - for (int i = 0; i < refreshRate.options.Count; i++) + void SelectCurrentResolutionDropdownItem() { - var optionHz = int.Parse(refreshRate.options[i].text.Replace(hzSuffix, "")); - var diff = Mathf.Abs(hz - optionHz); - if (diff < closestDiff) + // select highest by default + resolution.value = resolution.options.Count - 1; + + var res = GetResolutionString(); + for (int i = 0; i < resolution.options.Count; i++) { - closestDiff = diff; - closestOptionIndex = i; - if (closestDiff == 0) + if (resolution.options[i].text == res) + { + resolution.value = i; break; + } } } - refreshRate.value = closestOptionIndex; - } + void SelectCurrentRefreshRateDropdownItem() + { + // try to find closest Hz + var hz = Screen.currentResolution.refreshRate; - void SelectCurrentFullScreenModeDropdownItem() - { - var mode = Screen.fullScreenMode; - if (Screen.fullScreenMode == FullScreenMode.MaximizedWindow) - mode = FullScreenMode.FullScreenWindow; + var closestDiff = int.MaxValue; + var closestOptionIndex = refreshRate.options.Count - 1; + for (int i = 0; i < refreshRate.options.Count; i++) + { + var optionHz = int.Parse(refreshRate.options[i].text.Replace(hzSuffix, "")); + var diff = Mathf.Abs(hz - optionHz); + if (diff < closestDiff) + { + closestDiff = diff; + closestOptionIndex = i; + if (closestDiff == 0) + break; + } + } - fullScreenMode.value = (int)mode; - } + refreshRate.value = closestOptionIndex; + } - void SelectCurrentVSyncCountDropdownItem() - { - vSync.value = QualitySettings.vSyncCount; + void SelectCurrentFullScreenModeDropdownItem() + { + var mode = Screen.fullScreenMode; + if (Screen.fullScreenMode == FullScreenMode.MaximizedWindow) + mode = FullScreenMode.FullScreenWindow; - // push a fair warning to users disabling vsync ignoring freesync/gsync users for whom this setting makes sense - // in the majority of use cases, particularly on battery-powered devices, turning vsync off is detrimental to battery life and comfort (excess heat, noise) - vSyncNote.gameObject.SetActive(QualitySettings.vSyncCount == 0); - } + fullScreenMode.value = (int)mode; + } - void SelectCurrentQualityLevelDropdownItem() - { - quality.value = QualitySettings.GetQualityLevel(); - } - void SelectCurrentDisplayDropdownItem() - { - // take the first active display - for (int i = 0; i < Display.displays.Length; i++) + void SelectCurrentVSyncCountDropdownItem() { - if (Display.displays[i].active) - { - display.value = i; - break; - } + vSync.value = QualitySettings.vSyncCount; + + // push a fair warning to users disabling vsync ignoring freesync/gsync users for whom this setting makes sense + // in the majority of use cases, particularly on battery-powered devices, turning vsync off is detrimental to battery life and comfort (excess heat, noise) + vSyncNote.gameObject.SetActive(QualitySettings.vSyncCount == 0); } - } - #endregion - #region UpdateInteractability - void UpdateDialogInteractability() - { - if (Application.isEditor) + void SelectCurrentQualityLevelDropdownItem() { - // in editor mode these settings are not applicable, some can be changed through the game view's settings (ie resolution) - resolution.interactable = false; // change this through game view - SetRefreshRateInteractable(false); // not applicable, always refresh rate of desktop - fullScreenMode.interactable = false; // not applicable, always "windowed" - vSync.interactable = false; // not applicable, vsync has no effect in editor mode - quality.interactable = quality.options.Count > 1; // interactable if there is more than one quality level to select from - display.interactable = false; // not applicable, same display as editor runs on unless game view is detached + quality.value = QualitySettings.GetQualityLevel(); } - else + void SelectCurrentDisplayDropdownItem() { - resolution.interactable = true; // always interactable - SetRefreshRateInteractable(Screen.fullScreenMode == FullScreenMode.ExclusiveFullScreen); // only in fullscreen mode, the window modes use desktop refresh rate - fullScreenMode.interactable = true; // always interactable - vSync.interactable = true; // always interactable - quality.interactable = quality.options.Count > 1; // interactable if there is more than one quality level to select from - display.interactable = display.options.Count > 1; // only interactable if there are multiple displays + // take the first active display + for (int i = 0; i < Display.displays.Length; i++) + { + if (Display.displays[i].active) + { + display.value = i; + break; + } + } } - } + #endregion - void SetRefreshRateInteractable(bool interactable) - { - if (!interactable) + #region UpdateInteractability + void UpdateDialogInteractability() { - refreshRate.ClearOptions(); - refreshRate.AddOptions(new List() { "N/A" }); + if (Application.isEditor) + { + // in editor mode these settings are not applicable, some can be changed through the game view's settings (ie resolution) + resolution.interactable = false; // change this through game view + SetRefreshRateInteractable(false); // not applicable, always refresh rate of desktop + fullScreenMode.interactable = false; // not applicable, always "windowed" + vSync.interactable = false; // not applicable, vsync has no effect in editor mode + quality.interactable = quality.options.Count > 1; // interactable if there is more than one quality level to select from + display.interactable = false; // not applicable, same display as editor runs on unless game view is detached + } + else + { + resolution.interactable = true; // always interactable + SetRefreshRateInteractable(Screen.fullScreenMode == FullScreenMode.ExclusiveFullScreen); // only in fullscreen mode, the window modes use desktop refresh rate + fullScreenMode.interactable = true; // always interactable + vSync.interactable = true; // always interactable + quality.interactable = quality.options.Count > 1; // interactable if there is more than one quality level to select from + display.interactable = display.options.Count > 1; // only interactable if there are multiple displays + } } - // only allow interactable if there are multiple refresh rates to select from - refreshRate.interactable = interactable && refreshRates[GetResolutionString()].Count > 1; - } - #endregion + void SetRefreshRateInteractable(bool interactable) + { + if (!interactable) + { + refreshRate.ClearOptions(); + refreshRate.AddOptions(new List() { "N/A" }); + } - #region Event Handlers - public void OnResolutionChanged() - { - if (updatingDialog) - return; + // only allow interactable if there are multiple refresh rates to select from + refreshRate.interactable = interactable && refreshRates[GetResolutionString()].Count > 1; + } + #endregion - ApplySelectedResolution(); - UpdateDialogAfterEndOfFrame(); - } + #region Event Handlers + public void OnResolutionChanged() + { + if (updatingDialog) + return; - public void OnRefreshRateChanged() - { - if (updatingDialog) - return; + ApplySelectedResolution(); + UpdateDialogAfterEndOfFrame(); + } - int hz = 0; - int.TryParse(GetSelectedRefreshRate(), out hz); - PlayerPrefs.SetInt(prefsKey_RefreshRate, hz); + public void OnRefreshRateChanged() + { + if (updatingDialog) + return; - ApplySelectedResolution(); - UpdateDialogAfterEndOfFrame(); - } + int hz = 0; + int.TryParse(GetSelectedRefreshRate(), out hz); + PlayerPrefs.SetInt(prefsKey_RefreshRate, hz); - public void OnFullScreenModeChanged() - { - if (updatingDialog) - return; + ApplySelectedResolution(); + UpdateDialogAfterEndOfFrame(); + } - var wasWindowed = Screen.fullScreenMode == FullScreenMode.Windowed; + public void OnFullScreenModeChanged() + { + if (updatingDialog) + return; - var mode = GetSelectedFullScreenMode(); - Screen.fullScreenMode = mode; + var wasWindowed = Screen.fullScreenMode == FullScreenMode.Windowed; - if (mode == FullScreenMode.Windowed) - { - var selectedRes = GetSelectedResolution(); - var resolution = selectedRes.Split(new char[] { 'x' }); - var width = int.Parse(resolution[0]); - var height = int.Parse(resolution[1]); - var screenWidth = Display.main.systemWidth; - var screenHeight = Display.main.systemHeight; - //Debug.LogError("cur w/h: " + width + "x" + height + ", max w/h: " + screenWidth + "x" + screenHeight + ", Scr w/h: " + Screen.width + "x" + Screen.height + - // ", DspR w/h: " + Display.main.renderingWidth + "x" + Display.main.renderingHeight + ", DspS w/h: " + Display.main.systemWidth + "x" + Display.main.systemHeight); + var mode = GetSelectedFullScreenMode(); + Screen.fullScreenMode = mode; - if (width >= screenWidth || height >= screenHeight) + if (mode == FullScreenMode.Windowed) { - var closestWidth = screenWidth; - var closestHeight = screenHeight; - foreach (var res in Screen.resolutions) + var selectedRes = GetSelectedResolution(); + var resolution = selectedRes.Split(new char[] { 'x' }); + var width = int.Parse(resolution[0]); + var height = int.Parse(resolution[1]); + var screenWidth = Display.main.systemWidth; + var screenHeight = Display.main.systemHeight; + //Debug.LogError("cur w/h: " + width + "x" + height + ", max w/h: " + screenWidth + "x" + screenHeight + ", Scr w/h: " + Screen.width + "x" + Screen.height + + // ", DspR w/h: " + Display.main.renderingWidth + "x" + Display.main.renderingHeight + ", DspS w/h: " + Display.main.systemWidth + "x" + Display.main.systemHeight); + + if (width >= screenWidth || height >= screenHeight) { - if (res.width < screenWidth && res.height < screenHeight) + var closestWidth = screenWidth; + var closestHeight = screenHeight; + foreach (var res in Screen.resolutions) { - closestWidth = res.width; - closestHeight = res.height; + if (res.width < screenWidth && res.height < screenHeight) + { + closestWidth = res.width; + closestHeight = res.height; + } } - } - // set to resolution closest to desktop, just one below desktop res - SetResolution(closestWidth, closestHeight, mode, 0); - } - else - { - ApplySelectedResolution(); + // set to resolution closest to desktop, just one below desktop res + SetResolution(closestWidth, closestHeight, mode, 0); + } + else + { + ApplySelectedResolution(); + } } - } - /* + /* else if (wasWindowed) { // reset to native/desktop resolution SetResolution(Display.main.systemWidth, Display.main.systemHeight, mode, 0); } */ - else - { - ApplySelectedResolution(); - } - - UpdateDialogAfterEndOfFrame(); - } + else + { + ApplySelectedResolution(); + } - public void OnVSyncChanged() - { - if (updatingDialog) - return; + UpdateDialogAfterEndOfFrame(); + } - QualitySettings.vSyncCount = vSync.value; - PlayerPrefs.SetInt(prefsKey_VSyncCount, vSync.value); - UpdateDialogAfterEndOfFrame(); - } + public void OnVSyncChanged() + { + if (updatingDialog) + return; - public void OnQualityLevelChanged() - { - if (updatingDialog) - return; + QualitySettings.vSyncCount = vSync.value; + PlayerPrefs.SetInt(prefsKey_VSyncCount, vSync.value); + UpdateDialogAfterEndOfFrame(); + } - var selectedText = quality.options[quality.value].text; - QualitySettings.SetQualityLevel(new List(QualitySettings.names).IndexOf(selectedText), true); - QualitySettings.vSyncCount = vSync.value; // reset vsync setting as it may be affected by quality level + public void OnQualityLevelChanged() + { + if (updatingDialog) + return; - UpdateDialogAfterEndOfFrame(); - } + var selectedText = quality.options[quality.value].text; + QualitySettings.SetQualityLevel(new List(QualitySettings.names).IndexOf(selectedText), true); + QualitySettings.vSyncCount = vSync.value; // reset vsync setting as it may be affected by quality level - public void OnMonitorChanged() - { - if (updatingDialog) - return; + UpdateDialogAfterEndOfFrame(); + } - // currently does not attempt to auto-restart application, it merely removes the Play button (via Inspector events) thus forcing user to restart - // for one, restarting would have to be coded separately for each platform - // secondly, "ForceSingleInstance" would prevent a clean restart from within the running app (ie requires external app or batch file to control restart) - displayNote.gameObject.SetActive(false); + public void OnMonitorChanged() + { + if (updatingDialog) + return; + + int displayIndex = display.value; + PlayerPrefs.SetInt("UnitySelectMonitor", displayIndex); + PlayerPrefs.Save(); + // currently does not attempt to auto-restart application, it merely removes the Play button (via Inspector events) thus forcing user to restart + // for one, restarting would have to be coded separately for each platform + // secondly, "ForceSingleInstance" would prevent a clean restart from within the running app (ie requires external app or batch file to control restart) + displayNote.gameObject.SetActive(false); + + UpdateDialogAfterEndOfFrame(); + } + #endregion - UpdateDialogAfterEndOfFrame(); - } - #endregion + #region Apply Changes + void ApplySelectedResolution() + { + // in case resolution changed, we need to check whether the Hz selection still applies for the new resolution + // if not we opt to go with the default '0' Hz + var selectedRes = GetSelectedResolution(); + var availableRefreshRates = refreshRates[selectedRes]; + var selectedHz = GetSelectedRefreshRate(); + if (selectedHz.Equals("N/A") || availableRefreshRates.Contains(selectedHz) == false) + selectedHz = "0"; - #region Apply Changes - void ApplySelectedResolution() - { - // in case resolution changed, we need to check whether the Hz selection still applies for the new resolution - // if not we opt to go with the default '0' Hz - var selectedRes = GetSelectedResolution(); - var availableRefreshRates = refreshRates[selectedRes]; - var selectedHz = GetSelectedRefreshRate(); - if (selectedHz.Equals("N/A") || availableRefreshRates.Contains(selectedHz) == false) - selectedHz = "0"; - - var resolution = selectedRes.Split(new char[] { 'x' }); - var width = int.Parse(resolution[0]); - var height = int.Parse(resolution[1]); - var hz = int.Parse(selectedHz); - SetResolution(width, height, GetSelectedFullScreenMode(), hz); - } + var resolution = selectedRes.Split(new char[] { 'x' }); + var width = int.Parse(resolution[0]); + var height = int.Parse(resolution[1]); + var hz = int.Parse(selectedHz); + SetResolution(width, height, GetSelectedFullScreenMode(), hz); + } - void SetResolution(int width, int height, FullScreenMode mode, int hz) - { - // prevent setting resolution multiple times when dialog is updated in the next frame - //Debug.LogError("DESIRED res: " + GetResolutionString(width, height) + " @ " + hz + " Hz in " + mode); - Screen.SetResolution(width, height, mode, hz); - QualitySettings.vSyncCount = vSync.value; // reset vsync setting as it may be affected by resolution - } - #endregion + void SetResolution(int width, int height, FullScreenMode mode, int hz) + { + // prevent setting resolution multiple times when dialog is updated in the next frame + //Debug.LogError("DESIRED res: " + GetResolutionString(width, height) + " @ " + hz + " Hz in " + mode); + Screen.SetResolution(width, height, mode, hz); + QualitySettings.vSyncCount = vSync.value; // reset vsync setting as it may be affected by resolution + } + #endregion - #region Update After Frame - void UpdateDialogAfterEndOfFrame() - { - StartCoroutine(UpdateDialogAfterEndOfFrameCoroutine()); - } + #region Update After Frame + void UpdateDialogAfterEndOfFrame() + { + StartCoroutine(UpdateDialogAfterEndOfFrameCoroutine()); + } - IEnumerator UpdateDialogAfterEndOfFrameCoroutine() - { - // must wait for end of this AND next frame for the new resolution to be applied - yield return new WaitForEndOfFrame(); - yield return new WaitForEndOfFrame(); - - //Debug.LogError("NEW Screen: " + Screen.width+ "x" + Screen.height + " (curRes: " + Screen.currentResolution.width + "x" + Screen.currentResolution.height + - // ", sysRes: " + Display.main.systemWidth + "x" + Display.main.systemHeight + ") @ " + Screen.currentResolution.refreshRate + " Hz in " + Screen.fullScreenMode); - PopulateDropdowns(); - ApplyCurrentSettingsToDialog(); - UpdateDialogInteractability(); + IEnumerator UpdateDialogAfterEndOfFrameCoroutine() + { + // must wait for end of this AND next frame for the new resolution to be applied + yield return new WaitForEndOfFrame(); + yield return new WaitForEndOfFrame(); + + //Debug.LogError("NEW Screen: " + Screen.width+ "x" + Screen.height + " (curRes: " + Screen.currentResolution.width + "x" + Screen.currentResolution.height + + // ", sysRes: " + Display.main.systemWidth + "x" + Display.main.systemHeight + ") @ " + Screen.currentResolution.refreshRate + " Hz in " + Screen.fullScreenMode); + PopulateDropdowns(); + ApplyCurrentSettingsToDialog(); + UpdateDialogInteractability(); + } + #endregion } - #endregion }