3D 콘텐츠 제작

좀짓막(좀비 집짓고 막기) [#1] - 맵 구성

송현호 2023. 9. 22. 13:05

좀짓막의 레퍼런스 게임인 벽짓살류 게임의 경우 스타크래프트와 워크래프트의 유즈맵으로 이 둘은 아이소메트릭 타일맵으로 되어 있다. 그래서 아이소메트릭 타일맵을 만들기 위해 괜찮은 외국 유튜브가 많아서 다음 내용들을 참고해서 타일맵을 만들기로 했다.

 


https://www.youtube.com/watch?v=tW744Zgc1YY 

https://www.youtube.com/watch?v=ci1ba7jVLFw 

https://www.youtube.com/watch?v=9WElejje6Sc 

 

는 일단 나중에 보기로 하고 내가 생각한 방식대로 타일맵을 한번 만들어 보았다.

 

먼저 타일 하나를 만든 뒤 프리펩으로 만들고 카메라를 직교로 바꿔서 아이소메트릭 뷰 처럼 보일 수 있게 준비를 해놨다. 그리고 GameManager를 만들어서 Block프리펩을 할당하고 for문을 돌려서 256x256의 타일을 만든다음 배열에 넣어 보았다.

 

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

public class GameManager : MonoBehaviour
{
    [SerializeField]
    private GameObject Block;

    private GameObject[,] tileMap = new GameObject[256, 256];
    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < 256; i++)
        {
            for (int j = 0; j < 256; j++)
            {
                GameObject go = Instantiate(Block);
                go.transform.position = new Vector3(i, j, 0);
                tileMap[i, j] = go;
            }
        }
    }
}

65,536개의 타일을 생성해야하기 때문에 렉이 엄청 걸리지 않을까 싶었지만 그러지 않았다. 하지만 나중에 머티리얼을 입힌다면 문제가 될 수도 있으므로 이 방법을 고수한다면 오브젝트 풀링을 적용해야 할 것 같다.

 

그리고 enum타입을 정의하고 블록을 empty상태로 해주었다.

 

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

public class Tile : MonoBehaviour
{
    public enum eState
    {
        Empty,Fulled
    }

    public int state = 0;
}

 

그 다음엔 카메라를 만들고 플레이어를 임포트 한 뒤 카메라가 플레이어를 바라보도록 만들어주었다. 하는 김에 타일에 적당히 머티리얼도 입혀 주었다. 

 

플레이어가 움직여도 카메라가 따라 간다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEngine.GraphicsBuffer;

public class CameraCtrl : MonoBehaviour
{
    [SerializeField]
    private GameObject target;
    void Update()
    {
        if (target != null)
        {
            var pos = new Vector3(target.transform.position.x + 6.5f, target.transform.position.y + 6, target.transform.position.z - 10);
            this.transform.position = pos;
            this.transform.rotation = Quaternion.Euler(20, -30, 0);
        }
    }

    public void Init(GameObject target)
    {
        this.target = target;
    }
}

 

더 괜찮은 머티리얼이 없나 찾다가 에셋스토어에서 제공하는 무료 에셋을 이용하기로 했다.

카메라 각도도 좀 조정해주고 벽도 추가해주었다. 그리고 타일을 하나하나 만드는 건 너무 메모리 소모가 많기에 플레인을 깔고 bool 2차원 배열을 만들어서 맵을 대신하기로 했다. 플레인 머티리얼의 타일링 값을 조절해서 유니티 1유닛만큼에 1블록이 들어가도록 값을 조정해주었다.

 

https://assetstore.unity.com/packages/3d/environments/historic/walls-and-floors-v-1-144638

 

Walls and floors v.1 | 3D 역사적 건조물 | Unity Asset Store

Elevate your workflow with the Walls and floors v.1 asset from VK GameDev. Find this & other 역사적 건조물 options on the Unity Asset Store.

assetstore.unity.com