레이캐스트를 사용하면 광선에 충돌되는 콜라이더(Collider)에 대한 거리,위치 등의 자세한 정보를RaycastHit로 반환
레이캐스트는 충돌되는 콜라이더를 반환하므로 콜라이더가 없는 게임오브젝트는 충돌을 감지할 수 없음.
Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance)
시작점(origin)과 방향(direction)으로 레이를 쏘는 함수
시작점과 방향으로 모든 충돌체에 대해 레이를 쏨.
충돌이 되면true를 반환하고RaycastHit로 충돌정보를 넘겨줌.
레이캐스트의 광선은 따로 보이지 않으므로 Debug.DrawRay 함수를 사용하여 나타내줌.
// ray 시작점, ray 방향*길이, ray 색상, 노출 시간
Debug.DrawRay(transform.position, transform.forward * maxDistance, Color.red, 0.3f);
// ray 시작점, ray 방향, 충돌 감지 할 RaycastHit, Ray 길이
if (Physics.Raycast(transform.position, transform.forward, out raycastHit, maxDistance))
{
raycastHit.transform.GetComponent<MeshRenderer>().material.color = Color.black;
}
몬스터에 충돌 했을 경우에만 오브젝트 색상 바꿔주기
// ray 원점, ray 방향, 충돌 감지 할 RaycastHit, Ray 길이
if (Physics.Raycast(transform.position, transform.forward, out hit, maxDistance))
{
if (hit.collider.name == "Monster" ) // 충돌한 오브젝트가 Monster라면
{
hit.transform.GetComponent<MeshRenderer>().material.color = Color.black;
Debug.Log("몬스터입니다.");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayScript : MonoBehaviour
{
RaycastHit raycastHit; // 레이캐스트에 닿았을 때 hit에 저장
float maxDistance = 7f; // 레이 길이
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.position = new Vector3(transform.position.x - 0.1f, transform.position.y, transform.position.z);
}
else if (Input.GetKey(KeyCode.RightArrow))
{
transform.position = new Vector3(transform.position.x + 0.1f, transform.position.y, transform.position.z);
}
if (Input.GetKey(KeyCode.Space))
{
// 캡슐 원점, 캡슐 방향*길이, ray 색상, 노출 시간
Debug.DrawRay(transform.position, transform.forward * maxDistance, Color.red, 0.3f);
// ray 시작점, ray 방향, 충돌 감지 할 RaycastHit, Ray 길이
if (Physics.Raycast(transform.position, transform.forward, out raycastHit, maxDistance))
{
raycastHit.transform.GetComponent<MeshRenderer>().material.color = Color.black;
}
}
}
// 씬 화면에서 보임
private void OnDrawGizmos()
{
Gizmos.color = Color.green;
Gizmos.DrawRay(transform.position, transform.forward * maxDistance);
}
}