Raycast

RudinP·2023년 3월 27일
0

Study

목록 보기
7/227

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 기반 체크를 사용하는 것이 일반적.
profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

0개의 댓글