[개발일지] 30. 야생 난이도에 따른 맵 생성 & 배경 설정

2025. 1. 27. 17:53·유니티 프로젝트/점토게임

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 단계 맵은 임시로 하나씩 만들어 놓았기 때문에 똑같은 맵이 반복되는 것을 확인할 수 있다(압정은 이전에 만든 스크립트 때문에 활성화 됐다가 비활성화 됐다가 반복..)

 

 

'유니티 프로젝트/점토게임' 카테고리의 다른 글
  • [개발일지] 32. 씬 전환시 데이터 저장&적용
  • [개발일지] 31. 야생 판넬 제작 & 체력바 애니메이션 적용 & 씬 이동
  • [개발일지] 29. 맵 프리팹 수정 & 스크립트 수정
  • [개발일지] 28. 맵 이동 & 생성
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (334) N
      • 컴퓨터네트워크 정리 (5)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 백준 문제 (193) N
        • 이분탐색 (7)
        • 투포인트 (10)
        • 그래프 (7)
        • 그리디 (24)
        • DP (25)
        • BFS (15) N
        • MST (7)
        • KMP (4)
        • Dijkstra (3)
        • Disjoints Set (4)
        • Bellman-Ford (2)
        • 시뮬레이션 (3)
        • 백트래킹 (15)
        • 위상정렬 (5)
        • 자료구조 (25)
        • 기하학 (1)
        • 정렬 (11)
        • 구현 (8)
        • 재귀 (8)
        • 수학 (8)
      • 유니티 공부 (11)
        • 레트로의 유니티 게임 프로그래밍 에센스 (11)
        • 유니티 스터디 자료 (0)
        • C# 공부 (0)
      • 유니티 프로젝트 (48)
        • 케이크게임 (13)
        • 점토게임 (35)
      • 언리얼 공부 (10)
        • 이득우의 언리얼 프로그래밍 (10)
      • 진로 (1)
      • 논문 읽기 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    BFS
    이득우
    오블완
    우선순위큐
    투포인터
    해시
    레트로의 유니티 프로그래밍
    백트래킹
    유니티 공부 정리
    스택
    유니티 프로젝트
    정렬
    골드메탈
    티스토리챌린지
    자료구조
    시뮬레이션
    재귀
    이분탐색
    수학
    C#
    맵
    그래프
    큐
    언리얼
    이벤트 트리거
    dp
    유니티
    바킹독
    그리디
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[개발일지] 30. 야생 난이도에 따른 맵 생성 & 배경 설정
상단으로

티스토리툴바