[TIL] 유니티(Unity) 벽타기 및 매달리기

백성은·2025년 5월 22일

TIL

목록 보기
28/34

✅ 학습한 주요 내용

  • CapsuleCast로 벽을 감지하고 벽에 닿았을 때 중력을 꺼서 매달림 상태 유지
  • WallMove()로 입력으로 벽을 타고 이동 가능하며, 지속적으로 스태미나를 소비
  • 벽이 사라지거나 스태미나가 부족하면 StopWallCling()으로 중력 복구 + 위쪽 속도 제거

✅ 벽타기 시스템 구현

플레이어가 벽에 가까이 다가가서 CapsuleCast로 벽을 체크한 뒤 벽에 단축키를 이용해 매달려 위아래로 이동할 수 있는 벽타기 시스템을 구현했다. 이 시스템은 물리 기반으로 작동하며, CapsuleCast를 이용해 벽의 존재를 감지하고, 매달리는 동안 중력을 끄고 기존 이동방식을 벽타기 이동으로 바꿔 부드러운 제어가 가능하도록 구성했다.

구조 설명

벽 감지

CapsuleCast를 활용해 플레이어 앞에 벽이 있는지 감지한다. 이때 플레이어의 CapsuleCollider를 기준으로 상하 중심점을 계산하고, 해당 범위에서 벽 레이어를 대상으로 forward 방향으로 검사한다.

bool IsWall()
{
    CapsuleCollider col = GetComponent<CapsuleCollider>();
    Vector3 center = transform.position + col.center;
    Vector3 offset = Vector3.up * ((col.height / 2f) - col.radius);
    Vector3 point1 = center + offset;
    Vector3 point2 = center - offset;

    return Physics.CapsuleCast(point1, point2, col.radius, transform.forward, wallCheckDistance, wallLayer);
}

벽타기 시작 및 유지

벽이 감지되고 스태미나가 충분할 경우 WallCling()이 호출되어 매달리기 상태로 진입한다. 이 상태에서는 중력이 제거되고, 벽을 따라 이동할 수 있다. 스태미나는 지속적으로 소모되며, 중간에 벽이 사라지거나 스태미나가 부족해지면 자동으로 벽에서 떨어지도록 설계했다.

void WallCling()
{
    isWallCling = true;
    _rigidbody.useGravity = false;
    _rigidbody.velocity = Vector3.zero;
}
void WallMove()
{
    if (curMovementInput == Vector2.zero)
    {
        _rigidbody.velocity = Vector3.zero;
        return;
    }

    Vector3 dir = transform.up * curMovementInput.y + transform.right * curMovementInput.x;
    _rigidbody.AddForce(dir * wallClimbForce, ForceMode.Acceleration);
}

벽타기 종료 처리

벽이 사라지거나 스태미나가 부족해지면 StopWallCling()이 호출되어 중력이 다시 작동하며, 위쪽으로 남아 있는 속도를 제거해 자연스럽게 떨어지도록 처리한다.

void StopWallCling()
{
    isWallCling = false;
    _rigidbody.useGravity = true;

    Vector3 vel = _rigidbody.velocity;
    vel.y = 0f;
    _rigidbody.velocity = vel;
}

📝 느낀 점

이번 벽타기 시스템 구현에서는 CapsuleCast, Rigidbody, gravity, velocity 등 다양한 물리 관련 요소를 활용해 플레이어가 벽에 매달리고 이동할 수 있도록 만들었다. 기존에 사용하던 Raycast보다 CapsuleCast는 개념이 복잡했지만, 덕분에 더 정밀한 감지가 가능해졌다.

profile
게임 개발일지

0개의 댓글