ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 같은 맵 계속 반복 시키기(3D).
    Unity/제로부터 구현 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
Designed by Tistory.