24.03.21 TIL Unity - OnTriggerEnter로 충돌 위치 검사 | 이펙트 위치 조절

JJwoo·2024년 3월 21일
private void OnTriggerEnter2D(Collider2D collision)
    {
        if (((1 << collision.gameObject.layer) & (1 << 7)) != 0)
        {
            Instantiate(meleeHitEffect, collision.transform.position, Quaternion.identity);

            //collision.SendMessage("TakeDamage", playerStatus.Atk);  // 몬스터에게 데미지
        }
    }
}

플레이어가 공격하면 Trigger 충돌 검사를 통해 히트 이펙트를 발동시키는 메서드다.

한 가지 디테일적인 문제가 있다면

collision.transform.position
충돌한 지점, 시각적으로는 충돌 객체의 중심에서 히트 이펙트가 발생한다는 것이었다. (아래 참조)

만약 충돌 객체가 거대한 몬스터라면 히트 이펙트 발생 시 중간에서 이펙트가 발생 된다면 위화감이 들 수 있으니 콜라이더끼리 충돌한 지점에서 이펙트가 발생되게 하고 싶었다.

하지만 문제가 있었는데..

OnTriggerEnter에서는 충돌이 발생한 정확한 지점을 직접 얻을 수 없다는 것.
(물리적 충돌이 아니니까)
OnCollisionEnter가 실제 충돌 지점을 얻을 수 있는 부분과 대조적이다.

그렇다면 OnCollisionEnter를 사용하여 히트 이펙트를 적용하되, 실제 물리적 충돌을 방지하는 방법 대신
현재 사용하고 있는 OnTriggerEnter 충돌 검사 방식을 유지하되, 플레이어와 몬스터 사이에 적절한 히트 이펙트 위치를 구현해보고자 했다.

사진의 코드를 참고하면

플레이어와 몬스터의 콜라이더 중심을 찾고, 두 위치의 평균을 계산하여 발생시키도록 했는데 이와 같은 경우 각 콜라이더의 끝에서 충돌이 발생 시,

예를 들어 몬스터가 작다면 이펙트가 오브젝트에 겹치는 게 아닌 둘 사이의 공백에 나타난다는 것이었다.

그래서 좀 더 몬스터 중심 쪽에서 이펙트가 발생하게 해보기로 했다.

콜라이더 중심을 찾는 과정은 같으나, 두 중심 지점 사이 방향 벡터 계산 및 생성 위치 이동 로직이 추가되었다.

2번째 줄에서 방향 벡터 계산 시 .normalized를 사용 된 이유는 벡터의 크기를 1로 정규화하여 방향만을 나타내는 단위 벡터를 얻기 위함이었고,
이 단위 벡터에 스칼라 값을 곱하여 해당 방향으로 원하는 만큼 이동할 수 있다.
현재 스칼라 값은 임시로 0.25f 곱해주었다.

사진으로는 큰 차이가 없어보이지만 실제 플레이에선 보다 자연스러워졌다.

profile
개발 모코코

0개의 댓글