Player Settings
One runtime store holds player preferences. The settings menu edits that store, and gameplay systems follow its changes. Your modules can contribute additional controls without replacing the menu.
Open and change preferences
Open the pause menu with Escape or the Menu action, then choose Settings. Preferences are separate from the Saved Game controls: changing volume, theme or camera options updates the running game and immediately attempts to save the preference. Save Game and Load Game operate on the registered game-state participants.
The camera options include preferred first- or third-person view, mouse sensitivity, gamepad look speed, inverted vertical look and field of view. The menu preference applies to local camera rigs on this machine. V or R3 remains a temporary view toggle for the individual player; changing audio volume does not reset that toggle.
Defaults and saved choices
The GameSettings asset seeds the camera values shown by the settings menu. CameraRig prefab fields remain the runtime baseline until the player overrides each matching preference. GameSettingsStore holds live choices and persists them through the existing save system; runtime changes do not write into the project asset. Preferences belong to the local installation and are independent of the active game slot.
The installed choices include Default, Slate and the optional Coastal theme. Install appends Coastal when it is missing and does not replace an authored palette, reorder the list or change the selected theme. Coastal and the related source refinements are awaiting the next package build; they are not in the 12 September package.
Add your own settings
Implement IGameSettingsProvider and register it through GameSettingsProviders. A provider supplies a group title and typed descriptors: AddBool creates a switch, AddFloat a bounded slider, and AddChoice a selection with stable option IDs. The menu builds the controls; the store owns the values. Subscribe to its Changed event to apply them to your gameplay systems, and use SaveCompleted when you need the storage outcome.
using Curitor.PartyCoreKit.Settings;
using UnityEngine;
public class HintSettings : MonoBehaviour, IGameSettingsProvider
{
[SerializeField] private GameObject hints;
private BoolGameSettingDescriptor showHints;
private GameSettingsStore store;
public string Id => "mygame.accessibility";
public string Title => "Accessibility";
public void DefineSettings(GameSettingsBuilder builder)
{
showHints = builder.AddBool("hints", "Show hints",
"Display contextual help while playing.", true);
}
private void OnEnable()
{
if (!GameSettingsProviders.Register(this)) return;
store = GameSettingsStore.Current;
store.Changed += Apply;
Apply();
}
private void Apply()
{
if (hints != null && showHints != null)
hints.SetActive(showHints.Value);
}
private void OnDisable()
{
if (store == null) return;
store.Changed -= Apply;
GameSettingsProviders.Unregister(this);
store = null;
}
}Put this component on an always-active object, separate from the hints it controls. Use a unique provider ID and stable field IDs; changing them creates new preferences. Removing a provider hides its controls while retaining its saved values. Choice IDs remain stable when display order changes. The standard menu supports these three field types; specialized controls can use your own UI alongside the same store and save system.