플레이어가 벽에 가까이 다가가서 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는 개념이 복잡했지만, 덕분에 더 정밀한 감지가 가능해졌다.