본문 바로가기
개발/게임) 개발관련

문제해결) Unity AABB 갱신 타이밍 이슈 (Collider)

by 테샤르 2025. 6. 4.

Unity AABB 갱신 타이밍 이슈 (Collider)

 

Collider가 어느순간 튀는 현상이 발생했다.

처음에는 Collider의 위치값이 잘못됬거나 실제 타이밍상 이슈가 있을것이라고 생각하고 로그를 찍었지만

특정 상황 (웨이브가 끝나고 새로 오브젝트 풀링이 되는 순간)에서 갑자기 엄한 위치에서 충돌 처리가 되었다.

 

해당 이슈의 여러가지 테스트해보고 해결한 방법을 간단하게 포스팅한다.

 

반응형

 

< 충돌 코드 > 

public override void CheckCollision()
{
	if (!gameObject.activeInHierarchy)
		return;

	Collider[] hitColliders = Physics.OverlapBox(boxCenter, BoxSize * 0.5f);
	foreach (Collider hit in hitColliders)
	{
		if (IsDestroyed)
			break;

		if (hit.CompareTag("Enemy"))
		{
			var enemy = hit.gameObject.GetComponent<Enemy>();
			if (enemy != null)
			{
				isDestroyed = true;
				int damage = Info.damageValue;
				var damagePool = GlobalDefine.Instance.Get<DamagePool>();
				damagePool.MakeDamageUI(damage, enemy.transform.position + new Vector3(0f, 0.5f, 0f));
				enemy.DamageAction(damage);
				Debug.Log($"[NormalProjectile] <color=red>{name}</color> {transform.position} :::  {hit.name} {hit.transform.position} OnCollisionEnter : {enemy.name} : {IsDestroyed} hp : {enemy.HpValue}");
				FinishAction();
				
				break;
			}
		}
	}
}

 

< 해결 방법 >

 

Object Pooling 이후에 초기화하기전 시점을 명확하게 하거나 위치를 명시한다.

Update가 아닌 FixedUpdate에서 물리 체크를 한다.

transform.position, scale, rotation이 바뀐 후 충돌 체크를 한다.

포지션이 변경된 이후에 Collider.enable = false; / Collider.enable = true를 해서 바로 갱신한다.

 

정확한 이슈는 위치의 이동이후에 Collider의 bounds의 위치가 갱신되지 않은 상태에서 충돌 처리를 하게된 케이스였다.

 

 

 

★☆☆☆☆

 

반응형

댓글