본문 바로가기
AI 게임 제작/AI 코딩

몬스터 스폰 구현

by Yuriring 2025. 9. 25.

프롬프트

코덱스 프롬프트 (적 스폰+추적 + 플레이어 체력/체력바)

유니티 2D(Orthographic) 탑다운 프로젝트에서 다음 기능을 만들고 싶다.
플레이어 이동/카메라 추적/배경 타일맵/자동 발사는 이미 완료되어 있다.
내가 원하는 것은 적 스폰과 추적, 그리고 플레이어 체력/체력바 UI다.
몬스터 스프라이트 이미지는 내가 따로 제공할 예정이니, SpriteRenderer에 내가 넣어서 쓸 수 있게 구성해 달라.

내가 원하는 시스템
1) 적 기본 동작(간단 추적 AI)
씬에 등장한 적이 플레이어를 향해 계속 다가오고, 너무 가까워지면 멈추는(작은 정지 거리) 단순한 이동.
플레이어와 닿아 있으면 일정 주기(예: 0.5초) 로 플레이어에게 피해(접촉 데미지)를 준다.
적 체력(HP)이 0이 되면 사라진다(풀 반환 또는 파괴).

2) 적 스폰
화면 바깥에서 일정 간격으로 적이 나타난다(스폰 간격 기본 1초).
시간이 지날수록 스폰 속도가 점점 빨라지거나(간단한 곡선/계수) 한 번에 2~3마리 나타나는 빈도가 늘어난다.
씬에 살아있는 적 수의 상한(maxAlive) 을 둬서 과도하게 많아지지 않게 한다.
플레이어로부터 매우 멀어진 적은 자동 정리된다(풀로 되돌리기).

3) 오브젝트 풀링
적은 Prefab 으로 만들고, Instantiate/Destroy 대신 풀에서 꺼내고 넣는다.
풀 초기 크기와 확장 여부를 인스펙터에서 조절 가능.

4) 레이어/태그/충돌
태그: Player, Enemy.
레이어: Player, Enemy, PlayerProjectile(이미 있음).
Physics2D 충돌 매트릭스: Enemy ↔ Player는 충돌(접촉 데미지), PlayerProjectile ↔ Enemy는 충돌(피해 적용), 그 외는 비활성.

5) 플레이어 체력 & 체력바 UI
플레이어에게 체력 컴포넌트(최대/현재 HP, 데미지 받기, 죽음 이벤트).
UI 프리팹으로 붉은색 체력바를 만들어 달라.
Canvas(UI Scale with Screen Size), 화면 좌상단에 고정.
바탕(회색/검정) + 빨간 Fill(현재 체력 비율).
숫자 텍스트(예: HP 80 / 100)가 있으면 더 좋다.
플레이어가 적에게 맞으면 체력바가 줄어드는 것을 즉시 확인할 수 있어야 한다.

구성/파일 구조(예시)
Scripts/Enemy/EnemyController : 이동/추적/접촉 데미지 담당.
Scripts/Enemy/EnemySpawner : 화면 밖 스폰, 최대 수 관리, 난이도 증가.
Scripts/Enemy/EnemyPool : 풀링.
Scripts/Combat/Health : 체력(플레이어/적 공용 가능), 데미지/사망 이벤트.
Scripts/Player/PlayerHealthConnector : 플레이어 Health를 UI와 연결(체력바 갱신).
UI/Prefabs/HealthBar.prefab : 붉은색 체력바.
Prefabs/Enemy.prefab : 적 프리팹(내가 넣을 스프라이트 자리 포함).
Prefabs/EnemyPool.prefab, Prefabs/EnemySpawner.prefab.

컴포넌트/인스펙터 요구사항
Enemy.prefab
SpriteRenderer 1개(여기에 내가 가져온 몬스터 스프라이트를 드래그해 넣으면 됨).
Rigidbody2D(중력 0).
Collider2D(원형/박스 아무거나, IsTrigger=false)로 플레이어와 충돌.
EnemyController(필드: moveSpeed, acceleration/turn, stopDistance, contactDamage, contactCooldown 등).
Health(최대 HP, 현재 HP, 죽으면 풀로 반환하도록 이벤트 연결).
Tag=Enemy, Layer=Enemy.
EnemySpawner (씬에 빈 오브젝트)

필드: spawnInterval, maxAlive, 난이도 배율/곡선, despawnDistance, 화면 바깥 여유(ringMargin).
참조: EnemyPool, Player(Transform).

EnemyPool (씬에 빈 오브젝트)
필드: enemyPrefab(위의 Enemy.prefab), initialCount, poolRoot.
Player
Tag=Player, Layer=Player.
Health(플레이어용; 최대/현재 HP 값을 정해두기).
PlayerHealthConnector가 Health 변경을 UI에 반영.
UI/HealthBar.prefab
Canvas(스크린 스페이스), 앵커는 좌상단.
바탕(회색/검정) 이미지 + 빨간 Fill 이미지(비율로 줄어듦).
(선택) Text로 HP current / max.
씬에 배치하고 PlayerHealthConnector가 이 프리팹의 Fill을 갱신.
몬스터 이미지 연결 방법(내가 할 작업)
프로젝트 창에서 내가 만든 몬스터 PNG를 선택 → Inspector에서
Texture Type = Sprite (2D and UI)
Filter Mode = Point(no filter), Compression=None → Apply.
Prefabs/Enemy.prefab을 열어 SpriteRenderer의 Sprite 슬롯에 방금 스프라이트를 드래그.
필요하면 Sorting Layer/Order로 다른 오브젝트 위아래 표시 조정.

동작 기대치(테스트 기준)
플레이 중 화면 바깥에서 적이 주기적으로 생성되어 플레이어를 향해 이동한다.
적이 플레이어에 닿아 있으면 일정 주기로 체력을 깎는다(체력바가 즉시 줄어듦).
동시 적 수가 maxAlive를 넘지 않는다.
시간이 지날수록 스폰 속도 또는 물량이 증가한다.
멀리 벗어난 적은 자동 정리되어 성능이 유지된다.

참고(선호 사항)
변수값들은 모두 인스펙터에서 조절 가능하게 공개.
숫자 기본값(예: 적 속도/HP/데미지/스폰 간격)은 합리적인 범위로 채워두기.
에러/누락(플레이어 참조 없음, 풀/프리팹 미지정 등) 시 경고 로그로 안내.
가능하면 스크립트/프리팹/씬 배치까지 한 번에 마칠 것.

 

한 번에 성공하지는 못함

  1. 코덱스가 무려 GameScene을 날려버리는 실수를 저질러서 이걸 복구하느라 머리 싸맴
  2. 복구했는데, 몬스터 스폰이 안 되어서, 코덱스에게 물어물어 유니티 몬스터 스폰 세팅 (각종 프리팹)을 함
  3. 그래도 안 되어서 코덱스에게 다시 봐달라고 함
  4. 이제 되기는 하는데, 그밖에 구현해달라고 한 체력바나 체력 개념은 전혀 구현되어 있지 않음

그래도 여기까지 온 게 어디야...

 

중간 프롬프트들

몬스터 스포너를 네가 만들어줬는데 몬스터 스폰이 안 돼. 몬스터 프리팹은 내가 직접 유니티에서 다 연결했어. 그런데도 안 돼. 그리고 체력바도 안 나와. 예전처럼 GameScene을 중복으로 만드는 문제 일으키지 않게 조심하고 한번 확인해봐
몬스터 스폰 (Enemy Clone)은 되고 있는 것 같은데 유니티 화면에서는 안 보여. 1. 어디선가 체크가 해제되어 있거나 2. 위치가 멀면 바로 삭제되는 로직이 있거나 3. 체력이 0으로 스폰되어서 바로 제거되거나 등등 여러 원인이 의심되는데, 이슈를 한번 확인해보고 뭐가 문젠지 찾아봐 몬스터 스폰이 정상적으로 진행되도록 해야 해
이제는 Enemy CLone조차 생성되지 않고 있어. 더 문제가 꼬인 것 같아. 아예 몬스터 스폰이 안 돼.
여전히 몬스터가 안 나타나는데? 내가 유니티에서 설정해야하는것이 있어?