0. 들어가기 전에
이번엔 야생 난이도에 따라 생성되는 맵이 달라지도록 만들었다. 맵을 easy, normal, hard 버전으로 만든다음 야생 난이도에 맞는 맵만 생성하도록 했다.
normal 과 hard 버전 맵은 코드가 잘 작동하는지 확인하기 이해 임시로 만들어서 1개씩밖에 없다.
그리고 야생 난이도에 맞게 배경을 활성화하도록 했다. 일단 하이어라키 창 속 세 개의 배경 게임 오브젝트 활성화를 모두 꺼놓아야 한다.
1. 게임 오브젝트
하이어라키 창에 새로 생성한 게임 오브젝트는 없고 기존의 MapSpawner 게임 오브젝트를 수정했다. 그리고 세 개의 배경 게임 오브젝트 활성화를 꺼놓았다.

1.1 MapSpawner
1. 인스펙터 창
맵스포너의 인스펙터 모습은 다음과 같다.
EasyMapPrefabs, NormalMapPrefabs, HardMapPrefabs 와 같이 세 가지로 나뉘어져 있는데 야생 단계에 맞는 맵을 호출하기 위함이다.
MapPrefabs 에는 야생 난이도에 맞는 맵 프리팹을 할당하기 위해 사용한다. 예를 들어 현재 야생의 난이도가 쉬움이라고 했을 때 코드 상에서 MapPrefabs 에 EasyMapPrefabs 를 할당해주면 되는 것이다.
그리고 Background 변수가 쉬움, 보통, 어려움 단계로 나뉘어져 있는데 각각 쉬움, 보통, 어려움 배경 게임 오브젝트를 할당해주면 된다.
현재 인스펙터 창에서 보이는 MapLevel 변수의 값은 신경쓰지 않아도 된다. 나중에 데이터 불러와서 알아서 값이 들어가도록 할 것이고 지금은 확인을 위해 임의로 값을 변경해놓은 상태이다.

2. 스크립트
이번에 새로 만든 스크립트는 없고 MapSpawner 를 수정했다.
2.1 MapSpawner 스크립트
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Unity.VisualScripting;
using UnityEngine;
public class MapSpawner : MonoBehaviour
{
[Header("Map Contoller")]
public GameObject[] mapPrefabs; // 현재 맵 프리팹
public GameObject[] easyMapPrefabs;
public GameObject[] normalMapPrefabs;
public GameObject[] hardMapPrefabs;
public List<GameObject>[] pool;
public GameObject easyBackground; // 쉬움 단계 배경
public GameObject normalBackground; // 보통 단계 배경
public GameObject hardBackground; // 어려움 단계 배경
public float curTime = 0;
public float targetTime = 0.5f; // targetTime 마다 맵 생성
public int mapCount;
public int mapLevel; // 0: 쉬움, 1: 보통, 2: 어려움
private Coroutine mapCoroutine;
private void Awake()
{
// 맵 난이도에 맞게 mapCount 설정..
if (mapLevel == 0)
{
easyBackground.SetActive(true); // 배경 활성화
mapPrefabs = easyMapPrefabs; // 현재 팹 프리팹을 이지맵으로 설정
}
else if (mapLevel == 1)
{
normalBackground.SetActive(true); // 배경 활성화
mapPrefabs = normalMapPrefabs; // 현재 팹 프리팹을 노멀맵으로 설정
}
else if (mapLevel == 2)
{
hardBackground.SetActive(true); // 배경 활성화
mapPrefabs = hardMapPrefabs; // 현재 팹 프리팹을 하드맵으로 설정
}
mapCount = mapPrefabs.Length; // 크기 설정
pool = new List<GameObject>[mapCount]; // 배열 만들기
for (int i=0; i<mapCount; i++)
{
pool[i] = new List<GameObject>(); // 리스트 새로 만들기
}
}
private void Start()
{
mapCoroutine = StartCoroutine(SpawnMap()); // 맵 생성 코루틴 시작
}
private IEnumerator SpawnMap()
{
while (true)
{
int mapIdx = Random.Range(0, mapCount);
GameObject select = null;
foreach (GameObject map in pool[mapIdx])
{
// 만약 놀고 있는 맵 게임 오브젝트를 발견하면 그거 활성화
if (map.activeSelf == false)
{
select = map;
map.SetActive(true); // 맵 활성화
break;
}
}
// 발견 못 하면 새로 생성
if (select == null)
{
select = Instantiate(mapPrefabs[mapIdx], transform);
pool[mapIdx].Add(select); // 새로 생성한 게임 오브젝트를 풀에 넣기
}
yield return new WaitForSeconds(targetTime); // targetTime 만큼 기다리기
}
}
}
2.2 MapSpawner 스크립트 변경 사항 설명
1. 변수
새로 추가한 변수는 다음과 같다. 각각 쉬움, 보통, 어려움 단계의 맵 프리팹을 저장하기 위한 변수이고, mapLevel 은 야생 난이도를 나타내기 위한 변수이다.
그리고 세 개의 배경 게임 오브젝트를 할당할 변수를 새로 만들었다.
public GameObject[] easyMapPrefabs;
public GameObject[] normalMapPrefabs;
public GameObject[] hardMapPrefabs;
public GameObject easyBackground; // 쉬움 단계 배경
public GameObject normalBackground; // 보통 단계 배경
public GameObject hardBackground; // 어려움 단계 배경
public int mapLevel; // 0: 쉬움, 1: 보통, 2: 어려움
2. Awake()
맵 난이도에 mapCount 를 설정한 후, 이를 토대로 pool 배열의 크기를 설정했다.
mapPrefabs 에 맵 프리팹 변수를 할당하는 이유는 코드에서 맵을 새로 생성할 때 if 문에서 쉬움 단계에 진입했을 때 easyMapPrefab[i], 노멀 단계에 진입했을 때 normalMapPrefabs[i] 이런식으로 하는 것을 피하기 위함이다.
그냥 mapPrefabs 에 할당해놓으면 그냥 맵을 새로 생성할 때 mapPrefabs[i] 이런식으로 가져오면 된다.
그리고 각 조건문에 맞는 배경을 활성화해줬다.
private void Awake()
{
// 맵 난이도에 맞게 mapCount 설정..
if (mapLevel == 0)
{
easyBackground.SetActive(true); // 배경 활성화
mapPrefabs = easyMapPrefabs; // 현재 팹 프리팹을 이지맵으로 설정
}
else if (mapLevel == 1)
{
normalBackground.SetActive(true); // 배경 활성화
mapPrefabs = normalMapPrefabs; // 현재 팹 프리팹을 노멀맵으로 설정
}
else if (mapLevel == 2)
{
hardBackground.SetActive(true); // 배경 활성화
mapPrefabs = hardMapPrefabs; // 현재 팹 프리팹을 하드맵으로 설정
}
mapCount = mapPrefabs.Length; // 크기 설정
pool = new List<GameObject>[mapCount]; // 배열 만들기
for (int i=0; i<mapCount; i++)
{
pool[i] = new List<GameObject>(); // 리스트 새로 만들기
}
}
3. 결과물
야생 난이도에 맞게 맵이 생성되는 것과 배경이 설정되는 모습을 확인할 수 있다.
앞전에 말했듯이 normal, hard 단계 맵은 임시로 하나씩 만들어 놓았기 때문에 똑같은 맵이 반복되는 것을 확인할 수 있다(압정은 이전에 만든 스크립트 때문에 활성화 됐다가 비활성화 됐다가 반복..)