[Toy][Unity] 2D 충돌중 여부 검사

0시0분·2023년 11월 17일
0

Toy

목록 보기
3/18

2D 캐릭터와 오브젝트(ex 아이템)의 충돌 검사를 위해 사용한 방법들을 정리한다.


1. OnTriggerStay 사용

맨 처음에는 Collider2D를 사용해서 체크를 했다.

private void OnTriggerStay2D(Collider2D other)
{
	if (other.gameObject.CompareTag(ClientUtil.PlayerTag))
	{
		if (Input.GetKeyDown(KeyCode.Space))
		{
			// 아이템 획득
		}
	}
}

아이템 획득 기능을 구현하기 위함이었기에 TriggerStay에서 플레이어와 충돌중인지 확인하고
스페이스바가 입력되면 획득 함수를 호출하도록 했다.

그런데 간헐적으로 인식이 안되는 현상(Stay함수로 진입하지 않는 현상)이 있었다.
지피티한테도 물어봤지만 '호출 순서나 프레임이 돌때 딜레이가 생길수 있다' 정도의 의견만 제시할 뿐 명확한 해답은 얻지 못했다.

그래서 다른 방법을 사용하기로 했다.

2. Physics.RayCast 사용

// Debug.DrawRay(m_rigidbody2D.position, Vector2.right * 2, Color.red);	// ✏️ 아래 사진
RaycastHit2D hit = Physics2D.Raycast(m_rigidbody2D.position, Vector2.right, 2f, LayerMask.GetMask(ClientUtil.ItemTag));
if (hit.collider != null)
{
 	// 아이템 획득          
}

Ray를 사용해서 Ray 영역 안(빨간 선)에 부딪힌 물체가 있는지 검사하는 방식인데
단방향 검사밖에 되지 않다 보니 원하는 결과를 얻기가 힘들었다.
다만 플랫포머 장르에서는 유용한 방식이다.

👀 https://kwonriver.tistory.com/102


3. Physics.Overlap 사용

단방향이 아닌 영역 검사를 위해 Overlap 함수를 사용했다.

Collider2D[] hits = Physics2D.OverlapCircleAll(m_rigidbody2D.position, 2, LayerMask.GetMask(ClientUtil.ItemTag));
for (int i = 0; i < hits.Length; ++i)
{
	// 아이템 획득 
}

충돌한 모든 오브젝트들을 검사하기 위해 OverlapCircleAll을 사용했는데
하나씩 처리하고 싶다면 OverlapCircle을 사용하면 된다.

Collider2D hit = Physics2D.OverlapCircle(m_rigidbody2D.position, 2, LayerMask.GetMask(ClientUtil.ItemTag));
if (hit != null)
{
	// 아이템 획득
}

Physics 를 사용하기 때문에 FixedUpdate에서 검사하도록 했다.
단순 TriggerStay를 사용했을 때 보다 확실히 씹히는 현상 없이 잘 인식된다.

0개의 댓글