백지부터 시작하는 이세계 코딩 생활
Raycast, RaycastHit, DrawRay 본문
Raycast
콜라이더 (collider) 와의 충돌 감지를 확인할 수 있게 해주는 bool type 함수.
Ray를 쐈을 때, Collider 에 접촉( 충돌 )하면 Ray를 날린 Object 로 반환된다. 이때 RaycastHit을 통해 접촉한 Object의 정보를 반환 받아볼 수 있다. Collider가 없다면 충돌 감지를 할 수 없다.
Ray는 Collider의 종류를 상관하지 않고 Collider의 정보를 반환한다. 따라서 특정 Object의 정보만 필요할 경우 LayerMask를 통해 구현한다.
Physics 클래스의 내장 함수이다. 따라서 Raycast를 사용하기 위해선 Physics.Raycasy(...) 로 시작한다.
RaycastHit 을 선언해주고 함께 사용해야 한다.
사용하는 방법 :
bool isHit = Physics.Raycast(원점, 방향, 충돌반환(out hit), 레이어 마스크(판별));
public void CheckTarget()
{
Vector3 direction = enemy.Value.transform.position - transform.position;
Vector3 startPos = transform.position;
Vector3 endPos = enemy.Value.transform.position - transform.position;
startPos.y = 0.5f;
endPos.y = 0.5f;
float dist = Vector3.Distance(transform.position, enemy.Value.transform.position);
RaycastHit hit;
bool isHit = Physics.Raycast(startPos, direction, out hit, dist, targetLayer);
/* Physics.Raycast(원점, 방향, 충돌반환(out hit), 거리, 레이어 마스크(판별));
*/
if (isHit && hit.transform.gameObject.layer == LayerMask.NameToLayer("ENEMY"))
{
// Methode
}
}
}
Raycast를 사용하는 형식은 위 사진과 같이 여러가지가 방법이 존재한다.
RaycastHit
Raycast를 통해, 충돌여부 정보를 담아서 반환해주는 구조체.
LayerMask
Layer의 사전적 의미는 "층" 이다.
특정 Object의 Collider 에 대해서만 접촉 (충돌) 판정을 하기 위해 사용한다.
cf. Another Raycast
DrawRay :
Debug 클래스의 내장함수이다. (하위) 따라서 Debug.DrawRay( ... ) 처럼 사용할 수 있다.
Ray의 시각화를 가능하게 해주는 함수이다. 매 프레임 마다 호출된다.
public void DrawGizmoRay()
{
Vector3 direction = enemy.Value.transform.position - transform.position;
Vector3 startPos = transform.position;
Vector3 endPos = enemy.Value.transform.position - transform.position;
startPos.y = 0.5f;
endPos.y = 0.5f;
RaycastHit hit;
bool isHit = Physics.Raycast(startPos, endPos, out hit, dist, targetLayer);
if (isHit && hit.transform.gameObject.layer == LayerMask.NameToLayer("ENEMY"))
{
Debug.DrawRay(startPos, direction, Color.green);
//Debug.DrawRay(Ray시작위치, 방향, Ray 색상);
}
else
{
Debug.DrawRay(startPos, direction, Color.red);
}
}
cf.
float rayTime = 1.0f;
Debug.DrawRay(startPos, direction, Color.green, rayTime);
// 해당 시간(rayTime)동안만 Ray가 표시 되었다가 사라진다.
RaycastAll :
단일 Object가 아닌 Ray와 접촉하는 모든 Collider들의 정보들을 반환한다.
Ray 와 Collider 가 접촉 (충돌)이 발생하면 해당 Collider들의 정보를 배열형식으로 담아온다.
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
void Update()
{
RaycastHit[] hits;
hits = Physics.RaycastAll(transform.position, transform.forward, 100.0F);
for (int i = 0; i < hits.Length; i++)
{
RaycastHit hit = hits[i];
Renderer rend = hit.transform.GetComponent<Renderer>();
if (rend)
{
// Change the material of all hit colliders
// to use a transparent shader.
rend.material.shader = Shader.Find("Transparent/Diffuse");
Color tempColor = rend.material.color;
tempColor.a = 0.3F;
rend.material.color = tempColor;
}
}
}
}
cf.
Renderer : 오브젝트가 스크린에 나타내도록 해주는 클래스.
void Start()
{
rend = GetComponent<Renderer>();
rend.enabled = true;
}
Ref. About Raycast
chameleonstudio.tistory.com/63
docs.unity3d.com/kr/530/ScriptReference/RaycastHit.html
docs.unity3d.com/ScriptReference/Physics.Raycast.html
blog.naver.com/PostView.nhn?blogId=happybaby56&logNo=221370502930
Ref. About struct
'백지부터 시작하는 이세계 유니티 생활 since 2020' 카테고리의 다른 글
FindObjectOfType 와 GetComponent (0) | 2020.11.27 |
---|---|
struct 와 Class (0) | 2020.11.26 |
Singleton (0) | 2020.11.19 |
PointerEventData (0) | 2020.11.19 |
Dictionary (0) | 2020.11.18 |