말감로그

24.10.02 Unity - 물리 충돌 수정, Raycast 본문

TIL

24.10.02 Unity - 물리 충돌 수정, Raycast

habbn 2024. 10. 2. 18:00
728x90

플레이어 회전

플레이어가 오브젝트에 닿으면 혼자 빙글빙글 도는 현상이 있었는데, 이것은 외부 충돌에 의해 리지드바디의 회전 속력이 발생해서 도는 것이다.

그래서 angulerVelocity - 물리 회전 속도 를 0으로 지정하여 스스로 돌지 않게 한다.

void FixedRotation()
{
    // 물리 회전 속도를 0으로 지정하면 스스로 돌지 않게 됨.
    rigid.angularVelocity = Vector3.zero;
}

 

 

충돌 레이어 설정

Layer Collision Masks - 레이어들의 상호 간 충돌 설정

 

탄약은 탄약만 충돌, 플레이어 총알은 플레이어 무시 하도록 설정해준다.

 

플레이어 벽 관통 방지

RayCast로 벽 오브젝트를 감지하여 벽을 관통하지 못하게 한다.

void StopToWall()
{
    Debug.DrawRay(transform.position, transform.forward * 2.5f, Color.green);        
    isBorder = Physics.Raycast(transform.position, transform.forward, 2.5f, LayerMask.GetMask("Wall")); 
}

 


Physics. RayCast

직선을 씬에 투영하여 대상에 적중되면 true를 리턴하는 물리 함수이다.

Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask);

 

origin에서 direction 방향으로 maxDistance 길이의 광선을 쏜다.

해당 layerMask의 Colldier만 충돌하며, 충돌체에 대한 정보를 hitInfo에 담는다.

 

Ray 구조체

Ray는 직선의 시작점(origin)과 방향(direction)을 가지고 있는 단순한 구조체이다. 시작점은 Vector3 타입의 월드 포지션이며 방향은 직선의 방향을 나타내는 Vector3 타입의 법선 벡터이다.

Ray ray = new Ray(transform.position, transform.forward);

 

스크린의 마우스 위치로부터 Ray를 만드는 경우

Ray ray = UnityEngine.Camera.main.ScreenPointToRay(Input.mousePosition);

 

 

Ray가 시작되는 위치와 방향을 결정한 후, Ray로부터 얻은 데이터를 RaycastHit 변수에 저장한다.

Physics.RayCast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);

 

RayCastHit

객체와 Ray의 충돌에 대한 결과 정보를 저장하는 구조체이다. Raycast 함수의 out 파라미터로 사용되며 월드에서 레이캐스팅 히트가 발생한 위치, Ray가 충돌한 물체, Ray의 원점에서 얼마나 떨어져있는지 등의 정보를 저장하여 돌려준다.

 

Debug.DrawRay

Debug.DrawRay(Vector3 origin, Vector3 direction, Color color, float duration, bool depthTest);

 

origin에서 origin + direction 좌표까지 color 색으로 광선을 쏜다. duration초 동안 광선이 유지되며 depthTest에 따라 광선이 오브젝트에 가리는 부분을 눈에 띄게 출력할지 말지 결정한다.  (뒤에 두 인자는 생략 가능)

 

 

Raycast는 기본적으로 충돌해야 하는 오브젝트와 충돌 시 , 통과하지 못하는 성질을 가지고 있다.

10f 길이의 광선을 쏘아도, 맨 앞에 있는 오브젝트만 충돌하게 된다. 고로 설정한 모든 충돌체를 한 번에 감지하려면 RaycastAll을 사용해야 한다.  RaycastHit[] 반환형으로 가진다.

Physics.RayCastAll(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);

 

SphereCastAll : 구체 모양의 레이캐스팅이다. 

// SphereCastAll : 구체 모양의 레이캐스팅(모든 오브젝트를 다 가져옴)
RaycastHit[] rayHits = Physics.SphereCastAll(transform.position, 15, Vector3.up, 0f, LayerMask.GetMask("Enemy"));

foreach(RaycastHit hitObj in rayHits)
{
    hitObj.transform.GetComponent<Enemy>().HitByGrenade(transform.position);
}

 

 

 

 

참고

https://sikpang.tistory.com/4

728x90