Raycast란?
- 어떤 위치에서 광선을 발사해서 그 광선에 닿는 물체가 있는지 검사하는 방식
- Physics 기반
- 보통 레이어 단위로 필터링해서 적용한다.
public class RayInteratcion : MonoBehaviour{
public LayerMask WhatIsTarget;
private Camera playerCam;
public float distance = 100f;
void Start(){
PlayerCam = Camera.main;
}
void Update(){
Vector3 rayOrigin = playerCam.ViewportToWorldPoint(new Vector3(0.5f,0.5f,0f); // 카메라가 보는 시점에서 찍은 곳이 어느 곳인지 Vector3로 반환
//0.5f,0.5f 면 화면의 중앙
Vector3 rayDir = playerCam.transform.forward; //카메라의 앞쪽 방향
Debug.DrawRay(rayOrigin,rayDir * distance, Color.green);
if(Input.GetMouseButtonDown(0))
{
RaycastHit hit;
//발생한 Ray가 특정 Collider에 닿으면 true 반환
if(Physics.Raycast(rayOrigin,rayDir,out hit, distance, whatIsTarget))
{
GameObject hitTarget = hit.collider.GameObject;
hitTarget.GetComponent<Renderer>().material.color = Color.red;
Debug.Log(hitTarget.name);
moveTarget = hitTarget.transform;
targetDistance = hit.distance;
}
}
if(Input.GetMouseButtonUp(0))
{
if(moveTarget != null)
{
moveTarget.GetComponent<Renderer>().material.color = Color.white;
}
moveTarget = null;
}
if(moveTarget != null)
moveTarget.position = ray.origin + ray.direction * targetDistance;
}
}
Ray ray = new Ray(rayOrigin,rayDir);
~중략~
if(Physics.Raycast(ray, out hit, distance, whatIsTarget)) 으로도 가능
Raycast의 의의
- 정확한 물리처리가 필요할 때 사용 가능.
OnTriggerEnter(), OnCollisionEnter()은 메시지기반, 프레임 기반 처리여서 부정확.
따라서, 플랫포머 게임류는 바닥에 떨어졌을 때 Raycast 기반 체크를 사용하는 것이 일반적.