Guida [Release] AutoQualitySettings

Stato
Discussione chiusa ad ulteriori risposte.

xDevily

Utente Emerald
9 Agosto 2012
925
101
183
528
Questo script serve per abilitare il cambiamento automatico e dinamico delle impostazione grafiche del gioco affinche questo non scenda al di sotto di un certo numero di fps.
L'utilizzo di questo script si rivela molto comodo e utile sopratutto per i giochi mobile in quanto i telefono hanno hardware completamente diversi l'uno dall'altro. Con questo script si potra' fare girare lo stesso gioco su un iphone avendo delle prestazioni migliori rispetto a un lumia 520 (i telefoni sono due esempi a caso) senza doversi preuccupare di nulla.

Per l'utilizzo e' consignato impostare come qualita' di default, nel menu Quality, il livello piu basso. Cosi facendo lo script appena avviato il livello in cui si trova, alza la qualita' graficha se possibile. Questo serve per evitare crash del gioco per "Out of memory" in special modo sui cellulari che hanno un limite di ram utilizzabile.

Lo scirpt e' completo anche di un contatore di fps che si puo' mostrare/nascondere grazie a un toggle da modificare dall'editor che cambia colore a seconda del numero di fps:
<20 -> rosso
> 20 & <30 -> giallo
>40 -> rosso
Il contatore oltre agli fps mostra la risoluzione dello schermo e gli Hz se reperibili ed infine il livello di qualita a cui ci si trova.

pqfkUysU9SH7NV8z-lqm0F4-K-AM4DCuEsgGMjAJY4DX8cOhEmcg139ydAOwVfHkVvZ3ajpcobUTUAXiiVbaJsSaGE8a5TrUB6ETPNC_NoP7yhYsyp2FSawZQiqEackEgoPh6nPt-qTozhYr0xpG81RqCuz6qWBDo-81PD3_BQYSf6qiw6KHOcMKwtm-Z-Y5XKN-7tXJWfRk9PJwwn93IGI4o9YSi9goBeIJ9eulbIKo7KUt3OHm098ILDqNQcUWz1ZEYUGInZsy0WGCUT32ZA_GE8KIx7TeNGkKFsO52LL-B2rGNzvbe1TyliYx5tK8u0qzfJFAT3rRxgxyCCZ6itt3yvR2PzMRp62L6RWkiarujgLCobNZeKq-DQlCXOLxJrc0b-U1GCoOKVgeG1eLAUTW3Hfg-q5vPwFELLdxdFiHhUWmwq1vRk31F3j9lTKo0AyiatEU31f0fBGAGX-3lYlhp018DBXZ5hzsfVcEHqXnS7Of6uPUQ8gt90OuYIjGjGKyA44qL6_b5Yyqt45gBGgl1jBWlTdxDvG46sN8Nuo=w334-h27-no


Lo script: (si puo anche prendere da gist premendo il bottone verde in alto)
Codice:
using UnityEngine;
using System.Collections;

public class AutoQualitySettings : MonoBehaviour {

    float fps =0f;
    float fps_count = 0f;
    float fps_refreshRate = 4f;
    float fps_delta;
    float timer=0f;
    float Max_Timer = 1f;

    float q_timer = 0f;

    public bool drawfps = false;

    GUIStyle style = new GUIStyle();
  
    // Update is called once per frame
    void Update () {
        timer += Time.deltaTime;

        CalculateFps();
        UpdateFpsDrawColor();

        if (fps > 40)
            q_timer += Time.deltaTime;
        else
            q_timer = 0;

        if (timer > Max_Timer)
        {
            SetQualityLevelForFps();
            timer = 0;
        }
    }


    void OnGUI()
    {
        if (drawfps)
        {
            if (fps < 999)
                GUI.Label(new Rect(10, 10, 100, 20), "FPS: " + fps + " - Quality: " + QualitySettings.GetQualityLevel() + " Res: "+ Screen.currentResolution.ToString(), style);
            else
                GUI.Label(new Rect(10, 10, 100, 20), "FPS: 999+ - Quality: " + QualitySettings.GetQualityLevel(), style);
        }

    }

    /// <summary>
    /// calulate fps
    /// </summary>
    void CalculateFps()
    {
        fps_count++;
        fps_delta += Time.deltaTime;

        if (fps_delta > 1 / fps_refreshRate)
        {
            fps = fps_count / fps_delta;
            fps_count = 0;
            fps_delta = 0;
        }
    }

    /// <summary>
    /// select color based on  fps counter
    /// </summary>
    void UpdateFpsDrawColor()
    {
        if (drawfps)
        {

            if (fps < 20)
                style.normal.textColor = Color.red;
            if (fps >= 20 && fps <= 30)
                style.normal.textColor = Color.yellow;
            if (fps > 30)
                style.normal.textColor = Color.green;
        }
    }


    void SetQualityLevelForFps()
    {
        //this  timer blocks instant quality changes based on a temporary fps increase that can cause your game to crash or "break" textures.
        if (fps > 40 && q_timer > 2f)
        {
            QualitySettings.IncreaseLevel(false);
            q_timer = 0;

        }

        if (fps < 21)
        {
            QualitySettings.DecreaseLevel(false);
        }
    }

    public void DrawFps(bool value)
    {
        drawfps = value;
    }
}

Download
 
Stato
Discussione chiusa ad ulteriori risposte.