Zer0Cool Geschrieben 1. Februar 2018 Melden Share Geschrieben 1. Februar 2018 Hallo zusammen, da von Kojote mal eine Anfrage zu diesem Thema kam: und das Ganze programmiertechnisch nicht ohne ist, habe ich mich einmal hingesetzt und eine Klasse geschrieben, die die Settings des Unity-Launcher aus der Windows-Registry sowohl ausliest als auch schreibt. Das Ganze kann man nun mit dem eigenen Qualitysettings-Dialog in seinem eigenen Spiel verknüpfen. Ich hoffe die Methode sind soweit selbsterklärend. Die Klasse funktioniert aktuell nur unter Windows. Der Vollbildmodus wird ausgelesen und gesetzt, kann aber aktuell über die Demo-UI noch nicht gesetzt werden (vielleicht ergänze ich das nochspäter). Die Klasse ist auch noch ungetestet, es kann also noch zu Fehlern kommen. Companyname und Productname müssen dem Skript übergeben werden (siehe Projektsettings -> Player). using System.Collections; using System.Collections.Generic; using UnityEngine; using Microsoft.Win32; using System.Reflection; // Klasse zum Auslesen und Schreiben der "Launcher Settings Configuration" aus der Windows-Registry. // Plattform: Windows // (c) by Zer0Cool for the Unity Insider Forum (forum.unity-community.de) // Skype: zer0f0rce public class LauncherSettings : MonoBehaviour { /* Muster für ein Registryeintrag: [HKEY_CURRENT_USER\Software\Firmenname\Gamename] "UnitySelectMonitor_h17969598"=dword:00000000 "Screenmanager Resolution Width_h182942802"=dword:00000780 "Screenmanager Resolution Height_h2627697771"=dword:00000438 "Screenmanager Is Fullscreen mode_h3981298716"=dword:00000001 "unity.player_sessionid_h1351336811"=hex:36,33,36,39,36,31,38,34,33,34,31,31,38,32,31,37,32,37,31,00 "unity.player_session_elapsed_time_h192694777"=hex:33,30,39,32,00 "unity.player_session_background_time_h123860221"=hex:31,35,31,37,32,34,38,37,30,31,32,38,33,00 "UnityGraphicsQuality_h1669003810"=dword:00000005 */ public string CompanyName = "HuginMuninStudios"; public string ProductName = "TwinDestiny"; const string userRoot = "HKEY_CURRENT_USER"; private bool m_currentIsFullscreenMode = true; private int m_currentQualityLevel; private Vector2 m_currentResolution; private string subkey; private string keyName; private string KeyNamePartScreenmanagerIsFullscreenMode = "Screenmanager Is Fullscreen mode"; private string KeyNamePartScreenmanagerResolutionWidth = "Screenmanager Resolution Width"; private string KeyNamePartScreenmanagerResolutionHeight = "Screenmanager Resolution Height"; private string KeyNamePartUnityGraphicsQuality = "UnityGraphicsQuality"; private string KeyNameScreenmanagerIsFullscreenMode; private string KeyNameScreenmanagerResolutionWidth; private string KeyNameScreenmanagerResolutionHeight; private string KeyNameUnityGraphicsQuality; private bool registryLoadingSuccessfully = false; void Start() { //subkey = "Software\\AppDataLow\\Software\\" + CompanyName + "\\" + ProductName; subkey = "Software\\" + CompanyName + "\\" + ProductName; keyName = userRoot + "\\" + subkey; if (FindRegistryKeyNames()) { registryLoadingSuccessfully = true; GetWindowsRegistry(); } else { registryLoadingSuccessfully = false; } } void OnGUI() { if (!registryLoadingSuccessfully) { GUILayout.BeginVertical(); GUILayout.Label("Registrydaten der Anwendung konnten nicht geladen werden. Bitte \"CompanyName\" und \"ProductName\" überprüfen oder Build der Anwendung 1x starten!"); GUILayout.EndVertical(); return; } string[] names = QualitySettings.names; GUILayout.BeginHorizontal(); // Zeige alle Qualitätsstufen an GUILayout.BeginVertical(); int i = 0; while (i < names.Length) { // Markiere aktuelle Auswahl des Launchers if (m_currentQualityLevel == i) { GUILayout.BeginHorizontal(); GUILayout.Label(">"); } // Zeige alle Auflösungen an if (GUILayout.Button(names[i])) { QualitySettings.SetQualityLevel(i, true); m_currentQualityLevel = i; SetWindowsRegistry(); print("Current Quality Level: " + i); } // Markiere aktuelle Auswahl des Launchers if (m_currentQualityLevel == i) { GUILayout.EndHorizontal(); } i++; } GUILayout.EndVertical(); // Zeige alle Auflösungen an GUILayout.BeginVertical(); Resolution[] resolutions = Screen.resolutions; Resolution lastResolution = new Resolution(); foreach (Resolution res in resolutions) { if (lastResolution.width == res.width && lastResolution.height == res.height) continue; // Markiere aktuelle Auswahl des Launchers if (m_currentResolution.x == res.width && m_currentResolution.y == res.height) { GUILayout.BeginHorizontal(); GUILayout.Label(">"); } if (GUILayout.Button(res.width + "x" + res.height)) { Screen.SetResolution(res.width, res.height, true); m_currentResolution.x = res.width; m_currentResolution.y = res.height; SetWindowsRegistry(); print("Current Resolution: " + m_currentResolution); } if (m_currentResolution.x == res.width && m_currentResolution.y == res.height) { GUILayout.EndHorizontal(); } lastResolution = res; // Speichere letzte Auflösung um doppelte Auflösungen zu überspringen } GUILayout.EndVertical(); // Togglebutton für Vollbild oder Fenstermodus bool priorIsFullscreenMode = m_currentIsFullscreenMode; m_currentIsFullscreenMode = GUILayout.Toggle(m_currentIsFullscreenMode, "Full Screen?"); if (priorIsFullscreenMode != m_currentIsFullscreenMode) { Screen.fullScreen = m_currentIsFullscreenMode; SetWindowsRegistry(); } GUILayout.EndHorizontal(); } bool FindRegistryKeyNames() { RegistryKey OurKey = Registry.CurrentUser; OurKey = OurKey.OpenSubKey(subkey, true); if (OurKey == null || OurKey.GetValueNames().Length == 0) { Debug.LogWarning("Programmschlüssel konnten nicht gefunden werden!"); return false; } foreach (string Keyname in OurKey.GetValueNames()) { if (Keyname.Contains(KeyNamePartScreenmanagerResolutionWidth)) KeyNameScreenmanagerResolutionWidth = Keyname; if (Keyname.Contains(KeyNamePartScreenmanagerResolutionHeight)) KeyNameScreenmanagerResolutionHeight = Keyname; if (Keyname.Contains(KeyNamePartUnityGraphicsQuality)) KeyNameUnityGraphicsQuality = Keyname; if (Keyname.Contains(KeyNamePartScreenmanagerIsFullscreenMode)) KeyNameScreenmanagerIsFullscreenMode = Keyname; } return true; } void SetWindowsRegistry() { // Write Settings Registry.SetValue(keyName, KeyNameScreenmanagerIsFullscreenMode, unchecked((int)(m_currentIsFullscreenMode?1:0)), RegistryValueKind.DWord); Registry.SetValue(keyName, KeyNameUnityGraphicsQuality, unchecked((int)m_currentQualityLevel), RegistryValueKind.DWord); Registry.SetValue(keyName, KeyNameScreenmanagerResolutionWidth, unchecked((int)m_currentResolution.x), RegistryValueKind.DWord); Registry.SetValue(keyName, KeyNameScreenmanagerResolutionHeight, unchecked((int)m_currentResolution.y), RegistryValueKind.DWord); } void GetWindowsRegistry() { // Read Settings int isFullscreenMode = (int)Registry.GetValue(keyName, KeyNameScreenmanagerIsFullscreenMode, null); m_currentIsFullscreenMode = (isFullscreenMode == 1) ? true : false; m_currentQualityLevel = (int)Registry.GetValue(keyName, KeyNameUnityGraphicsQuality, null); int currentResolutionX = (int)Registry.GetValue(keyName, KeyNameScreenmanagerResolutionWidth, null); m_currentResolution.x = (float)currentResolutionX; int currentResolutionY = (int)Registry.GetValue(keyName, KeyNameScreenmanagerResolutionHeight, null); m_currentResolution.y = (float)currentResolutionY; } } 1 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kuxii Geschrieben 1. Februar 2018 Melden Share Geschrieben 1. Februar 2018 Ich sag es Immer wieder Du bist ein Verrückter FREAK!!! Die idee mit der Regestry ist Richtig Geil, Nur ein Problem Gibts da unter Linux Bild, Da gibts sowas nicht. Da müsste mann dies via Textdatei oder so machen ^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 1. Februar 2018 Autor Melden Share Geschrieben 1. Februar 2018 Ja unter Linux oder Mac wird das Ganze woanders abgelegt, hier müsste man jede Plattform unterschiedlich behandeln. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 1. Februar 2018 Melden Share Geschrieben 1. Februar 2018 Echt Klass! Was bringst du eigentlich nicht? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kuxii Geschrieben 1. Februar 2018 Melden Share Geschrieben 1. Februar 2018 vor 33 Minuten schrieb Kojote: Echt Klass! Was bringst du eigentlich nicht? Hatte ich ihn auch schon Gefragt^^ vor 42 Minuten schrieb Zer0Cool: Ja unter Linux oder Mac wird das Ganze woanders abgelegt, hier müsste man jede Plattform unterschiedlich behandeln. linux zb hat unter den User Ordner .config ordner wo alles mögliche drinn ist Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 1. Februar 2018 Autor Melden Share Geschrieben 1. Februar 2018 So, hab Vollbild oder Fenstermodus noch fix in die UI eingebaut, ging schneller als ich dachte PS: Der Schlüssel in der Registry für eine "frisch" gebuildete Anwendung war noch "verkehrt". Diesen habe ich oben im Skript noch einmal angepasst. Zudem habe ich noch eine Prüfung eingebaut, ob die Werte der Anwendung aus der Registry korrekt gelesen werden konnten. Change History: - bei einem Build gibt er die Auflösungen 3x aus (gefixed), Ursache sind vermutlich unterschiedliche Refreshraten der Auflösungen - Vollbildmodus wird nun auch umgeschaltet Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.