Introduce a FirstPersonController / FirstPersonMode pair (mirroring the free-cam mode) wired into the GameModeManager Tab cycle. In first person the mesh is hidden, the eye sits on CameraTarget plus a per-pose firstPersonCameraTargetYOffset, and the character body yaw is driven to match the camera via a new single-writer FaceYaw hook on PlayerCharacterController. Also includes user content edits (poses, prefabs, scene) carried along. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
42 lines
1.5 KiB
C#
42 lines
1.5 KiB
C#
/// <summary>
|
|
/// First-person mode. The player keeps walking (WASD, camera-relative) but the camera moves to the
|
|
/// player's eye (the CameraTarget) with free mouse-look, and the player's mesh is hidden so the body
|
|
/// isn't seen from the inside. The orbit camera input is disabled while here so it doesn't fight for
|
|
/// the cursor; the <see cref="FirstPersonController"/> drives its own dedicated CinemachineCamera.
|
|
/// </summary>
|
|
public class FirstPersonMode : GameMode
|
|
{
|
|
public override string DisplayName => "First Person";
|
|
|
|
public override void Enter()
|
|
{
|
|
// Player stays fully controllable; only the view changes.
|
|
if (Manager.Player)
|
|
{
|
|
Manager.Player.enabled = true;
|
|
Manager.Player.ControlEnabled = true;
|
|
}
|
|
|
|
if (Manager.Painter)
|
|
Manager.Painter.PaintingEnabled = false;
|
|
|
|
// The orbit rig would otherwise keep grabbing the cursor and reading the mouse every frame.
|
|
if (Manager.CameraInput)
|
|
Manager.CameraInput.enabled = false;
|
|
|
|
if (Manager.FirstPerson)
|
|
Manager.FirstPerson.SetActive(true);
|
|
}
|
|
|
|
public override void Exit()
|
|
{
|
|
// Modes are Enter-only, so first-person must undo its own camera takeover (and unhide the mesh)
|
|
// here; the next mode's Enter restores the player/painter/look-mode state.
|
|
if (Manager.FirstPerson)
|
|
Manager.FirstPerson.SetActive(false);
|
|
|
|
if (Manager.CameraInput)
|
|
Manager.CameraInput.enabled = true;
|
|
}
|
|
}
|