Unity C# 기초집LESSON 19
랜덤과 난이도 조절
난이도초급
예상 시간45분
선수지식18강 생성 Coroutine
19강. 랜덤과 난이도 조절
1. 이번 강의에서 해결할 문제
완전 랜덤 생성은 같은 택배가 지나치게 연속으로 나와 불공정하게 느껴지고, 시간이 지나도 난이도가 같습니다. 랜덤에 게임 규칙을 더합니다.
2. 학습 목표
3. 핵심 개념
랜덤은 규칙이 없는 것이 아니라 허용 후보 중 하나를 선택하는 도구입니다. 최대 연속 횟수에 도달하면 직전 타입을 후보에서 제외합니다. 난이도 곡선은 최솟값을 두어 생성 간격이 0에 가까워지지 않게 합니다.
4. 단계별 실습
C# · 파일 경로: Assets/DeliverySorter/Scripts/Spawning/PackageTypeSelector.cs
PackageTypeSelector.cs
using UnityEngine;
[System.Serializable]
public sealed class PackageTypeSelector
{
[SerializeField] private PackageTypeData[] types;
[SerializeField, Min(1)] private int maxConsecutive = 3;
private PackageTypeData previous;
private int consecutiveCount;
public PackageTypeData Next()
{
if (types == null || types.Length < 2)
{
Debug.LogError("At least two package types are required.");
return null;
}
PackageTypeData selected;
do
{
selected = types[Random.Range(0, types.Length)];
}
while (selected == previous && consecutiveCount >= maxConsecutive);
consecutiveCount = selected == previous ? consecutiveCount + 1 : 1;
previous = selected;
return selected;
}
}
C# · PackageSpawner에 간격 계산 추가
PackageSpawner.cs
[SerializeField, Min(0.1f)] private float startingInterval = 1.5f;
[SerializeField, Min(0.1f)] private float minimumInterval = 0.45f;
[SerializeField, Min(0f)] private float decreasePerMinute = 0.25f;
private float ElapsedSeconds => Time.time - gameStartedAt;
private float CurrentInterval()
{
float minutes = ElapsedSeconds / 60f;
return Mathf.Max(minimumInterval, startingInterval - decreasePerMinute * minutes);
}
SpawnLoop의 대기값을 CurrentInterval()로 바꾸고 SpawnOne에서 selector.Next 결과를 Configure에 전달합니다.
5. 코드가 동작하는 이유
연속 횟수가 최대에 도달하기 전에는 모든 타입이 후보입니다. 최대 3회에 도달하면 같은 타입을 뽑은 동안 다시 선택하므로 네 번째는 다른 타입이 됩니다. 최소 두 타입을 요구해 무한 반복 가능성을 막습니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
MINI QUIZ
0 / 2랜덤과 난이도 조절 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
19강. 랜덤과 난이도 조절 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.