모름

08. some loose ends

이번 시간에는 간단한 게임 종료(플레이어의 죽음)를 만들고 간단하게 오류가 나오지 않도록 예방해주는 코드를 작성했습니다.

 

먼저 타겟의 죽음을 확인하기 위한 함수를 만들었습니다. OnTargetDeath()라는 이름을 가집니다. 이 함수에선 hasTarget을 통해 타겟이 죽었는지 확인하고 타깃이 죽었으면 적의 상태를 Idle로 만들어 정지시킵니다.

 

이렇게 타겟을 확인하기 위해서 targetEntity라는 변수에 타겟의 체력관리 클래스를 가져옵니다. 여기에 LivingEntity의 Die()함수에서 발생하는 OnDeath() 이벤트를 구독시켜서 타겟이 살았는지 죽었는지 늘 확인합니다.

 

이 값이 바로 hasTarget 에 들어가게 됩니다.

 

적은 Attack() 함수를 통해 targetEntity의 체력을 감소시킵니다. targetEntity.TakeDamage(damage); 이렇게 말입니다. 

 

타겟의 체력에 접근하려고 했으나 애초 인터페이스에 강제된 함수는 TakeHit()였습니다. TakeHit는 damage와 hit를 인자로 받는데, 저희는 단순하게 tagetEntity에 damage만 인자로 넘겨주고 싶은 상황입니다. 때문에 TakeDamage()라는 함수를 하나 더 만들어 관리를 해줍니다.

 

마지막으로 무한정 생성되는 총알에 대한 수정도 있었습니다. lifetime을 설정해줘서 총알이 씬뷰에 계속 남아있지 못하도록 해결했습니다. 이어서 적의 콜라이더 내부에서 총알이 발생할 경우 적을 감지 못하는 이슈를 해결했습니다.

 

private void Start()
{
    Destroy(gameObject, lifetime);
    Collider[] initialCollisions = Physics.OverlapSphere(transform.position, 0.1f, collisionMask);

    if(initialCollisions.Length > 0)
    {
    	OnHitObject(initialCollisions[0]);
    }
}

적을 감지하는 코드는 위와 같습니다. 콜라이더 배열을 선언하고 총알을 감지합니다. 이때 사용한 함수가 OverlapSphere()입니다. 이 함수는 기본적으로 중점과 반지름을 할당하고 가상의 원을 만들어 접촉하고 있는 콜라이더를 반환하는 함수입니다.

 

즉, 이 발사체는 태어났을때 가상의 원을 만들어 collisionMask(Enemy)를 감지하고 감지한 적의 콜라이더를 배열로 저장합니다. 

 

그리고 if문을 통해 접촉 여부를 판단하고, OnHitObject()처리를 해줌으로서 적에게 데미지를 입힌걸로 간주합니다.

 

private void OnHitObject(RaycastHit hit)
{
    IDamgeable damgeableObject = hit.collider.GetComponent<IDamgeable>();
    if(damgeableObject != null)
    {
        damgeableObject.TakeHit(damage, hit);
    }

    GameObject.Destroy(this.gameObject);
}

private void OnHitObject(Collider c)
{
    IDamgeable damgeableObject = c.GetComponent<IDamgeable>();
    if (damgeableObject != null)
    {
        damgeableObject.TakeDamage(damage);
    }

    GameObject.Destroy(this.gameObject);
}

이 때 기존에 있던 OnHitObject()는 hit를 인자로 받아 데미지 값을 넘겼습니다. 하지만 이번엔 감지된 Collider를 인자로 받아야하기 때문에 똑같은 함수를 만들어 인자만 다르게 오버라이드 해줬습니다. 

 

그 외에도 skinWidth를 추가하여 총알이 발사하는 레이케스트의 범위를 늘려서 적이 빠르게 접근하는 타이밍에 총알이 적을 감지하지 못하는 상황도 방지했습니다.