Jump to content
Unity Insider Forum

Quality Settings des Unity Launchers auslesen und neu setzen


Zer0Cool

Recommended Posts

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;
    }

}

 

  • Like 1
  • Thanks 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 33 Minuten schrieb Kojote:

Echt Klass! Was bringst du eigentlich nicht? :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...