본문 바로가기

Unity/제로부터 구현

같은 맵 계속 반복 시키기(3D).

728x90

오늘의 구현.

만들어진 맵들을 돌려가며 반복적으로 생성시키기.

 

1. 변수

  • 플레이어가 이동한 거리에 따라 지나친 맵은 삭제하고, 기존에 맵을 플레이어가 진행하는 방향쪽에 맵을 이어 붙일것 입니다.
  • 필요한 변수는 플레이의 위치와, 반복 시킬 맵 프리팹,  지금은 플레이어가 앞으로만 진행할 것이기 때문에 z축의 증가량 만 확인 할 것 입니다.
  • 생성할 맵의 길이로 플레이어가 어느정도 이동했을때 맵을 생성할지 정할 것 입니다.
  • 진행 방향으로부터 처음 생성할 맵은 3개 이며, 플레이어가 이동할때마다 가장 먼저 생겨난 맵을 삭제하고 가장 먼곳에 맵을 생성 할 것 입니다.
    public Transform player;
    public GameObject[] maps;
    private List<GameObject> activeMaps;
    private float spawnZ = 0.0f;
    private float mapLength; 

    private int amntMapOnScreen = 3;
    int amntMapIdx;

 

 

2. 함수 만들기

  • 맵생성 함수를 만듭니다.
  • 맵을 돌아가면서 생성해줄 것 이기 amntMapIdx가 맵 프리팹의 길이를 넘지않게 해줍니다.
  • 새로운 맵을 해당 오브젝트 자손으로 넣어줍니다.
  • 맵의 위치를 지정해주고 다음 생성위치(spawnZ)에 맵의 길이를 더해줍니다.
  • 활성화 된 맵을 List에 담아 줍니다.
  • 가장 먼저 만들어진 맵을 삭제할 함수를 만들어 줍니다.
private void SpawnMap()
    {
        amntMapIdx %= maps.Length;
        GameObject go;
        go = Instantiate(maps[amntMapIdx]);
        go.transform.SetParent(transform);
        go.transform.position = Vector3.forward * spawnZ;
        spawnZ += mapLength;
        activeMaps.Add(go); 
        amntMapIdx++;
    }

    private void DeleteMap()
    {
        Destroy(activeMaps[0]);
        activeMaps.RemoveAt(0); 
    }

 

완성

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


public class MapManager : MonoBehaviour
{
    public Transform player;
    public GameObject[] maps; 
    private List<GameObject> activeMaps; 
    private float spawnZ = 0.0f; 
    private float mapLength; 

    private int amntMapOnScreen = 3; 
    int amntMapIdx;

    private void Start()
    {
        activeMaps = new List<GameObject>();
        mapLength = 40;
        

        for (int i = 0; i < amntMapOnScreen; i++)
        {
            SpawnMap();
        }
    }

    private void Update()
    {
        if (player.position.z - mapLength/2 > (spawnZ - amntMapOnScreen * mapLength))
        {
            SpawnMap();
            DeleteMap();
        }
    }
    
    private void SpawnMap()
    {
        amntMapIdx %= maps.Length;
        GameObject go;
        go = Instantiate(maps[amntMapIdx]); 
        go.transform.SetParent(transform);
        go.transform.position = Vector3.forward * spawnZ;
        spawnZ += mapLength;
        activeMaps.Add(go); 
        amntMapIdx++;
    }

    private void DeleteMap()
    {
        Destroy(activeMaps[0]); 
        activeMaps.RemoveAt(0); 
    }
}
728x90