Jump to content
Unity Insider Forum
Sign in to follow this  
Zer0Cool

Quality Settings des Unity Launchers auslesen und neu setzen

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

Share this post


Link to post
Share on other sites

Ich sag es Immer wieder Du bist ein Verrückter FREAK!!! :D

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 ^^

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×