【Unity】現在のQualityレベルの確認と設定をコードで行う方法

更新日:2023/05/23

UnityはテクスチャやシャドウなどのQuality(品質)をひとまとめに定義しておいて、複数の定義から切り替えることができます。
今回は、スクリプトコードで現在の定義レベルの確認と変更の方法をお伝えします。

 

UnityのQuality設定

UnityはメニューEdit > Project SettingsQualityで、品質レベルを設定できます。

品質レベルを設定

デフォルトでは上の画像のように「Very Low」「Low」「Medium」「High」「Very High」「Ultra」の6レベルが用意されていて、それぞれのレベルの設定値を変更できます。

緑色のチェックボックスは実行時の既定レベルです。
ゲーム実行後にスクリプトで変更することができます。

 

Qualityレベル名の表示

ゲーム実行時に現在のQualityレベルの名前を表示してみます。
ここで使用するのはQualitySettings.namesプロパティと、QualitySettings.GetQualityLevelメソッドです。

QualitySettings.namesプロパティは、品質レベルの名前一覧を配列で取得できます。
QualitySettings.GetQualityLevelメソッドは、現在の品質レベルのインデックス番号を取得できます。

この二つを使ったコード例は、次のようになります。

public class TestClass: MonoBehaviour
{
    void Start()
    {
        int level = QualitySettings.GetQualityLevel();
        Debug.Log( $"Level:[{ level }] name:[{ QualitySettings.names[level] }]" );
    }

}

実行するとコンソールに、既定レベル(緑色のチェック)のインデックス番号と名前が表示されます。

既定レベル(緑色のチェック)の名前が表示

 

レベルを変更する

Qualityのレベルを変更する方法は3つあります。

品質レベルを下げる

QualitySettings.DecreaseLevelメソッドを使用すると、現在の品質レベルのインデックスを一つ下げることができます。
このメソッドは引数を一つ受け取ります。

  • applyExpensiveChanges:アンチエイリアスを適用するかどうか。true:する false:しない(規定)

連続的にメソッドを呼び出して、レベルの変化を確認してみます。

public class TestClass: MonoBehaviour
{
    void Start()
    {
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
        QualitySettings.DecreaseLevel(false);
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
        QualitySettings.DecreaseLevel(false);
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
        QualitySettings.DecreaseLevel(false);
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
        QualitySettings.DecreaseLevel(false);
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
    }

}

次ような結果になりました。

QualitySettings.DecreaseLeveの結果

インデックス0よりも下がらないようですね。

品質レベルを上げる

QualitySettings.IncreaseLevelメソッドを使用すると、現在の品質レベルのインデックスを一つ上げることができます。
このメソッドは引数を一つ受け取ります。

  • applyExpensiveChanges:アンチエイリアスを適用するかどうか。true:する false:しない(規定)

前項と同じように、連続的にメソッドを呼び出してレベルの変化を確認してみます。

public class TestClass: MonoBehaviour
{
    void Start()
    {
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
        QualitySettings.IncreaseLevel(false);
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
        QualitySettings.IncreaseLevel(false);
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
        QualitySettings.IncreaseLevel(false);
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
        QualitySettings.IncreaseLevel(false);
        Debug.Log( $"Level:[{ QualitySettings.GetQualityLevel() }] name:[{ QualitySettings.names[QualitySettings.GetQualityLevel()] }]" );
    }

}

次ような結果になりました。

QualitySettings.IncreaseLevel

定義されているインデックス番号よりも上がらないようですね。

インデックス番号で変更する

QualitySettings.SetQualityLevelメソッドを使用すると、Qualityレベルを変更できます。

このメソッドは引数と二つ受け付けます。

  • index: 変更後のレベルインデックス番号
  • applyExpensiveChanges:重い処理が必要なものを反映するかかどうか。true:する(規定) false:しない

5秒後に品質レベルをインデックス2に切り替えてみます。

public class TestClass: MonoBehaviour
{
    float startTime;
    bool levelChanged = false;
    void Start()
    {
        startTime = Time.realtimeSinceStartup;
    }

    void Update()
    {
        Debug.Log( $"[{Time.realtimeSinceStartup-startTime}] QualitySettings.pixelLightCount: {QualitySettings.pixelLightCount}" );
  
        if( !levelChanged && Time.realtimeSinceStartup - startTime > 5.0f ){
            QualitySettings.SetQualityLevel(2, true);
            Debug.Log("Level Change!");
            levelChanged=true;
        }
        
    }

}

このコードで参照しているQualitySettings.pixelLightCountは、現在の品質レベルのpixelLightCountの値を取得します。
この値は品質レベル毎に異なるので、現在の品質レベルを変更すると値が変わるはずです。

実行すると、次のようにコンソール出力されます。

品質レベルの変更結果

5秒経過時点の前後で、QualitySettings.pixelLightCountの値が変わっていますね。

更新日:2023/05/23

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。