Modding Tutorials/ModSettings
Mod settings allow you to offer customisation options to your users.
Requirements[edit]
- If you still haven't set up a solution, what the hell man?
- You need to know how to write custom code, as that's the entire point of this article.
What you'll learn[edit]
You'll learn how to write, save and use mod settings.
Setting up[edit]
Adding mod settings requires two classes, one that inherits from Mod and one that inherits from ModSettings.
The code[edit]
//inspired by https://gist.github.com/erdelf/84dce0c0a1f00b5836a9d729f845298a
using System.Collections.Generic;
using Verse;
using UnityEngine;
namespace MyExampleMod
{
public class ExampleSettings : ModSettings
{
/// <summary>
/// The three settings our mod has.
/// </summary>
public bool exampleBool;
public float exampleFloat = 200f;
public List<Pawn> exampleListOfPawns = new List<Pawn>();
/// <summary>
/// The part that writes our settings to file. Note that saving is by ref.
/// </summary>
public override void ExposeData()
{
Scribe_Values.Look(ref exampleBool, "exampleBool");
Scribe_Values.Look(ref exampleFloat, "exampleFloat", 200f);
Scribe_Collections.Look(ref exampleListOfPawns, "exampleListOfPawns", LookMode.Reference);
base.ExposeData();
}
}
public class ExampleMod : Mod
{
/// <summary>
/// A reference to our settings.
/// </summary>
ExampleSettings settings;
/// <summary>
/// A mandatory constructor which resolves the reference to our settings.
/// </summary>
/// <param name="content"></param>
public ExampleMod(ModContentPack content) : base(content)
{
this.settings = GetSettings<ExampleSettings>();
}
/// <summary>
/// The (optional) GUI part to set your settings.
/// </summary>
/// <param name="inRect">A Unity Rect with the size of the settings window.</param>
public override void DoSettingsWindowContents(Rect inRect)
{
Listing_Standard listingStandard = new Listing_Standard();
listingStandard.Begin(inRect);
listingStandard.CheckboxLabeled("exampleBoolExplanation", ref settings.exampleBool, "exampleBoolToolTip");
listingStandard.Label("exampleFloatExplanation");
settings.exampleFloat = listingStandard.Slider(settings.exampleFloat, 100f, 300f);
listingStandard.End();
base.DoSettingsWindowContents(inRect);
}
/// <summary>
/// Override SettingsCategory to show up in the list of settings.
/// Using .Translate() is optional, but does allow for localisation.
/// </summary>
/// <returns>The (translated) mod name.</returns>
public override string SettingsCategory()
{
return "MyExampleModName".Translate();
}
}
}
ExampleSettings[edit]
ExposeData[edit]
Writes settings to disk. For more info on saving, see ExposeData.
ExampleMod[edit]
Refer to the source above for practical information; snippets here are supplemental.
ExampleSettings[edit]
An easy reference to our settings.
ExampleMod[edit]
A mandatory constructor.
DoSettingsWindowContent[edit]
It's not mandatory to implement, but since the point of most settings is the provide customisation to the end user, it makes sense to make them available somehow.
The GUI[edit]
Listing_Standard is a barebones but useful class for making a GUI, and it does most of the positioning for you. Listing_Standard.Begin and Listing_Standard.End is required: every GUIGroup in Unity you start has to end. If you want more options to Listing_Standard, there's a good SettingsHelper available.
The Widgets class is a powerful alternative to Listing_Standard that gives you more fine-grained control, at the cost of more effort. You'll have to set the size and position of each Rect manually. You can use TweakValues to do this more easily.
Saving[edit]
Saving (altered) settings is done automatically by closing the window. You can optionally override WriteSettings() to add additional functionality to writing settings.
SettingsCategory[edit]
RimWorld will only make your settings accessible if SettingsCategory returns a string that isn't null or empty.
Using your settings[edit]
- One easy way to call settings is to make them all static and load their values with ExampleSettings.exampleBool. In certain cases, this is not practical.
- If you can't (or don't want to) make your settings static, you can obtain your settings through the LoadedModManager like so:
LoadedModManager.GetMod<ExampleMod>().GetSettings<ExampleSettings>().exampleBool
- As the above is a lot of code, you can simple add a reference to your settings and resolve it once in a constructor or otherwise.
On the necessity of HugsLib[edit]
Some people think HugsLib is a necessity for implementing mod settings. This is not true; the above is 100% supported by vanilla, since A17. HugsLib offers an alternative way of using settings.
See also[edit]
SettingsHelper - A lightweight MIT-licensed dll with various extension methods for Listing_Standard.
HugsLib - HugsLib is a popular dependency that aims to ease using settings.