2026-02-01 11:12:05 +00:00
|
|
|
using UnityEngine;
|
|
|
|
|
using UnityEngine.InputSystem;
|
|
|
|
|
|
|
|
|
|
public class PlayerController : MonoBehaviour
|
|
|
|
|
{
|
|
|
|
|
private PlayerMovement _playerMovement;
|
|
|
|
|
private InputRecorder _inputRecorder;
|
|
|
|
|
|
|
|
|
|
private Vector2 moveInputBuffer;
|
2026-02-10 08:18:34 +00:00
|
|
|
|
2026-02-01 11:12:05 +00:00
|
|
|
private bool jumpBuffer;
|
|
|
|
|
private bool hangBuffer;
|
|
|
|
|
|
2026-02-23 05:07:17 +00:00
|
|
|
private bool _isLookingDown;
|
|
|
|
|
private bool _isLookingUp;
|
|
|
|
|
|
2026-02-01 11:12:05 +00:00
|
|
|
private void Awake()
|
|
|
|
|
{
|
|
|
|
|
_playerMovement = GetComponent<PlayerMovement>();
|
|
|
|
|
_inputRecorder = GetComponent<InputRecorder>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnMove(InputValue value)
|
|
|
|
|
{
|
2026-02-10 08:18:34 +00:00
|
|
|
if (GameManager.instance.gameState == GameState.Playing)
|
2026-02-04 11:43:12 +00:00
|
|
|
{
|
|
|
|
|
moveInputBuffer = value.Get<Vector2>();
|
|
|
|
|
}
|
2026-02-01 11:12:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnJump(InputValue value)
|
|
|
|
|
{
|
2026-02-10 08:18:34 +00:00
|
|
|
if (GameManager.instance.gameState == GameState.Playing)
|
2026-02-01 11:12:05 +00:00
|
|
|
{
|
2026-02-04 11:43:12 +00:00
|
|
|
if (value.isPressed)
|
|
|
|
|
{
|
|
|
|
|
jumpBuffer = true;
|
|
|
|
|
}
|
2026-02-01 11:12:05 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-07 14:41:29 +00:00
|
|
|
private void OnRetry(InputValue value)
|
2026-02-01 11:12:05 +00:00
|
|
|
{
|
2026-02-10 08:18:34 +00:00
|
|
|
if (GameManager.instance.gameState == GameState.Playing)
|
2026-02-01 11:12:05 +00:00
|
|
|
{
|
2026-02-04 11:43:12 +00:00
|
|
|
if (value.isPressed)
|
|
|
|
|
{
|
2026-02-10 11:03:29 +00:00
|
|
|
GameManager.instance.Replay();
|
2026-02-07 14:41:29 +00:00
|
|
|
}
|
2026-02-01 11:12:05 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-08 13:13:32 +00:00
|
|
|
private void OnCameraDown(InputValue value)
|
|
|
|
|
{
|
2026-02-23 05:07:17 +00:00
|
|
|
if (GameManager.instance.gameState != GameState.Playing) return;
|
|
|
|
|
|
|
|
|
|
if (value.isPressed && _playerMovement.IsGroundedState && !_playerMovement.IsMoving)
|
2026-02-08 13:13:32 +00:00
|
|
|
{
|
2026-02-23 05:07:17 +00:00
|
|
|
_isLookingDown = true;
|
|
|
|
|
_isLookingUp = false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_isLookingDown = false;
|
2026-02-08 13:13:32 +00:00
|
|
|
}
|
2026-02-23 05:07:17 +00:00
|
|
|
ApplyCameraLook();
|
|
|
|
|
}
|
2026-02-08 13:13:32 +00:00
|
|
|
|
2026-02-23 05:07:17 +00:00
|
|
|
private void OnCameraUp(InputValue value)
|
|
|
|
|
{
|
|
|
|
|
if (GameManager.instance.gameState != GameState.Playing) return;
|
|
|
|
|
|
|
|
|
|
if (value.isPressed && _playerMovement.IsGroundedState && !_playerMovement.IsMoving)
|
|
|
|
|
{
|
|
|
|
|
_isLookingUp = true;
|
|
|
|
|
_isLookingDown = false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_isLookingUp = false;
|
|
|
|
|
}
|
|
|
|
|
ApplyCameraLook();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ApplyCameraLook()
|
|
|
|
|
{
|
|
|
|
|
CameraEffect camEffect = Camera.main.GetComponent<CameraEffect>();
|
2026-02-08 13:13:32 +00:00
|
|
|
if (camEffect != null)
|
|
|
|
|
{
|
2026-02-23 05:07:17 +00:00
|
|
|
camEffect.SetCameraLook(_isLookingUp, _isLookingDown);
|
2026-02-08 13:13:32 +00:00
|
|
|
}
|
2026-02-23 05:07:17 +00:00
|
|
|
_playerMovement.SetLookAnimation("isLookDown", _isLookingDown);
|
|
|
|
|
_playerMovement.SetLookAnimation("isLookUp", _isLookingUp);
|
2026-02-08 13:13:32 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-07 14:41:29 +00:00
|
|
|
private void OnHang(InputValue value)
|
2026-02-01 11:12:05 +00:00
|
|
|
{
|
2026-02-10 08:18:34 +00:00
|
|
|
if (GameManager.instance.gameState == GameState.Playing)
|
2026-02-01 11:12:05 +00:00
|
|
|
{
|
2026-02-04 11:43:12 +00:00
|
|
|
if (value.isPressed)
|
|
|
|
|
{
|
2026-02-07 14:41:29 +00:00
|
|
|
hangBuffer = true;
|
2026-02-04 11:43:12 +00:00
|
|
|
}
|
2026-02-01 11:12:05 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void FixedUpdate()
|
|
|
|
|
{
|
2026-02-10 08:18:34 +00:00
|
|
|
if (GameManager.instance.gameState != GameState.Playing)
|
2026-02-04 11:43:12 +00:00
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-23 05:07:17 +00:00
|
|
|
if (_isLookingDown || _isLookingUp)
|
|
|
|
|
{
|
|
|
|
|
if (_playerMovement.IsMoving || !_playerMovement.IsGroundedState)
|
|
|
|
|
{
|
|
|
|
|
_isLookingDown = false;
|
|
|
|
|
_isLookingUp = false;
|
|
|
|
|
ApplyCameraLook();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-10 08:18:34 +00:00
|
|
|
// 플레이어 움직임 녹화
|
2026-02-01 11:12:05 +00:00
|
|
|
InputFrame currentFrame = new InputFrame(moveInputBuffer.x, jumpBuffer, hangBuffer);
|
|
|
|
|
_inputRecorder?.Record(currentFrame);
|
2026-02-10 08:18:34 +00:00
|
|
|
|
2026-02-01 11:12:05 +00:00
|
|
|
RunInput(currentFrame);
|
|
|
|
|
|
|
|
|
|
jumpBuffer = false;
|
|
|
|
|
hangBuffer = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void RunInput(InputFrame frame)
|
|
|
|
|
{
|
|
|
|
|
_playerMovement.SetMoveInput(new Vector2(frame.moveX, 0));
|
|
|
|
|
|
|
|
|
|
if (frame.isJumpPressed)
|
|
|
|
|
{
|
|
|
|
|
_playerMovement.TryJump();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (frame.isHangPressed)
|
|
|
|
|
{
|
|
|
|
|
_playerMovement.TryHang();
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-02-23 05:07:17 +00:00
|
|
|
}
|