Unity :: 비트연산자와 레이어마스크
Q.비트연산자는 뭐야?A.컴퓨터가 나타내는 제일 작은 단위인 비트(bit = 0 또는 1)비트 연산자는 bit(0,1)을 이동하거나 논리 연산을 할떄 사용하는 것이다.논린 연산을 사용하면 이런식의 결과값을
01149.tistory.com
RayCast를 이용하여 충돌체크시 레이어를 사용하여 최적화 및 가독성을 올릴 수있다.
위에 참고한글은 Unity2D,3D 가릴것 없이 RayCast를 사용하여 레이어를 기준으로 충돌 처리를 적용하는 글이다.
나중에 찾아보게 될때 연관이 있어 링크를 달아놨다.

Q.Ray,RayCast,RayCastHit 가 뭐야?
A.
Ray : 레이저 총 쏠때 그 레이저를 의미하며 , Ray라는 자료형 타입을 이용하여 원하는 방향으로 쏠 수있다.

origin은 레이저의 시작점 , direction은 레이저가 발사되는 방향을 의미한다.
Ray ray = new Ray(transfrom.position,transform.forward); //오브젝트에서 발사
Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f,0.5f,0)); //카메라 중심에서 발사
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //마우스에서 발사


위의 예제로 적은 Camera.main 메서드들은 전부 Ray를 반환하고 있다.
RayCast : 눈에 보이지 않는 레이저(Ray)에 맞은 오브젝트가 무엇인지 판단할때 사용되는 메서드이다.

RayCast는 Physics 포함되어있는 메서드이며 함수오버로딩도 15개나 있는 메서드이다.
//지상에 붙어있는지 확인하는 메서드
bool IsGrounded()
{
//오브젝트를 기준으로 동,서,남,북 방향에서 아랫방향으로 Ray를 발사하는 코드
Ray[] rays = new Ray[4]
{
new Ray(transform.position + (transform.forward * 0.2f) + (transform.up *0.01f), Vector3.down),
new Ray(transform.position + (-transform.forward * 0.2f) + (transform.up *0.01f), Vector3.down),
new Ray(transform.position + (transform.right * 0.2f) + (transform.up *0.01f), Vector3.down),
new Ray(transform.position + (-transform.forward * 0.2f) + (transform.up *0.01f), Vector3.down),
};
//발사된 4개의 Ray를 반복문으로 체크하여 조사
for (int i = 0; i < rays.Length; i++)
{
//Physics.Raycast(탐색하고 싶은 Ray,Ray의 길이,해당 Ray와 충돌시 비교할 레이어마스크)
if (Physics.Raycast(rays[i], 0.1f, groundLayerMask))
{
return true;
}
}
return false;
}

해당 예제 코드는 점프할때 캐릭터가 지상에 붙어있는지 체크하는 메서드이며 동,서,남,북으로 아랫방향으로 Ray를 쏴서
하나라도 Player를 제외한 레이어와 Ray가 충돌시 점프 가능이라고 true를 반환하는 메서드이다.
p.s 레이어마스크를 Inspector로 간단하게 설정하기
위에 참고글을 사용하면 스크립트로도 레이어의 충돌 체크 유무 판단을 내릴 수 있다.
하지만 Inspector로도 간단하게 되기에 적어보았다.
예시) 점프시에 자기 자신 레이어와 겹쳐서 점프가 무조건 된다는 판단을 내리면 안됨
Player 레이어를 제외하고 다른 레이어와 충돌시 점프가 가능하다고 판단


이렇게도 설정이 가능하다.
해당 밑에 글을 참고하면 더욱 쉽게 Raycast와 LayerMask를 쉽게 사용 할 수 있을것이다.
https://dallcom-forever2620.tistory.com/18
[Unity] Raycast Layermask 설정
Raycast 를 사용하여 타겟에게 ray 를 쏴서 처리하고 있을때 자신과 타겟사이에 오브젝트가 끼어들면 ray를 쏘지 못하게 되죠. 당연한 말이지만, raycast 사용중 자신과 타겟사이에 오브젝트가 끼어들
dallcom-forever2620.tistory.com
RayCastHit : Physics.RayCast() 메서드를 사용하여 Ray에 검출된 오브젝트의 충돌 정보만 아닌 충돌된 오브젝트의 정보가 필요할때 사용되는 [ 구조체 ]이다.

Ray ray;
RayCastHit hit;
void Update()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//true 면 RaycastHit에 데이터를 가지고 나옴
if(Physics.Raycast(ray,out hit))
{
Debug.Log("hit.distance"); //Ray의 원점에서 충돌한 객체와의 거리
Debug.Log("hit.point"); //RayCas가 감지된 위치
Debug.Log("hit.transform"); // 충돌객체의 transform에 대한 참조
//충돌한 객체의 콜라이더 컴포넌트에 접근하여 이름 호출
Debug.Log("hit.collider.gameObject.name");
}
}

'Unity > Unity3D' 카테고리의 다른 글
Unity3D :: 3D월드에서 InputSystem을 사용하여 캐릭터 이동 + 카메라 회전 , enum InputActionPhase (0) | 2024.10.25 |
---|---|
Unity3D :: Skybox에 대해서 (0) | 2024.10.24 |