내일배움캠프 TIL

내일배움캠프 38일차 TIL "Raycast관련 트러블슈팅"

Jooglorystar 2024. 11. 11. 21:00

 

 

플레이어를 움직이면서, 어떤 장애물이 있으면 그쪽으로는 이동하지 못하게하는 처리가 필요했다.

플레이어에게 Rigidbody를 이용하지 않고, Transform.position을 직접 조작하여 이동하는 식이었기 때문에,

플레이어의 약간 앞 쪽에서 정면을 향해 Ray를 발사해, 장애물의 layer에 해당 하면 이동을 막는 방식을 사용하기로 했다.

 

처음엔 다음과 같은 코드를 사용했다.

 

private bool IsBlock(Vector3 moveValue) 
{
    Vector3 moveDir = new Vector3(moveValue.x, 0, moveValue.z).normalized;
    
    Ray ray = new Ray(new Vector3(transform.position.x, transform.position.y + 0.5f, transform.position.z + 0.5f), moveDir); 
    
    if (Physics.Raycast(ray, 1f, layerMask)) 
    { 
    	return true; 
    } 
    return false; 
}

 

플레이어의 약간 앞 쪽에서, 정면을 향해 Ray를 발사하고, 장애물에 해당하는 Layer에 닿으면 true를 반환하고, 그렇지 않으면 false를 반환하는 메서드를 만들었다.

 

그러나 해당 메서드의 문제점은, 정면에 있는 장애물은 인식하지만, 옆에서 장애물에 접근하는 경우는 제대로 작동하지 않는 다는 문제점이 있었다.

 

Debug.DrawRay와 같은 수단을 이용해 확인해본 결과, 플레이어가 회전한 상태에서도, Ray의 생성위치가 변하지 않았기 때문에, 양 옆으로는 Ray의 사정거리가 닿지 않아 애초에 장애물은 인식하지 못하는 것이 원인이었다.

 

그래서 다음과 같이 코드를 변경하였다.

 

private bool IsBlock(Vector3 moveValue)
{
    Vector3 moveDir = new Vector3(moveValue.x, 0, moveValue.z).normalized;

    Ray ray = new Ray(new Vector3(transform.position.x, transform.position.y + 0.5f, transform.position.z), moveDir);
  
    if (Physics.Raycast(ray, 1.5f, layerMask))
    {
        return true;
    }
    return false;
}

 

 

 

Ray의 발사 위치를 플레이어의 앞이 아닌, 정 중앙에서 발사하고, Ray의 거리를 다소 늘리는 것으로 플레이어가 사방의 장애물을 인식하게 만들 수 있었다.