[Unity][3D-Game] Tower Defense Game (8)

suhan0304·2023년 12월 1일
0
post-thumbnail

--

강의영상 (10)


개발

미사일 재질 설정

저번 시간에 미사일 런처 모델에서 빼놨던 미사일에 적절한 재질을 생성한 후 적용시켜준다. Missile Launcher Texture를 미사일에 적용시킨 재질의 Albedo에 끌어다 놓아서 빨간 부분을 따로 칠해주지 않고 바로 재질로만 색을 지정해줄 수 있다.

미사일 초기각도 설정

미사일 생성시 바라보는 방향이 터렛의 초기 각도와 맞도록 설정한다. 빈 오브젝트를 만든 후에 트랜스폼 리셋 후 기존의 미사일 모델을 자식 오브젝트로 넣어준 후 GFX로 이름 설정, 사이즈를 100, 100, 100으로 수정한다.

이후에 Bullet 컴포넌트를 추가해주고 이펙트 효과는 임시로 BulletImpact를 사용한다. 추후에 이펙트를 만들어보자.

미사일 이펙트 작업 전에 미사일을 프리팹화 한 다음에 미사일 런처의 Bullet에 해당 프리팹을 초기화해준 후 미사일이 잘 나가는지 확인한다.

총알은 잘 나가지만 속도가 너무 느려 적이 그냥 지나치고 이펙트가 없는 문제가 발생함

미사일 회전 설정

기존의 Bullet에는 Rotation 설정이 없다. 따라서 미사일이 적을 쳐다보면서 갈 수 있도록 Rotation을 설정해준다.

Bullet.cs

transform.Translate(dir.normalized * distanceThisFrame, Space.World); //총알이 적을 향해 이동
transform.LookAt(target); //총알이 적을 향해 바라보도록 설정

위와 같이 총알의 이동 부분에 LookAt 함수를 써서 날아가는 중간에 타겟을 향해 회전하도록 설정한다.

transform.LookAt : 매개변수로 넘어온 GameObject를 바라보도록 회전시키는 함수

미사일이 적을 향해 갈 때 고개 또한 적을 향해 있는 것을 확인할 수 있다. (유도탄 느낌)

총알의 폭발 범위

폭발 범위를 변수로 추가 지정하여 범위가 0이면 단일 공격 0이 아니면 범위 공격으로 인식해서 폭발 데미지 로직이 실행되도록 구현한다.

Bullet.cs

void HitTarget() //총알이 적에 도달했을때
{
    //이펙트 생성(실행) 후 다시 제거
    GameObject effectIns = (GameObject)Instantiate(impactEffect, transform.position, transform.rotation); //이펙트 생성
    Destroy(effectIns, 2f); //2초후에 이펙트 다시 삭제

    if (explosionRadius > 0f) //범위 공격
    {
        Explode();//폭발 함수
    }
    else //단일 타겟
    {
        Damage(target);//목표 오브젝트에만 Damage 함수
    }
    Destroy(gameObject);        //충돌 시 총알은 바로 파괴
}

void Explode() //총알 폭발 - 범위 공격
{
    Collider[] colliders = Physics.OverlapSphere(transform.position, explosionRadius); //원으로 된 반경 이내 모든 콜라이더들을 불러오는 함수
    foreach (Collider collider  in colliders) //각 콜라이더를 접근하면서 에너미만 구별 = 어떻게? 태그로!
    {
        if (collider.CompareTag("Enemy"))
        {
            Debug.Log("Explode Enemy1");
            Damage(collider.transform); //에너미 객체이며 + 폭발 범위 안에 있다? = 데미지 입력
        }
    }
}

void Damage(Transform enemy) // 데미지 입력
{
    Destroy(enemy.gameObject);  // 일단은 적이 데미지 입력 시 바로 죽도록 설정
    Debug.Log("TODO List - (Health - Damage) Logic"); //추후 체력 업데이트 시 데미지 함수 수정 예정
}

private void OnDrawGizmosSelected()
{
    Gizmos.color = Color.green;
    Gizmos.DrawWireSphere(transform.position, explosionRadius);
}

구현 원리는 굉장히 간단한데 폭발 범위를 변수로 선언하고 0이면 단일 타겟 공격, 0이 아니면 범위 공격으로 판정해 범위 내에 있는 에너미 태그를 가지고 있는 콜라이더를 Damage 함수로 넘겨버리는 원리이다.

Physics.OverlapSphere(Vector3, Radius) : 중점과 반지름으로 가상의 원을 만들어 추출하려는 반경 이내에 들어와있는 콜라이더들을 반환하는 함수

  • 반환 값은 Collider 컴포넌트의 배열로 넘어온다.

태그를 비교할 때는 직접적으로 Tag를 불러오는 것보다 CompareTag로 비교하는 것이 더 효율적이다. 간단하게는 CompareTag 함수는 동적할당 없이 tag가 비교 가능하도록 구현된 메소드이다. 또한 중요한 차이점으로는 String이 실제로 존재하는 태그인지 확인하는 동작까지 포함해준다는 점이다.

미사일의 폭발범위는 8으로 설정한다. 기본 터렛의 총알은 그대로 0으로 둔다. (단일 공격이므로)

폭발 범위를 보고 싶으면 아래 코드를 추가하자.

private void OnDrawGizmosSelected()
{
    Gizmos.color = Color.green;
    Gizmos.DrawWireSphere(transform.position, explosionRadius);
}

폭발 이펙트

기본적인 골자는 BulletImpactEffect를 Ctrl+D로 복사해서 만들어주었다.

자세한 속성 값은 위 강의 영상을 참고하거나 업로드 된 프로젝트 파일의 파티클 시스템 프리팹을 확인하자자.

Bullet.cs의 HitTarget 함수의 이펙트 제거 시간을 2초에서 5초로 증가시켜 폭발 이펙트가 정상적으로 실행된 후에 이펙트 오브젝트가 제거되도록 설정한다.

이제 미사일 오브젝트의 Bullet의 ImpactEffect를 MissileExplosionEffect로 설정해준다.

폭발 Light 추가

폭발 시 해당 위치가 살짝 빛나도록 미사일 이펙트의 자식 오브젝트로 Light를 생성해주도록 로직을 구현한다. Point Light 오브젝트를 생성해준다.

  • 이름을 Light로 설정
  • Range = 25로 설정
  • 색은 살짝 진한 주황색으로 설정
  • intensity = 5로 설정
  • Shadow Type을 Shadows로 설정

광원에 대한 자세한 설명은 공식 문서를 참고하자

광원 생성/파괴 애니메이션

광원이 부드럽게 출현하고 없어지도록 Light에 Animator 컴포넌트 추가 후 Light라는 애니메이션 컨트롤러를 만들어주고, ExplosionLight라는 이름으로 애니메이션을 생성해주자.

  • LoopTime은 해제
  • 0.25 초에 intensity가 0으로 되도록 애니메이션 추가

이렇게 하면 생성되면서 Entry가 ExplosionLight 애니메이션과 연결되어있어서 이펙트가 생성되자마자 ExplosinoLight 애니메이션을 한 번 실행하게 된다. 이 애니메이션이 실행되면 intensity가 초기값 5에서 0.25초까지 0으로 천천히 줄어드는 페이드 아웃 효과를 구현할 수 있다.


결과물

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글