10주차 팀 프로젝트 시작, Tilemap, 유닛 배치하기(MapManager)

유승아·2024년 6월 19일

내일배움캠프

목록 보기
59/69

10주차 팀 프로젝트 시작

최종 프로젝트 전, 마지막 팀 프로젝트 시작이다.
이번에는 자유 주제여서 내가 좋아하는 디펜스를 말씀드렸더니 채택되었다!

그렇게 되어서... 만들게 될 게임은 2D 랜덤 운빨 디펜스
최근에 유행했던 스타 유즈맵 '메운디'와 현재 재밌게 하고 있는 '운빨존많겜' 참고하여 구조를 잡았다.

사용할 스크립트를 나열하고 그 안에 있어야 할 기능들, 연관되어 있는 스크립트 등을 정리하고 역할 분담까지 마쳤다. (다이어그램은 아직 미완성이다)

그리고 내가 맡은 부분은 Map!
유닛이 배치될 부분을 Tilemap으로 만들고, 유닛의 배치 위치가 중복되지 않게 하면 된다. 유닛의 이동까지 구현하기!


1. Tilemap

유닛이 배치될 구역

쓰일진 모르겠지만 Collision 만들어주기

벽까지 넣어주면 일단 유닛 구역 생성 완료

몬스터가 다니는 길과 합치기!
이 길은 몬스터를 담당하시는 분께서 만드셔서 나는 유닛의 구역만 만들었다.


2-1. MapManager (배열)

2차원 배열로 고정 좌표에 유닛이 있는지 확인하고
있다면 다음 좌표, 없다면 해당 좌표에 유닛을 생성하는 기능을 작성해 보았다.

MapManager.cs

using UnityEngine;

public class MapManager : MonoBehaviour
{
    private bool[,] isUnitPlaced = new bool[10, 5]; // true = 유닛 있음, false = 유닛 없음
    
    private Vector2Int? FindEmptyArea() // 비어 있는 위치 찾기
    {
        for (int x = -5; x < 6; x++)
        {
            for (int y = 2; y > -3; y--)
            {
                if (!isUnitPlaced[x, y])
                {
                    return new Vector2Int(x, y);
                }
            }
        }
        return null; // 자리가 다 찼을 때
    }

    public void SpawnUnit() // 유닛 뽑을 때 사용하기
    {
        Vector2Int? emptyPosition = FindEmptyArea(); // 빈 자리 찾기 / 빈 자리가 있으면 Vector2Int 반환, 없으면 null 반환
        if (emptyPosition.HasValue) // HasValue가 ture라면 null이 아니니까 빈 자리가 있다는 것
        {
            PlaceUnit(emptyPosition.Value); // 유닛 배치하기
        }
        else
        {
            // 배치할 자리가 없다는 UI 띄우기
            Debug.Log("빈 자리가 없습니다."); 
        }
    }

    private void PlaceUnit(Vector2Int position/*, UnitData unitData*/) // 유닛 생성
    {
        if (!isUnitPlaced[position.x, position.y]) // 빈 자리
        {
            isUnitPlaced[position.x, position.y] = true;

            // Unit 생성하기

            Debug.Log($"unitData.name 유닛을 배치했습니다. 위치 : position");
        }
    }
}

x = -5, y = 2 인 이유는 그것은 맵의 좌표이기 때문!
'이게 왜 주석?'이라고 생각되는 부분은 아직 작성만 했기 때문이다.


2-2. MapManager (리스트)

위의 코드를 들고 튜터님을 찾아갔다.
기능을 설명드리니 이 코드도 괜찮지만 다르게 작성하는 방법도 알려주셨다.

인벤토리와 비슷한 개념으로 유닛이 배치될 곳에 오브젝트를 생성해놓고 리스트로 관리하는 것이다.
아직 작성은 못했지만 이 글을 올린 후에 바로 시도해보는 걸로!

0개의 댓글