인터랙션 시스템 및 터널 기능 생성
This commit is contained in:
@@ -3,22 +3,25 @@ using UnityEngine.InputSystem;
|
||||
|
||||
public class PlayerMovement : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private float moveSpeed = 5f;
|
||||
private Vector2 _moveInput;
|
||||
[Header("Movement Settings")]
|
||||
public float moveSpeed = 5f;
|
||||
public float jumpHeight = 1.5f; // 점프 높이
|
||||
public float gravity = -19.62f; // 기본 중력보다 약간 무거운 값 추천
|
||||
|
||||
private CharacterController _controller;
|
||||
private PlayerInputActions _inputActions;
|
||||
|
||||
private Vector3 _velocity;
|
||||
public float gravity = -19.62f; // 조금 더 묵직하게 설정
|
||||
private Vector2 _moveInput;
|
||||
private Vector3 _velocity; // 수직 속도 (중력용)
|
||||
private bool _isGrounded;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
_controller = GetComponent<CharacterController>();
|
||||
_inputActions = new PlayerInputActions();
|
||||
|
||||
// Move 액션 연결 (Vector2 타입으로 설정되어 있어야 함)
|
||||
_inputActions.Player.Move.performed += ctx => _moveInput = ctx.ReadValue<Vector2>();
|
||||
_inputActions.Player.Move.canceled += ctx => _moveInput = Vector2.zero;
|
||||
// 점프 액션 연결
|
||||
_inputActions.Player.Jump.performed += ctx => OnJump();
|
||||
}
|
||||
|
||||
void OnEnable() => _inputActions.Enable();
|
||||
@@ -26,29 +29,46 @@ public class PlayerMovement : MonoBehaviour
|
||||
|
||||
void Update()
|
||||
{
|
||||
// 1. 수직 속도(중력) 계산
|
||||
if (_controller.isGrounded && _velocity.y < 0)
|
||||
// [해결책] 터널 이동 중이라면 일반 이동/중력 로직을 모두 중단합니다.
|
||||
if (GetComponent<TunnelTraveler>().IsTraveling)
|
||||
{
|
||||
// 바닥에 닿아있을 때 속도를 아주 작게 유지 (경사로 등에서 안정적)
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. 바닥 체크 (CharacterController의 기능 활용)
|
||||
_isGrounded = _controller.isGrounded;
|
||||
if (_isGrounded && _velocity.y < 0)
|
||||
{
|
||||
// 바닥에 닿아있을 때는 아주 작은 하방 힘만 유지 (안정성)
|
||||
_velocity.y = -2f;
|
||||
}
|
||||
|
||||
// 2. 입력받은 방향으로 평면 이동 계산
|
||||
Vector3 move = new Vector3(_moveInput.x, 0, _moveInput.y);
|
||||
// 2. 이동 로직
|
||||
_moveInput = _inputActions.Player.Move.ReadValue<Vector2>();
|
||||
Vector3 move = transform.right * _moveInput.x + transform.forward * _moveInput.y;
|
||||
_controller.Move(move * moveSpeed * Time.deltaTime);
|
||||
|
||||
// 수평 이동 실행
|
||||
_controller.Move(move * Time.deltaTime * moveSpeed);
|
||||
|
||||
// 3. 중력 가속도 적용 (v = v + g * t)
|
||||
// 3. 중력 적용
|
||||
_velocity.y += gravity * Time.deltaTime;
|
||||
|
||||
// 4. 수직 이동(중력) 실행 (s = v * t)
|
||||
// 4. 최종 수직 이동 적용 (중력/점프 속도)
|
||||
_controller.Move(_velocity * Time.deltaTime);
|
||||
}
|
||||
|
||||
// 이동 중일 때 바라보는 방향 전환
|
||||
if (move != Vector3.zero)
|
||||
private void OnJump()
|
||||
{
|
||||
// TunnelTraveler가 이동 중인지 체크 (상태 변수 활용)
|
||||
if (GetComponent<TunnelTraveler>().IsTraveling) return;
|
||||
|
||||
if (_isGrounded)
|
||||
{
|
||||
transform.forward = move;
|
||||
_velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
|
||||
}
|
||||
}
|
||||
|
||||
// 터널 이동 등 외부에서 중력을 초기화해야 할 때 사용
|
||||
public void ResetVelocity()
|
||||
{
|
||||
_velocity.y = 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user