프로그래밍 / C++ / 언리얼

Programming/C# | Unity

[Unitiy] Raycast _ 마우스 입력으로 오브젝트 변화시키기

아트성 2022. 8. 7. 01:11

Raycast 개요

Unity의 Raycast는 광선을 발사하여 오브젝트가 적중하면 bool값을 true로 반환하는 Physics 함수다.

그런 뒤 거리, 맞은 물체의 여러가지 정보들을 RaycastHit타입의 변수에 저장하여 사용하거나, 물체를 변화시킬 수 있다.

physics.Raycast의 매개변수

Vector3  origin : 광선 발사 지점
Vector3 direction : 발사하는 방향
Ray ray : origin과 direction이 합쳐진 형태, 광선
RaycastHit hit : 충돌체와 충돌체의 정보를 가지고있는 변수
float  distance : 광선의 길이, 없으면 무한대 발사
int layerMask : 레이어로 지정되어 특정 오브젝트만 충돌하게 만든다.

int layerMask = 1 << 6 // 6번 레이어만 감지
int layerMask = ~(1 << 6) // 6번 레이어만 무시한다.
int layerMask = 1 << LayerMask.NameToLayer("Player") // player라는 이름의 레이어만 충돌체크함
int layerMask = (1 << 6 | 1 << 7) // 6번 레이어, 7번 레이어 감지

 

 

// 유형1
physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit hitInfo, float distance, int LayerMask);


// 유형2
Ray myRay = new Ray(Vector3 origin, Vector3 direction);
physics.Raycast(myRay, RaycastHit hitInfo, float distance, int LayerMask);

 

Raycast 예제

 

마우스로 클릭을 하면 큐브의 색깔이 바뀌는 간단한 예제다.

ScreenPointToRay로 스크린상에서 마우스로 클릭한 위치를 바탕으로 광선으로 만들어서 Ray타입의 변수를 만든다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayCastTest : MonoBehaviour
{
    void Update()
    {
        updateInput();
    }

    private void updateInput()
    {
        if (Input.GetMouseButtonDown(0))
        {
            raycasting();
        }
    }

    void raycasting()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        float distance = 100f;
        int layerMask = ~(1 << 6);
        Debug.DrawRay(ray.origin, ray.direction * 20f, Color.red);

        if (Physics.Raycast(ray, out hit, distance, layerMask))
        {
            Debug.Log(hit.transform.gameObject);
            MeshRenderer meshRenderer = hit.transform.gameObject.GetComponent<MeshRenderer>();

            if (meshRenderer.material.color == Color.white)
            {
                meshRenderer.material.color = Color.red;
            }

            else if (meshRenderer.material.color == Color.red)
            {
                meshRenderer.material.color = Color.green;
            }

            else if (meshRenderer.material.color == Color.green)
            {
                meshRenderer.material.color = Color.blue;
            }

            else if (meshRenderer.material.color == Color.blue)
            {
                meshRenderer.material.color = Color.white;
            }
        }
    }
}

반응형