본문으로 건너뛰기
게임 프로젝트 기초집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강. 택배 생성 시스템: 생성 위치·주기·종류를 책임에 맞게 분리하기 미완료 상태