[TIL] 28일차 - Unity 2D 프로젝트 끝!

김유원·2024년 1월 31일
0

📝 24.01.31

Unity 2D 프로젝트를 끝냈다. 입문 주차의 과제 치고 꽤나 큰 볼륨의 프로젝트였다.

🔗 깃허브 링크 : https://github.com/purangi/RogueDodge

팀 프로젝트 이름을 늦게 지어서 Repository의 이름은 RogueDodge지만, 프로젝트 이름은 TimeKeeper이다.

고전 게임인 닷지를 재해석한 로그라이크 2D 게임이다. 매번 랜덤으로 맵이 생성되고, 그 안에서 몬스터 웨이브가 3회 & 보스 몬스터가 나타난다. 그것을 모두 클리어하면 스테이지가 클리어 되어 새로운 맵으로 이동하게 된다.

이를 위해 내가 구현한 방법은 스테이지를 클리어할 때마다 새로운 스테이지를 Instantiate를 통해 생성하는 방법이다. 상점의 포탈을 타면, 새로운 맵이 랜덤으로 생성되어 해당 맵으로 이동하는 함수를 실행하도록 했다.

MapCreator.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MapCreator : MonoBehaviour
{
    //TODO: Check basic map's size and make new map's location vector
    [SerializeField] List<GameObject> maps;
    int prevMap = 0;
    bool isFirst = true;
    CameraMovement CameraCS;

    public static MapCreator instance;

    private void Awake()
    {
        instance = this;
        CameraCS = Camera.main.GetComponent<CameraMovement>();
    }
    // Start is called before the first frame update
    void Start()
    {
        CreateNewMap();
        CameraCS.LimitCameraArea();
    }

    GameObject CreateNewMap()
    {
        int rand = Random.Range(0, maps.Count);

        if (!isFirst)
        {
            while(true)
            {
                rand = Random.Range(0, maps.Count);
                if (rand != prevMap) break;
            }
        }
        prevMap = rand;
        GameObject newMap = Instantiate(maps[rand]);
        GameManager.Instance.curMap = newMap;
        GameManager.Instance.Teleport(true);
        isFirst = false;

        return newMap;
    }

    public void CreateNextMap()
    {
        int curX = GetMapSize();
        float curPosition = GameManager.Instance.curMap.transform.position.x;
        GameObject newMap = CreateNewMap();
        int newX = GetMapSize();

        newMap.transform.position = new Vector3(curPosition + (curX + newX) / 2 + 5, 0, 0);
        CameraCS.LimitCameraArea();
    }

    int GetMapSize()
    {
        int mapSize = 0;

        switch (prevMap)
        {
            case 0:
                mapSize = 24;
                break;
            case 1:
                mapSize = 32;
                break;
            case 2:
                mapSize = 38;
                break;
        }

        return mapSize;
    }
}

처음에 이 방향을 구상한 이유가 미니맵을 구현할 때 새로운 맵이 생성되면서 미니맵에도 해당 모습이 나타나도록 하게 하기 위해서였는데 그냥 미리 맵들을 생성하고 이동함에 따라 미니맵에 보이도록 하는 방향으로 하는 것이 더 좋았을 것이라 생각한다.

이를 구현한 다른 팀이 있어서 더 아쉽게 느껴졌다. 발표 후에 팀원들도 아쉬움을 느껴 해당 방식의 맵을 구현하는 방법을 팀원분이 유튜브 영상에서 찾아주셨다.

이 방향으로 생성했다면 더 게임적으로 재미있었을 것이라 생각한다.

다음에는 이를 숙지하여 맵을 동적 맵 생성을 구현해봐야겠다.




📕 [프로그래머스] 가장 가까운 글자

profile
개발 공부 블로그

0개의 댓글

관련 채용 정보