Unity

[Unity] 코드: 안티데시스 보스전 리빌드하기 / 4주차

시카Dev 2025. 6. 13. 20:12

2025. 5. 30 <오브젝트 풀링으로 적을 소환해보자>

보스가 잡몹을 소환할 때 이것은 어떻게 관리할 수 있을까?

반복적으로 잡몹을 생성하고 삭제하면 많은 자원이 소모될 것이다

따라서 이것은 오브젝트 풀링 방법으로 관리하는 것이 좋겠다

디자인 패턴으로 치면 싱글톤 패턴이다.

 

잡몹은 보스 주변에 생성되고, 생성될 때마다 카메라가 살짝씩 위아래로 흔들리는 연출을 더할 것이다

소환될 때마다 풀에서 꺼내 위치가 초기화되고 플레이어를 따라다닌다.

 

이런 식으로 자유롭게 소환이 가능했으면 한다

 

먼저 프리팹 배열과 그것을 담을 풀 리스트를 선언한다.

풀 리스트는 프리팹의 길이만큼 초기화되고, 10개의 잡몹을 만들 것이다. 또한 Get에서 현재 오브젝트가 비어있다면 풀의 인덱스로 오브젝트를 넣어준다.

 

이후 적 스포너 스크립트에서, 풀링 스크립트를 담은 게임 오브젝트의 첫번째 적을 소환하도록 했다. 적의 종류가 하나기에 길이는 0이다.

하지만 오류가 일어나며 실행이 되지 않았으니... 풀매니저에 정적 변수가 있어야 한다고라? 찾아보니 내가 이것을 클래스 이름으로 접근하여 그런 것임을 알게 되었다

 

Pool이 인스턴스 변수기에 EnemyPoolManager 객체를 참고해야 한다.

채찍피티 선생님과 고쳐보며 해당 객체를 싱글톤으로 수정해보았다.

 

방법은 간단하게 EnemyPoolManager를 Instance 선언하고 Awake에서 셀프 참조하는 것이다

 

이런 식으로 10마리 생성되있는 것을 볼 수 있다!

 

그 다음은 보스 주변에서 시간차를 두고 이것들이 생성되도록 해야한다

 


 

2025. 5. 31 <적을 소환해보자2>

스포너 코드를 일부 수정하여 페이즈에 따라 3마리, 4마리, 5마리씩 인스턴스 스폰되도록 할 것이다

스포너 스크립트에 코루틴으로 잡몹 소환 시 카메라가 흔들리게 했다

 

다만 기존의 카메라 좌표 LateUpdate에 겹쳐져서 흔들리지 않는 오류가 있었는데, 스포너 스크립트에 ApplyShake와 ResetShake 함수를 추가해서 예외적으로 처리했다

 

또한 잡몹이 보스몹 근처에서 소환될 때마다 보스몹이 밀리거나 부딪히는 현상이 있었다

둘다 콜라이더가 있으므로, 이는 Physics 2D에서 조정하면 된다

 

잡몹은 Enemy, 보스몹은 Boss인데 둘이 겹치는 구간에 체크된 것을 해제하면 된다

그리고 잡몹이 플레이어를 따라가는 것을 구현하는데 작은 오류가 있었다. 플레이어가 잡몹을 따라가면 잡몹은 뒤로 물러나고, 플레이어가 반대 방향으로 가면 잡몹이 따라오는 이크에크 문제가 있었다

 

잡몹의 컴포넌트 요소를 확인해보니 플레이어의 트랜스폼이 연결되어 있지 않았다

하이어라키 맨 아래에 있는 잡몹 프리팹에 트랜스폼과 애니메이터 모두 정상적으로 연결되어 있었음에도 불구하고,,

 

그래서 오브젝트가 활성화 될 때마다 호출되는 OnEnable에서 테그로 플레이어를 찾아 넣어주었다

 

Animator is not playing an AnimatorController 경고가 계속 떴는데... 실제로 사용할 애니메이션 클립이나 상태가 없어서 그런 거라고 한다. 오류가 아니라서 고칠 필요는 없지만 경고창을 뿜뿜하느라 많은 자원을 소모하고 있어서 고쳐야겠다

 

알고보니 Enemy 풀링 오브젝트에도 잡몹 컨트롤러 스크립트를 연결해놔서 생긴 오류였다. 컴포넌트 연결 확인을 잘 숙지하자...

 

 

이렇게 잡몹이 잘 소환되는 것을 확인할 수 있다!

 


 

2025. 6. 1 <잡몹에게 데미지가 들어가게 해보자>

맵에서 스폰된 잡몹은 플레이어가 곧장 가서 때릴 수 없다

초반에는 방어막이 쳐져 있다는 설정으로, NPC에게 가서 말을 걸어야 그것이 해금되기 때문이다.

 

1. 보스몹 주변에서 잡몹이 소환된다

2. NPC에게 다가가 말을 건다

3. 그제서야 잡몹을 때릴 수 있다

4. 3대 때리면 잡몹이 사라진다

 

NPC와 상호작용 후 때릴 수 있는 조건은 bool 타입 플래그면 충분해 보인다.

 

NPC 스크립트의 Update 내부 함수를 Interaction으로 분할했다

여기서는 말을 걸면 보스의 방어막 뿐만 아니라 잡몹에게 데미지가 가해지게끔 canBeDamaged 플레그가 true된다.

근접무기 스크립트에서도 마찬가지로 잡몹과의 콜라이더 충돌 판정을 추가했다

 

그리고 테스트 해보니 데미지 판정은 들어가는데, 맞는 이펙트와 소리가 나오지 않았다

잡몹이 데미지를 받는 코드를 보면 맞을 때마다 체력이 1 깎이고, 0이 되면 SetActive false가 되며 죽는다.

디버그해보며 현재 잡몹의 체력과 데미지를 받았는지 확인해보았다

 

혹시나가 역시나! 엄청나게 데미지가 들어가서 그런 것임을 깨달았다.

풀링으로 인스턴스 소환된 잡몹끼리 체력 3을 공유하고 있는 것일까? 콜라이더 트리거 되는 동안 TakeDamage를 계속 호출하므로 짧은 시간동안 체력이 엄청 깎이는 걸까?

 

근접무기에서 데미지 판정을 하는 코드를 보니 어쩌면 프리팹에 이어진 enemy의 스크립트만 참고하는 것으로 보였다

즉 소환되는 오브젝트 풀링 잡몹이 아니라 프로젝트에 있는 프리팹 원본을 참고하는 듯 하였다. 따라서 이 부분은 GetComponent로 불러들였다

 

어찌저찌 어울렁더울렁 여러번의 시행착오 끝에 고쳤다

 

공격이 들어간다!ㅋㅋㅋ

 


 

2025. 6. 3 <타이머를 추가하자>

원판 게임에서는 플레이어가 NPC에게 말을 걸고 나서 약 15초동안 화면 위에 타이머가 생긴다.

이 타이머가 끝나면 보스의 방어막이 풀리고 플레이어에게 달려들기 시작한다

오늘은 이 화면 위에 뜨는 타이머를 추가할 것이다

 

사용할 타이머 TMP를 추가하고 공란으로 둔다

또한 타이머 스크립트가 추가될 타이머 매니저 오브젝트를 생성하고 꺼둔다

 

타이머 오브젝트에서는 이 타이머가 활성화 될 때 주어진 시간에서 계속해서 차감하게 된다.

만약 타이머가 0초가 되었다면 보스의 방어막이 꺼지게 된다

하지만 타이머가 꺼질 때 보스 방어막이 꺼지는 효과음이 나오지 않았다

 

아마 효과음이 나오려고 할때 SetActive false가 되어 그런 것일까?

따라서 Invoke로 1초 뒤에 타이머가 없어지는 DeleteTimer 함수를 실행했다

 

 

요로코롬 타이머가 없어지며 보스 방어막이 없어지는 효과음이 나는 것을 확인할 수 있다

 


 

2025. 6. 4

보스 체력바 ui를 조금 다듬었다

또한 초반부 설명 이후 잡몹이 스폰되도록 조정했다!