K-digital traning/Final Project

Gazzlers 개발일지 - Map생성(5)

내꺼블로그 2023. 11. 28. 18:20

 

먼저 나무 생성을 구현해보았다.

structure를 따로 관리하기 위해 StructureManager.cs를 생성하여 이곳에 구현하였다.

 

 

 

Structure들을 저장해놓은 List들을 Queue로 관리하기 위해 qStructures를 선언하였다.

(Queue로 관리하는 이유는 앞선 코드들처럼 먼저 저장한 structure(시야에서 멀어진)를 제거하고 새로 생성하기 위함이다.)

 

 

 

 

Structure를 설치하는 method이다.

현재 tree 설치만 구현한 상태로, tree가 rail을 따라 일정 간격으로 생성되게끔 구현하였다.

 

 

offset은 position.z 간격(+ position.x 간격)을 xOffset은 LRail 혹은 RRail의 모양에 맞게끔 설치되기 위해 조정되어야 하는 position.x 간격을 의미한다.

switch문에서 rail의 type에 따라 xOffset의 값이 달라지는 이유가 이러한 까닭이다.

 

 

listStructure는 qStructures에 enqueue하여 관리하기 위해 선언된 list로 listStructure 안에는 floor 간격마다 설치되는 Structure들이 저장되어 있다.

 

 

for문은 본격적으로 tree를 설치하는 부분으로 한 floor당 rail 양 옆으로 3개씩, 총 6개의 tree가 설치되도록 구현하였다.

leftTree와 rightTree가 설치될 위치는 앞서 지정해놓은 offset값과 설치된 rail의 위치를 토대로 계산되어진다.

 

 

InstallStructure method는 MapController에서 rail이 설치될 때 호출된다.(rail의 설치는 floor설치와 같이 이루어진다.)

 

 

 

 

 

 

 

설치된 Structure를 제거하는 method이다.

qStructures에서 dequeue된 list내에 있는 GameObject들을 for문으로 순회하면서 StructurePoolManager에게 반환한다.

 

 

 

 

Structure제거 또한 MapController에서 rail이 제거될 때 호출된다. (rail의 제거 또한 floor 제거와 같이 이루어진다.)

 

 

 

 

 

 

StructureManager.cs

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

    public class StructureManager : MonoBehaviour
    {
        private Queue<List<Structure>> qStructures = new Queue<List<Structure>>();

        public void InstallStructure(Rail rail)
        {
            Debug.LogFormat("railposition: {0}", rail.transform.position);
            Debug.LogFormat("<color=red>rail type: {0}</color>", rail.type);
            float xOffset = 0f;
            float offset = 4.8f;
            switch (rail.type)
            {
                case Rail.eType.Left:
                    xOffset = 2f;
                    break;
                case Rail.eType.Right:
                    xOffset = -2f;
                    break;
            }
            List<Structure> listStructure = new List<Structure>();
            qStructures.Enqueue(listStructure);
            for(int i = 0; i < 3; i++)
            {
                GameObject leftTreeGo = StructurePoolManager.Instance.EnableStructure((int)Structure.eType.Tree);
                leftTreeGo.transform.position = rail.gameObject.transform.position + Vector3.left * (offset+1f - i*xOffset) + Vector3.back * offset * (i + 1);
                listStructure.Add(leftTreeGo.GetComponent<Structure>());

                GameObject rightTreeGo = StructurePoolManager.Instance.EnableStructure((int)Structure.eType.Tree);
                rightTreeGo.transform.position = rail.gameObject.transform.position+Vector3.right* (offset+1f + i*xOffset)+Vector3.back*offset * (i + 1);
                listStructure.Add(rightTreeGo.GetComponent <Structure>());
            }
        }

        public void UninstallStructure()
        {
            List<Structure> list = qStructures.Dequeue();
            for(int i=0; i < list.Count; i++)
            {
                StructurePoolManager.Instance.DisableStructure(list[i].gameObject);
            }
        }
    }

 

 

 

 

 

 

 

tree 설치 결과