study/유니티
[유니티] Raycast, Gizmo
김람보
2021. 10. 21. 17:51
1. Physics.Raycast
레이캐스트는 광선을 쏘아주는 것
레이캐스트를 사용하면 광선에 충돌되는 콜라이더(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("몬스터입니다.");
}
}
2. Gizmos(기즈모)
씬뷰에서 설정을 돕기위해 사용.
// 씬 화면에서 보임
private void OnDrawGizmos()
{
Gizmos.color = Color.green;
Gizmos.DrawRay(transform.position, transform.forward * maxDistance);
}
// 매 프레임마다 호출
void OnDrawGizmos()
{
}
// 오브젝트 선택 시 호출
void OnDrawGizomosSelected()
{
}
color | 다음 프레임에 그려질 기즈모(gizmo)의 색상을 설정합니다. |
matrix | 기즈모(gizmo)를 그리기 위해 사용되는 기즈모 행렬을 설정합니다. |
DrawCube | /center/와 /size/를 가지는 박스를 그립니다. |
DrawFrustum | 현재 Gizmos.matrix를 사용하여 카메라 절두체를 그립니다. |
DrawGUITexture | 씬에 텍스쳐를 그립니다. |
DrawIcon | 씬뷰에서 위치에 아이콘을 그립니다. |
DrawLine | /from/에서 /to/로 향하는 라인을 그립니다. |
DrawMesh | Draws a mesh. |
DrawRay | from 에서 from + direction 에 있는 레이를 그립니다. |
DrawSphere | center, /radius/와 함께 구체를 그립니다. |
DrawWireCube | center, /size/와 함께 Wireframe Box를 그립니다. |
DrawWireMesh | Draws a wireframe mesh. |
DrawWireSphere | center, /radius/와 함께 Wireframe 구체를 그립니다. |
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);
}
}