craftopiamodder @ ウィキ

ConfigurationManagerおぼえがき

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集

ConfigurationManagerおぼえがき


ConfigurationManagerでMODの設定を管理する場合の応用的なものです。

using BepInEx;
using BepInEx.Configuration;
using System;
using UnityEngine;
 
namespace ConfigurationManagerExample
{
 
    // ConfigurationManagerをカスタマイズする際は、
    // ConfigurationManagerAttributes Classを定義すると便利。
    // 詳細:https://github.com/BepInEx/BepInEx.ConfigurationManager/blob/master/ConfigurationManagerAttributes.cs
    internal sealed class ConfigurationManagerAttributes
    {
        public System.Action<ConfigEntryBase> CustomDrawer;
        public bool? ShowRangeAsPercent;
        public bool? Browsable;
        public string Category;
        public object DefaultValue;
        public bool? HideDefaultButton;
        public bool? HideSettingName;
        public string Description;
        public string DispName;
        public int? Order;
        public bool? ReadOnly;
        public bool? IsAdvanced;
    }
 
    // ここから使用例
    public class Example : BaseUnityPlugin
    {
        public void Awake()
        {
            // 一時的な設定として使いたい場合、SaveOnConfigSet=falseで設定ファイルを生成しないようにできる。
            Config.SaveOnConfigSet = false;
 
 
        }
 
        // ボタンを作りたいとき
        private void Case1()
        {
            // ConfigurationManagerに追加したFormを全消去する場合はConfig.Clear()。
            // Formを描画する関数をつくる場合、先頭にいれるとリロード処理などの実装が容易に。
            Config.Clear();
 
            // [解説]
            // DispName = ""で"Key"が表示されるのを防ぎ、
            // GUILayout.Buttonの第一引数の文字で何のボタンかわかるようにする。
            // GUILayout.BeginVerticalで要素を縦並びにし、
            // GUILayout.Labelでボタンを押したときの説明を追加。
            // ボタンなのでHideDefaultButton = trueで右側の「Reset」ボタンを非表示。
            Config.Bind(
                "Section",
                "Key",
                "",
                new ConfigDescription(
                    "",
                    null,
                    new ConfigurationManagerAttributes
                    {
                        DispName = "",
                        HideDefaultButton = true,
                        Order = 99999,
                        CustomDrawer = (ConfigEntryBase entry) =>
                        {
                            GUILayout.BeginVertical();
                            if (GUILayout.Button("This is Button !", GUILayout.ExpandWidth(true)))
                            {
                                // ボタンを押されたときの処理
                            }
                            GUILayout.Label("Button ! Button ! Button !");
                            GUILayout.EndVertical();
                        }
                    }
                    )
                );
        }
 
        // 入力フォームに共通の設定を適用したい場合、
        // ConfigurationManagerAttributes Classを生成する処理をつくる。
        private void Case2()
        {
            Config.Bind(
                "Section",
                "Key",
                "Default value",
                new ConfigDescription(
                    "This is a string input form.",
                    null,
                    GetInputFormAttr(true, 1)
                    )
                );
        }
        // 例は書き込み可否(canWrite)及びフォームの並び順(priority)をフォーム毎に指定したい場合。
        // Orderは数字が大きい程上にくるので、-(priority)で1が1番上、2が2番目...となるように反転。
        private ConfigurationManagerAttributes GetInputFormAttr(bool canWrite, int priority)
        {
            return new ConfigurationManagerAttributes
            {
                ShowRangeAsPercent = false,
                Order = -(priority),
                ReadOnly = !canWrite
            };
        }
 
        // フォームの値が変更された際に特定の処理をしたい場合、
        // ConfigEntry ClassのSettingChangedに関数を追加する。
        // 例はラムダ関数でクラス変数strを更新する処理を追加する場合。
        private static string str = "Default value";
        private void Case3()
        {
            bool canWrite = true;
            ConfigEntry<string> confString = Config.Bind(
                "Section",
                "Key",
                str,
                new ConfigDescription(
                    "This is a string input form.",
                    null,
                    GetInputFormAttr(canWrite, 1)
                    )
                );
 
            confString.SettingChanged += (object obj, EventArgs args) =>
            {
                if (canWrite)
                {
                    str = confString.Value;
                }
            };
        }
 
        // "いずれかの"フォームの値が変更された際に特定の処理をしたい場合、
        // ConfigFile ClassのSettingChangedに関数を追加する。
        // 例は他のフォームでstr2を更新するような処理があった場合に、
        // confStringフォームの入力値を"Changed to " + str2に置き換える処理。
        // ConfigurationManagerAttributesのReadOnlyがtrueのフォームを利用すれば、
        // 設定の結果、内部の状態がどうなったかを表示するような使い方ができる。
        private static string str2 = "Default value";
        private void Case4()
        {
            bool canWrite = false;
            ConfigEntry<string> confString = Config.Bind(
                "Section",
                "Key",
                str2,
                new ConfigDescription(
                    "This is a display-only string input form.",
                    null,
                    GetInputFormAttr(canWrite, 1)
                    )
                );
            Config.SettingChanged += (object obj, SettingChangedEventArgs args) =>
            {
                if (confString.Value != str2)
                {
                    confString.Value = "Changed to " + str2;
                }
            };
        }
    }
 
}
 
 

タグ:

+ タグ編集
  • タグ:
ウィキ募集バナー