Add game mode manager with player-control and paint modes

Introduce an extensible game mode system toggled with Tab:
- Player Control: WASD movement with always-on mouse camera orbit
- Paint: player frozen, left-click paints, right-click holds to orbit

Add GameMode base class, GameModeManager, and the two concrete modes.
Refactor controlled scripts to expose clean state flags instead of
handling input themselves: ThirdPersonOrbitInput.LookMode,
PlayerCharacterController.ControlEnabled, MeshPainter.PaintingEnabled.

Also fix camera zoom: remove the obsolete /120 wheel normalization so
one scroll notch maps to one zoomSpeed step under the new Input System.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 4.8 committed 2026-06-22 15:13:46 +02:00
1 parent 6e8ab4bc6d
commit dcb1fc42a6
12 files changed
+358 -55

No files matched your search

+29
View File
@@ -0,0 +1,29 @@
/// <summary>
/// Base class for a high-level game mode (state) handled by
/// <see cref="GameModeManager"/>. A mode configures the relevant scene systems
/// when it becomes active (<see cref="Enter"/>), can clean up when it is left
/// (<see cref="Exit"/>) and may run per-frame logic in <see cref="Tick"/>.
///
/// Modes are plain C# classes (not MonoBehaviours). To add a new mode, derive
/// from this class and register an instance in GameModeManager.BuildModes().
/// </summary>
public abstract class GameMode
{
/// <summary>The owning manager, providing access to the controlled systems.</summary>
protected GameModeManager Manager { get; private set; }
/// <summary>Human-readable name (shown in logs / debug UI).</summary>
public abstract string DisplayName { get; }
/// <summary>Wires the mode to its manager. Called once during registration.</summary>
internal void Bind(GameModeManager manager) => Manager = manager;
/// <summary>Called once when this mode becomes the active mode.</summary>
public virtual void Enter() { }
/// <summary>Called once when this mode stops being the active mode.</summary>
public virtual void Exit() { }
/// <summary>Called every frame while this mode is the active mode.</summary>
public virtual void Tick() { }
}