[TIL] 경사면(Slope) 알아내기

Dreamer·2024년 10월 25일

1. 오늘 주제

오늘은 경사면을 알아내는 방법을 작성해보려고 한다. rigidbody를 사용하여 경사면을 올라가거나 내려가는 경우에 몇몇 문제점들이 있는데 이럴때 알아두면 좋은 방법을 남겨보려고 한다.

2. 경사면의 법선벡터와 투영

캐릭터가 이동할때 지속적으로 바닥에 ray를 쏘고 경사면인지 확인하여 투영된 각도를 알아내는 방법이다.

private bool IsOnSlope()
{
	Ray ray = new Ray(transform.position + (transform.forward * 0.2f) + (transform.up * 0.1f), Vector3.down);
    if (Physics.Raycast(ray, out slopeHit, 0.15f, groundLayerMask))
    {
    	// slopeHit.normal 이 법선 벡터가 된다.
    	float angle = Vector3.Angle(Vector3.up, slopeHit.normal);
        // 각도를 알아냈으면 maxSlopeLimit 을 비교하여 경사면인지 판단 할 수 있다.
        return angle != 0f && angle < maxSlopeLimit;
    }

	return false;
}

이렇게 하면 경사면 인지를 판단했으니 다음과 같이 투영 벡터를 구하여 경사면 방향으로 지정해주면 된다.

// 진행 방향을 계산하고
Vector3 velocity = transform.forward * direction.y + transform.right * direction.x;
// 법선벡터를 통해 투영된 벡터를 구하여
velocity = Vector3.ProjectOnPlane(velocity, slopeHit.normal).normalized;
rigidbody.velocity = velocity;

그러면 자연스럽게 경사면을 타고 올라갈 수 있다.
내려가는건.. rigidbody의 useGravity를 false로 설정하여 움직이면 통통 튀면서 내려오거나 미끄러짐을 방지 할 수 있다.

profile
새로운 시작

0개의 댓글