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;
}
};
}
}
}