본문으로 건너뛰기
게임 프로젝트 기초집LESSON 07

택배 생성 시스템: 생성 위치·주기·종류를 책임에 맞게 분리하기

난이도초급 프로젝트
예상 시간55분
선수지식6강 택배 데이터

7강. 택배 생성 시스템: 생성 위치·주기·종류를 책임에 맞게 분리하기

1. 이번 강의에서 해결할 문제​

Spawner가 랜덤 선택, 이동, 점수와 UI까지 처리하면 수정하기 어렵습니다. 생성 시점과 생성된 택배의 동작을 분리합니다.

2. 학습 목표​

3. 핵심 개념​

Coroutine은 매 프레임 조건을 확인하지 않고 “생성하고 기다리기” 순서를 표현합니다. Spawner는 언제·어디서 만들지만 택배 이동과 판정은 맡지 않습니다. 이 단계는 Instantiate를 사용하고 17강에서 Pool로 교체합니다.

4. 단계별 실습​

C# · 파일 경로: Assets/_Project/Scripts/Gameplay/PackageActor.cs

PackageActor.cs
using DeliverySorter.Data;
using UnityEngine;

namespace DeliverySorter.Gameplay
{
public sealed class PackageActor : MonoBehaviour
{
[SerializeField] private SpriteRenderer spriteRenderer;
private float fallSpeed;
public PackageDefinition Definition { get; private set; }

public void Initialize(PackageDefinition definition, float speed)
{
Definition = definition;
fallSpeed = speed * definition.SpeedMultiplier;
spriteRenderer.sprite = definition.Sprite;
spriteRenderer.color = definition.Color;
}

private void Update()
{
transform.Translate(Vector3.down * (fallSpeed * Time.deltaTime), Space.World);
}
}
}

C# · 파일 경로: Assets/_Project/Scripts/Gameplay/PackageSpawner.cs

PackageSpawner.cs
using System.Collections;
using DeliverySorter.Data;
using UnityEngine;

namespace DeliverySorter.Gameplay
{
public sealed class PackageSpawner : MonoBehaviour
{
[SerializeField] private PackageActor prefab;
[SerializeField] private Transform spawnPoint;
[SerializeField] private PackageDefinition[] definitions;
[SerializeField, Min(0.1f)] private float interval = 1.5f;
[SerializeField, Min(0.1f)] private float fallSpeed = 2f;
private Coroutine routine;

public void Begin()
{
if (routine == null) routine = StartCoroutine(SpawnLoop());
}

public void Stop()
{
if (routine == null) return;
StopCoroutine(routine);
routine = null;
}

private IEnumerator SpawnLoop()
{
while (true)
{
PackageDefinition definition = definitions[Random.Range(0, definitions.Length)];
PackageActor package = Instantiate(prefab, spawnPoint.position, Quaternion.identity);
package.Initialize(definition, fallSpeed);
yield return new WaitForSeconds(interval);
}
}
}
}

Unity Editor·Inspector 작업: Package.prefab에 SpriteRenderer, Collider2D와 PackageActor를 연결합니다. PackageSpawner GameObject에 Prefab, SpawnPoint, 두 정의 에셋을 할당합니다.

테스트 작업: Play Mode에서 Begin을 임시 Start 버튼에 연결해 두 종류가 생성되고 이동하는지 확인합니다. 배열이 비면 실행하지 않도록 다음 단계 전에 Awake 검증을 추가합니다.

5. 코드가 동작하는 이유​

Spawner Coroutine은 생성과 대기만 반복하고 PackageActor의 Update는 실제 연속 이동만 담당합니다. Time.deltaTime이 프레임 시간 차이를 보정합니다. 점수와 UI는 어느 클래스도 알지 않습니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

택배 생성 시스템: 생성 위치·주기·종류를 책임에 맞게 분리하기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“택배 생성 시스템: 생성 위치·주기·종류를 책임에 맞게 분리하기”의 역할과 의존성을 판단하는 올바른 기준은 무엇인가요?
  2. 문제 2“택배 생성 시스템: 생성 위치·주기·종류를 책임에 맞게 분리하기” 실습 중 ‘definitions 빈 배열’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

7강. 택배 생성 시스템: 생성 위치·주기·종류를 책임에 맞게 분리하기 미완료 상태