Unity/제로부터 구현
같은 맵 계속 반복 시키기(3D).
휘게31
2023. 12. 1. 20:30
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