Add first-person camera mode with pose-aware eye offset and yaw facing
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>
This commit is contained in:
1 parent
381b21cd02
commit
cfb767f6cb
17 files changed
+681
-91
No files matched your search
@@ -95,6 +95,7 @@ public partial class PlayerPoseController : MonoBehaviour
|
||||
private bool _blending;
|
||||
|
||||
private float _cameraPoseOffset; // eased per-pose camera-target offset routed to the controller's camera target
|
||||
private float _firstPersonCameraOffset; // eased per-pose first-person eye offset, read by the FirstPersonController (never written to the shared camera target)
|
||||
|
||||
// Capsule blend: the CharacterController dimensions are eased toward the active pose's via a single
|
||||
// normalized blend (so the capsule stays a valid shape throughout) and written through the controller.
|
||||
@@ -120,6 +121,9 @@ public partial class PlayerPoseController : MonoBehaviour
|
||||
/// <summary>Index of the currently selected pose.</summary>
|
||||
public int CurrentIndex => _currentIndex;
|
||||
|
||||
/// <summary>Eased per-pose y-offset for the first-person eye, applied on top of the camera target by the FirstPersonController.</summary>
|
||||
public float FirstPersonCameraYOffset => _firstPersonCameraOffset;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
_player = GetComponent<PlayerCharacterController>();
|
||||
@@ -178,6 +182,14 @@ public partial class PlayerPoseController : MonoBehaviour
|
||||
? Mathf.MoveTowards(_cameraPoseOffset, cameraPoseTarget, cameraOffsetSpeed * Time.deltaTime)
|
||||
: cameraPoseTarget;
|
||||
_player.SetCameraTargetLocalYOffset(_cameraPoseOffset);
|
||||
|
||||
// First-person eye: a separate per-pose offset, eased the same way but NOT routed to the shared
|
||||
// camera target (that would also move the ThirdPersonCamera). The FirstPersonController reads this
|
||||
// and applies it to its own eye position only.
|
||||
float firstPersonTarget = pose ? pose.FirstPersonCameraTargetYOffset : 0f;
|
||||
_firstPersonCameraOffset = cameraOffsetSpeed > 0f
|
||||
? Mathf.MoveTowards(_firstPersonCameraOffset, firstPersonTarget, cameraOffsetSpeed * Time.deltaTime)
|
||||
: firstPersonTarget;
|
||||
}
|
||||
|
||||
void OnDisable()
|
||||
@@ -186,6 +198,7 @@ public partial class PlayerPoseController : MonoBehaviour
|
||||
// next idle frame. Also clear the camera offset and restore the default capsule we were holding.
|
||||
ReleasePose();
|
||||
_cameraPoseOffset = 0f;
|
||||
_firstPersonCameraOffset = 0f;
|
||||
if (_player)
|
||||
{
|
||||
_player.SetCameraTargetLocalYOffset(0f);
|
||||
|
||||
Reference in new issue
Block a user