設定画面で解像度やウィンドウ化するかどうかなどを切り替えて、セーブファイルに保存してみました。
設定画面を作る
まず、UIの自動レイアウト #1の方法で、適当にメインメニューと設定画面を作りました。
メインメニューと設定メニューは別々のPanelオブジェクトです。これらにレイアウトグループをつけて、その子のパネルにはLayout Elementをつけます。
さらにレイアウトを分けたいときは、Layout Elementをつけたパネルにレイアウトグループをつけて、さらにその子パネルにLayout Elementをつけていきます。
設定をセーブ/ロードする
設定はゲームの進行状況をセーブ/ロードするの方法で保存します。まずStart時に設定をロードします。セーブデータが無ければ新規作成します。
そして、設定メニューを開いたときに、ドロップダウンやトグルなどの値にロードした値を入れます。設定メニューを閉じるときには、ドロップダウンやトグルの値を保存します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using UnityEngine.SceneManagement;
public class StartMenu : MonoBehaviour
{
    [SerializeField] Image mainMenu; // メインメニューのパネル
    [SerializeField] Image settingsMenu; // 設定メニューのパネル
    string filename; // セーブデータのファイル名
    SaveData data; // セーブデータ
    Settings settings = new Settings(); // 設定オブジェクト
    [SerializeField] Dropdown resolution;
    [SerializeField] Toggle windowed;
    // Start is called before the first frame update
    void Start()
    {
        // セーブファイルの名前
        filename = Application.dataPath + "/testsavedata.xml";
        // ファイルを開けたとき
        if (File.Exists(filename))
        {
            data = XmlUtil.Deserialize(filename);
            settings = data.settings;
        }
        // 開けないとき
        else
        {
            // 新しいセーブデータオブジェクト
            data = new SaveData();
            // 保存すると新しいセーブファイルが作られる
            Save();
        }
        CloseSettings();
    }
    // 保存する
    void Save()
    {
        data.settings = settings;
        XmlUtil.Seialize(filename, data);
    }
    
    // 設定メニューを開く(「設定」ボタンに設定)
    public void OpenSettings()
    {
        // メインメニューのパネルを非アクティブ
        mainMenu.gameObject.SetActive(false);
        // 設定メニューのパネルをアクティブ
        settingsMenu.gameObject.SetActive(true);
        // ドロップダウンやトグルに、設定オブジェクトの値を入れる
        resolution.value = settings.resolution;
        windowed.isOn = settings.windowed;
    }
    // 設定メニューを閉じる(「キャンセル」ボタンに設定)
    public void CloseSettings()
    {
        // メインメニューのパネルをアクティブ
        mainMenu.gameObject.SetActive(true);
        // 設定メニューのパネルを非アクティブ
        settingsMenu.gameObject.SetActive(false);
    }
    // 設定を適用(「適用」ボタンに設定)
    public void ApplySettings()
    {
        // UIの値を設定オブジェクトに入れる
        settings.resolution = resolution.value;
        settings.windowed = windowed.isOn;
        // 設定を変える
        switch (settings.resolution)
        {
            case 0:
            Screen.SetResolution(1920, 1080, !settings.windowed);
                break;
            case 1:
                Screen.SetResolution(1440 , 810, !settings.windowed);
                break;
            // ...
        }
        // 保存する
        Save();
        // 設定メニューを閉じる
        CloseSettings();
    }
    // シーンの再読み込み(「スタート」ボタンに設定)
    public void LoadScene()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
    public void ChangeResolution(int value)
    {
        settings.resolution = value;
    }
    public void ChangeWindowed(bool value)
    {
        settings.windowed = value;
    }
}
 メインメニューの設定ボタンを押すと、メインメニューのパネルが無効、設定メニューのパネルが有効になって、表示が切り替わります。
すると、設定項目が出現するので、値を変えて「適用」を押すと保存されてメインメニューに戻ります。「キャンセル」を押して戻った場合は保存されません。
保存された値は、スタートボタンを押してシーンを再読み込みしても残っているのがわかります。
ボタンにメソッドを設定する
各ボタンに設定するメソッドが全てこのスクリプトに定義されています。ボタンに設定するときは、ボタンのインスペクタの「On Click ()」にある+ボタンをクリックします。
そして、「None」と書かれている欄にスクリプトをつけたオブジェクトをドラッグアンドドロップします。このスクリプトはCanvasにつけました。
そして、横のドロップダウンから設定したいメソッドを選びます。








