[Unity] Casting에 대해서 알아보자

권태형·2023년 9월 21일
0

Unity

목록 보기
9/9
post-thumbnail

Casting이란?

오브젝트 유무 검증을 위한 물리적 상호작용

😃Unity 에서 말하는 이 Casting은 C#에서 타입변환에 대한 캐스팅이 아니라, 위와 같이 어떠한 물체가 존재하는지 확인하기 위한 Physics Casting을 의미한다.


if (Physics.Raycast(transform.position, transform.forward, 10)) 
            print("앞에 물체가 있다!!");

//------------------------------------------

if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 10))
{
    Debug.Log($"충돌한 물체는 { hit.transform.name } 입니다."); 
}

Physics의 레이케스트 함수는 보통 위의 두 가지 오버로드된 방식으로 쓰인다.

첫번째 방식은 발사점(첫번째 인자)에서 전방(두번째인자)으로 해당 캐스팅의 최대거리(10)까지 Ray(직선광선)을 발상하여 그 사이에서 출돌되는 물체가 있다면 true를 없다면 false를 반환해준다.

두번째 방식또한 실질적으로 bool값을 반환하지만, RaycastHit타입의 hit변수에 충돌한 오브젝트의 정보를 넣어 주는 내부로직이 있어, 3번째 인자를 사용하여 충돌된 철번째 물체에 대한 정보를 확인할 수 있다.


캐스팅 함수의 종류

😃캐스팅 함수의 종류는 Piysics와 Piysics2D와 조금 달라질 수 있다. 3D와 2D가 다르 듯이 3D에서 SphereCast(구형체 영역 캐스팅)는 2D에서 존재하지 않고 CircleCast(원형태 영형 캐스팅)로 정의되어 있기 때문에 필요에 따라서 찾아 사용해보자.

1. Raycast(), SphereCast(), BoxCast(), CapsuleCast()

  • 일반적으로 첫번째로 충돌된 오브젝트에 대한 여부를 나타낸다. bool값의 반환값을 받거나 RayCastHit 타입의 객체를 반환한다.

2. RaycastAll(), SphereCastAll(), BoxCastAll(), CapsuleCastAll()

  • RayCastHit[] 타입의 배열을 반환한다. 첫번째 출동에 대한 정보가 아닌 최대거리까지 캐스트영역을 발사하여, 충돌한 모든 오브젝트의 정보를 반환해준다.

3. LineCast(Vector3 a, Vector3 b)

  • a와 b 사이에 충돌될 오브젝트가 있는지 여부를 반환한다. 실질적으로 Raycast의 시작점을 a, 방향을 b를 바라보고 최대거리를 a,b사이거리를 넣는다면 같은 기능을 하겠지만, Vector3값 두개만을 인자로 받기때문에 두 물체사이의 충돌물체검증에 있어서 훨씬 간단하게 사용할 수 있다.

✨주의점

  • 캐스팅함수는 정지영역의 검사가 아니라 쭉 방향을보고 검사를 진행한다.

    RaycastHit[] hit = Physics.BoxcastAll(transform.position, 2.0f, transform.forward, transform.rotation, 10.0f)

    위와 같이 코드를 작성한다면, 10.0f거리에서 한변이4.0f로 이루어진 큐브형태의 영역을 검사하는 것이 아니라, 시작점(transform.position)에서 전방(transform.forward)으로 한변이4.0f로 이루어진 큐브형태의 검출체를 10.0f거리까지 발싸하여 그 시작부터 도착점까지의 모든 영역을 검사한다.

    실질적인 검사 영역은 4.0f변을 가진 정육면체의 영역만이 아니라 4.0f, 4.0f, 14.0f만큼의 변길이를 가진 직육면체 형태의 검사 영역을 가지게 된다.


캐스팅과 비슷한 동작을 하는 물리 함수

😃캐스팅과 같은 충돌 오브젝트 검증을 위한 함수들이 Piysics에는 더 존재한다.

Cast함수들은 RayCastHit 타입의 오브젝트를 반환한 것과 달리, Collider[] 오브젝트를 반환한다.

1. OverlapSphere(), OverlapBox(), OverlapCapsule()

  • 특정 지점에서 영역만큼 충돌 오브젝트를 검사하는 함수이다.
  • 또한 Cast함수들은 강제로 최대거리를 입력해야 원하는 위치까지만 검증하고, 만약 적지않으면 무한대의 거리까지 충돌체를 검증하는 것과 달리,
    이 함수들은 그 지점에서 반지름, 상자반크기 등 영역의 범위만 정해주면 딱 거기만 검증해준다.

2. CheckSphere(), CheckBox(), CheckCapsule()

  • 위 의 Overlap함수들과 비슷한 동작을 하지만 반환은 bool값의 true또는 false이다. 순간 해당 영역을 검사해서 충돌체가 하나라도 있으면 true 하나도 없다면 false를 반환해 준다.
profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글