Undead Survivor 게임 개발 3일차

mingu Lee·2025년 4월 7일

오늘은 Player의 공격과 적 피격 Event에 대해서 작업을 진행했다.

  1. 근접 무기
  2. 원거리 무기
  3. 적 피격 Event

총 3가지를 진행했다.

근접 무기


먼저 Player 근접 무기를 구현했는데 Player 기준으로 주변을 돌아다니는 방식으로 만들었다.

위 사진의 삽이 Player 주변을 돌며 Enemy에 닿으면 적에게 Damage를 입힌다.

이런 식으로 Player 주변을 감싸면서 빙빙 돌고있는 무기이다.

이를 위해서 Player 자식으로 Weapon이라는 Object를 추가하여 추후 특정 Event마다 근접 무기가 하나씩 증가하는 방향으로 코드를 작성했다.

위 코드는 Weapon Object에 추가되어있는 Script의 일부이며, Bullet(삽)이 생성되어 Player 주변을 돌아다니게 하는 코드이다.

Object Pool에서 Object를 하나 받아와 Weapon의 자식으로 추가한 후, 삽의 개수에 따라 각 삽의 각도를 구하고 위치를 설정해주었다.

이후 이 삽들의 부모인 Weapon을 Update 함수에서 계속 회전시켜주면 삽들이 Player 주변을 빙글빙글 돌고있는 기능을 만들 수 있다.

일단은 근접 무기가 잘 생성되고 Player 주변을 제대로 돌아다니는지 테스트하기 위해 임시로 스페이스바를 누르면 근접 무기가 하나씩 추가되는 로직을 만들었다.

원거리 무기


Player가 가장 가까운 Enemy를 향해 총알을 발사하는 원거리 무기로 만들었다.

Player와 가장 가까운 Enemy를 찾기위해 Player에게 일정 범위 이내의 Enemy를 탐색하는 Scanner Script를 추가했다.

Physics2D.CircleCastAll를 사용하여 Player를 기준으로 일정 범위 이내의 Enemy Layer를 모두 찾았고, 이렇게 찾은 Enemy 중 거리가 가장 가까운 Enemy를 찾았다.

위 코드를 통해 가장 가까운 Enemy를 찾았다.

이후 총알 발사 함수에서 근처에 적이 존재한다면 총알을 발사하는 코드를 작성했다.

가장 가까운 적 방향으로 총알을 회전시키기 위해 기존에 사용하던 방법인 Atan2 함수를 사용하여 각도를 구하는 코드 대신 골드메탈님이 사용하신 Quaternion.FromToRotation 함수를 사용해보았다.

이후 Bullet Script의 Init 함수에서 총알에 속도를 설정해주면 총알이 가장 가까운 Enemy를 향해 날아가는 기능이 완성된다.

위 사진에서 count는 적을 관통하는 횟수이다.

예를 들어 count가 1이면 적을 1번 관통할 수 있다는 뜻이며, Enemy 2마리가 나란히 있다면 총알이 관통하여 둘다 총알에 Damage를 입는다.

근처에 Enemy가 없을 때는 총알이 발사되지 않다가 Enemy가 근처에 있으면 가장 가까운 Enemy를 향해 총알이 발사되는 것을 볼 수 있다.

위 테스트 영상에서는 관통 값을 1로 설정했다.

적 피격 Event


골드메탈님이 제공해주신 Asset의 Enemy Animation Controller를 보면 Hit State가 존재한다.

Hit Trigger가 발동되면 Hit Animation이 재생되게 설정되어 있다.

그래서 Enemy의 OnHit 함수에서 Enemy가 공격받았을 때 체력이 남아있다면 animator.SetTrigger("Hit")로 Trigger를 발동하여 Hit State로 전환되게끔 했다.

이때 피격 효과를 더 주기위해 피격 당하면 Player 방향의 반대 방향으로 밀려나는 넉백 효과를 추가했다.

Coroutine을 사용하여 비동기적으로 넉백 효과가 발동하게 했다.

하지만 실제 게임을 실행해보면 넉백 효과가 제대로 작동하지 않았다.

왜 그런지 살펴보니 Enemy에게 AddForce로 힘을 주어도 FixedUpdate에서 Move 함수를 통해 Enemy의 velocity 값을 초기화해주고 있었기 때문에 넉백 효과가 제대로 작동하지 않았던 것이다.

그래서 FixedUpdate 함수에서 현재 Enemy의 Animator State가 Hit이라면 Move 함수가 실행되지 않게끔 조건을 추가해주었다.

위 조건을 추가하고나니 Enemy의 넉백이 제대로 작동하였다.

오늘의 결과물


profile
Github: https://github.com/dlalsrn

0개의 댓글