오늘 한 일
- 챌린지반 과제 풀이
- 스파르타 코딩클럽 진도 나가기 (~ 1-10)
유니티의 기능 중 하나로 보이지 않는 선(Ray)을 출력하여 해당 선에 닿인 오브젝트들의 정보를 가져오는 유니티 기능 중 하나이다.
Ray 만들기
Ray ray = new Ray(transform.position, transform.forward); // 오브젝트 Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0)); // 카메라 중심 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition)); // 마우스
Raycast를 활용해서 검출하기
void Update() { IsPlayer(); } void IsPlayer() { Ray ray = new Ray(lazer.position, Vector3.forward); // (위치, 방향) if (Physics.Raycast(ray, 10f, playerLayerMask)) { text.text = "정면 감지됨"; } }
매개 변수에 대한 설명
origin
- Ray 시작점
direction
- Ray 방향
! 위 둘을 퉁쳐서 ray를 넣기도 한다.
maxDistance
- Ray의 최대 검출 거리 (기본값은 Infinite이다)
layerMask
- Ray에 적중된 오브젝트가 건네준 레이어와 동일한 지 검사
RaycastHit
- 가장 가까운 오브젝트의 정보를 가져옴
-> RaycastHit - 객체의 정보
-> RaycastHit.point - 레이캐스팅이 감지된 위치
-> RaycastHit.distance - Ray의 원점에서 충돌 지점까지의 거리
-> RaycastHit.transform - 충돌 객체의 transform 정보queryTriggerInteraction
- 적중된 오브젝트들을 쿼리를 통해서 감지할 지 무시할 지 정한다.
각종 오버로딩
-> Physics.Raycast
Raycast를 제대로 활용하려면 오브젝트의 방향이 어디인지 알아야한다.
- 해당 화살표들은 보면, 빨간색은 X, 녹색은 Y, 파란색은 Z 방향이다.
실험 코드
void IsPlayer() { Ray rayF = new Ray(lazer.position, Vector3.forward); // (위치, 방향) Ray rayB = new Ray(lazer.position, Vector3.back); Ray rayL = new Ray(lazer.position, Vector3.left); Ray rayR = new Ray(lazer.position, Vector3.right); Ray rayU = new Ray(lazer.position, Vector3.up); if (Physics.Raycast(rayF, 10f, playerLayerMask)) { text.text = "정면 감지됨"; } else if (Physics.Raycast(rayB, 10f, playerLayerMask)) { text.text = "후면 감지됨"; } else if (Physics.Raycast(rayL, 10f, playerLayerMask)) { text.text = "좌측 감지됨"; } else if (Physics.Raycast(rayR, 10f, playerLayerMask)) { text.text = "우측 감지됨"; } else if (Physics.Raycast(rayU, 10f, playerLayerMask)) { text.text = "상측 감지됨"; } else { text.text = "아무것도 감지되지 않음"; } }
영상 결과
- 기본적인 시험
- 해당 영상을 보면 아래와 같은 결과가 도출될 수 있음을 알 수 있다.
- 오브젝트들을 관리할 때 이 화살표를 유의하면서 Raycast를 활용해주자
- rotation을 돌려서 시험
- rotation이 바뀐거랑 Ray의 방향이랑은 전혀 관계가 없는 것 같다.
새로운 강의 자료가 나오니 실력을 더 쌓을 수 있게 될 수 있어서 좋은 반면 해당 강의 내용을 제대로 소화해내려면은 TIL을 좀 더 간결하고 알차게 써줘야할 필요성이 느껴진다.