EasyCastleUNITY

길건너 친구들 모작 개발일지3 (맵 구성 및 무한 맵 생성) 본문

3D 프로젝트 개발 일지(Crossy Road, 한글명: 길건너 친구들)

길건너 친구들 모작 개발일지3 (맵 구성 및 무한 맵 생성)

EasyCastleT 2023. 9. 26. 18:08

맵은 땅 한줄 씩 만들기로 하였습니다. 

그래서 여러 종류의 땅들을 만들기로 하였습니다. 

플레이어가 땅과 부딫치면, 점수가 올라가도록 하기위해, 땅이 되는 Ground에 콜라이더를 부착합니다. 

그리고 플레이어는 차량에 부딫치면 죽도록 하기 위해, 차량을 세팅해보겠습니다. (차 모델은 전에 산 리소스에서 가져옴)

차량의 종류는 총 6개로, 차 4종류와 트럭 1대, 기차 1대 입니다. 

 

차량들은 한 줄에서 벗어나지 않아야 하기에 크기를 조정해주었습니다. 

모델 크기 조정

그리고 차량이 움직이며 부딫쳐야 하기에, CarMove, TrainMove 2개의 스크립트를 작성하였습니다. 

그런데 문제가 있었습니다. 위에 사진에서 보이는 것처럼, 구매한 리소스에서 가져온 차들의 z축이 위로 향하고 있었습니다. 

그래서 차량을 앞으로 이동시키면 위로 날아가는 모양이 나오게 됩니다. 

해결방법으로 모델과 같은 위치에 빈 오브젝트를 위치시켰습니다. 

그리고 모델을 이 빈 오브젝트의 자식으로 만들고, z축을 차량이 나아가야 되는 방향으로 조정하였습니다.

이러면 모델의 좌표축이 달라도 유니티 내에서, 조정할 수 있습니다. 

이동 스크립트
움직이는 기차와 차

그리고 이런 차들과 기차들을 땅과 함께 프리팹화 하였습니다. 

기차는 이전에 산 리소스에서 가져와 크기를 조정하여 사용했습니다. 

그리고 위와 같은 방법으로, 그냥 평범한 땅과, 나무 장애물이 있는 땅들을 만들었습니다. 

그냥 땅1
그냥 땅2, 거의 차이 없어보이지만, 색 차이 있음
나무 장애물 땅, 나무도 구매한 리소스에서 가져옴
도로

그리고 땅이 가지는 크기를 모두 1로 해두었기에, 전부 1씩 떨어트려 만들도록 스크립트를 만들었습니다. 

MapGenerator

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

public class MapGenerator : MonoBehaviour
{
    [SerializeField] private GameObject[] groundPrefabs;
    [SerializeField] private float elapsedTime = 0.0f;
    [SerializeField] private float intervalTime;
    [SerializeField] private Transform grounds;

    private int posZ = 18;
    public void CreateGround()
    {
        this.elapsedTime += Time.deltaTime;
        if(this.elapsedTime > intervalTime)
        {
            int rnd = Random.Range(0,groundPrefabs.Length);
            GameObject groundGo = Instantiate(groundPrefabs[rnd],grounds);
            this.SetGroundPosition(groundGo);
            this.posZ++;
            this.elapsedTime = 0.0f;
        }
    }

    private void SetGroundPosition(GameObject go)
    {
        if (go.CompareTag("Ground"))
        {
            go.transform.position = new Vector3(0, 0, posZ);
        }
        else if (go.CompareTag("TrainGround"))
        {
            go.transform.position = new Vector3(0, 0, posZ+0.08f);
        }
        else if (go.CompareTag("CarGround"))
        {
            go.transform.position = new Vector3(0, 0, posZ-0.04f);
        }
        else if (go.CompareTag("TreeGround"))
        {
            go.transform.position = new Vector3(0, 0, posZ + 0.15f);
        }
    }
}

위에서 만든 땅들을 프리팹화하여, 이 MapGenerator에 배열로 등록하고 랜덤을 돌려, 복제하도록 했습니다. 

z축 월드 좌표로 18부터 맵이 없기에 이 지점부터 맵이 생성되도록 하였습니다. 

SetGroundPosition 메서드는 플레이어가 죽으면 안되는 지점에서, 죽는 경우가 있어서, 이 점을 보완하기 위해

각각의 땅마다 다른 태그를 할당하여, 그에 맞게 위치를 조정하여 만들도록 하는 메서드입니다.

 

그리고 모든 것을 관장하는 GameMain을 만들었습니다. 

그리고 이 GameMain에 Update에서 땅을 만드는 메서드인 CreateGround에서 호출하여, 1초에 한개씩 만들도록 하였습니다.

1초당 한번씩 땅이 생성되는 모습

이렇게 기본적인 무한 맵 생성 틀을 만들었습니다. 

지금은 생성되는 땅의 종류가 적어, 조금 부자연스럽지만

더 많은 종류의 땅을 만들어 보충할 계획입니다.