프로젝트/시험을 보다가 잘 모르는 부분이 있어 알아보았다.
게임 오브젝트에 연결되어 물리적 충돌을 목적으로 게임 오브젝트 모양을 정의하는 "콜라이더"를 통해 충돌을 처리한다.
콜라이더collider는 실제로 보이는 것은 아니고, 단지 충돌감지에 목적이 있다.
충돌이 일어나는 시점을 감지하고 OnCollisionEnter함수를 이용하면 collider로서의 충돌을 파악할 수 있다. 동시에 충돌을 일으키지 않으면서 다른 콜라이더 공간에 들어가는것만 감지하도록 할 수도 있는데, 이건 "IsTrigger"프로퍼티를 이용하면 가능하다.
강체로서 역할을 하지 않고, 통과하는것을 허용한다. 이건 OnTriggerEnter함수를 통해 작동한다.
OnTriggerEnter(Collider collider)
트리거 작동 시작시
OnTriggerExit(Collider collider)
충돌이 끝난 시점
OnTriggerStay(Collider collider)
충돌(통과)중일 동안에
위에 함수는 Trigger일때 작동하는 것이고, collision으로는 Trigger 대신에 Collision으로 작성하면 된다.
실제 작성 코드는 밑과 같다
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log(attackData.target.value);
Debug.Log(collision.gameObject.layer);
if (IsLayerMatched(levelCollisionLayer.value, collision.gameObject.layer))
{
// 벽에서는 충돌한 지점으로부터 약간 앞 쪽에서 발사체를 파괴합니다.
Vector2 destroyPosition = collision.ClosestPoint(transform.position) - direction * .2f;
DestroyBullet(destroyPosition, fxOnDestory);
}
else if (IsLayerMatched(attackData.target.value, collision.gameObject.layer))
{
// 충돌한 지점에서 발사체를 파괴
DestroyBullet(collision.ClosestPoint(transform.position), fxOnDestory);
//아래부터 체력 관련코드
HealthSystem healthSystem = collision.GetComponent<HealthSystem>();
if (healthSystem != null)
{
// 충돌한 오브젝트의 체력을 감소시킵니다.
bool isAttackApplied = healthSystem.ChangeHealth(-(int)attackData.power);
}
//여기까지 체력코드
}
}
OnTriggerEnter2D를 통해 닿은 경우, 총알과 맞은 대상이 어떤 물체인지 파악해야한다.
IsLayerMatched메서드를 통해 그게 어떠한 물체인지 파악한다
벽이라면 첫번째 if문으로, 개체(적 혹은 플레이어)라면 else if문이 실행된다.
collision.closestPoint는 매개변수값과 가장 가까운 콜라이더 표면 위치를 반환한다.
해당 지점에서 총알은 파괴되는 것이다.