RaycastHit
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 36번째.
Physics.Raycast는 무엇에 맞았는지도 알려 줄 수 있습니다. 방향 뒤에 out RaycastHit hit를 추가하세요. 메서드가 true를 반환하면 세부 정보가 hit에 채워집니다. out은 C# 메서드가 지정해 준 변수를 통해 추가 값을 돌려주는 방식입니다. 이 거리 측정기는 스페이스바를 누르면 가리키는 대상과 그 대상까지의 거리를 기록합니다.
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 50f))
{
Debug.Log(hit.collider.name + " is " + hit.distance + " units away");
}
}
}앞면이 12유닛 앞에 있는 벽을 가리키면 Wall is 12 units away를 기록합니다. 다른 필드도 살펴보세요. hit.point는 광선이 표면에 닿은 월드 좌표상의 지점이고, hit.normal은 해당 지점에서 표면이 향하는 방향입니다(평평한 바닥에서는 (0, 1, 0)). hit.transform은 맞은 오브젝트의 Transform입니다. hit.collider.gameObject를 통해 태그와 같은 해당 오브젝트의 다른 정보에도 접근할 수 있습니다.
hit은 if 안에서만 읽으세요. 광선이 빗나가면 Raycast는 false를 반환하고 hit에는 쓸 만한 값이 없습니다. collider는 null입니다.
챌린지
중급총에 레이저 조준기를 달아 보세요. 레이저가 닿는 곳에 빨간 점이 표시됩니다.
Update()에서Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range)를 호출하세요.- 맞으면
dot.gameObject.SetActive(true);를 호출하고dot.position = hit.point;로 설정하세요. - 맞지 않으면
dot.gameObject.SetActive(false);를 호출하세요.
‘플레이’를 누르고 총을 돌려 보세요. 점이 벽과 상자 위를 따라 움직입니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class LaserSight : MonoBehaviour
{
public Transform dot;
public float range = 15f;
void Update()
{
// 레이저가 표면에 닿는 위치에 dot을 놓고, 레이저가 아무것도 맞히지 않으면 숨깁니다.
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드