ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Rollick 개발 일지] 03. 장애물 무작위로 생성하기
    카테고리 없음 2023. 10. 22. 19:56

    지난 시간엔 주변 건물들이 무작위로 생성되는 기능을 구현하였다.

    주변 건물들은 게임의 전체적인 퀄리티를 올리기 위함이었다.

     

    이번 시간에 구현할 장애물 (자동차들)의 랜덤 배치는 게임의 난의도에 직접적으로 영향을 미치는 중요한 로직이다.

     

    현재 생성되는 도로의 프리팹은 자동차가 있긴 하지만 도로에 고정돼있어 장애물이 등장하는 패턴이 동일하다.

    우선 깔끔하게 도로에 존재하는 모든 장애물(자동차)들을 프리팹으로 빼주었다.

     

    자동차들은 도로의 두 갈레에서만 등장해야 하며 (동일한 Z포지션) 자동차와 자동차 사이의 배차간격은 랜덤으로

    설정돼야 한다.

     

    생각한 로직에 맞춰 작성한 코드이다.

    public class ObstacleInstallFunc : MonoBehaviour
    {
        Dictionary<Transform, List<Transform>> _obstacleData = new Dictionary<Transform, List<Transform>>();
        [SerializeField] private List<Transform> _obstaclesPrefab = new List<Transform>();
        [SerializeField] [Range(12, 52)] private int _minPaddingDistance;
        [SerializeField] [Range(12, 52)] private int _maxPaddingDistance;
    
        [SerializeField]private Vector3[] _saveObstacle = new Vector3[2] { Vector3.zero, Vector3.zero };
    
        private List<Transform> CollocateObstacle(Transform obsTrm)
        {
            _saveObstacle = new Vector3[2] { Vector3.zero, Vector3.zero };
            List<Transform> setObstacleData = new List<Transform>();
    
            for(int i = 0; i < Random.Range(8, 16); i++)
            {
                int idx = Random.Range(0, _obstaclesPrefab.Count);
                Transform obs = Instantiate(_obstaclesPrefab[idx], obsTrm);
    
                idx = Random.Range(_minPaddingDistance, _maxPaddingDistance + 1);
                int set = i % 2 == 0 ? 1 : -1;
    
                obs.rotation = Quaternion.Euler(0, -90 * set, 0);
                Debug.Log(_saveObstacle[i % 2]);
                obs.position += new Vector3(_saveObstacle[i % 2].x += idx, 0, 0);
                //obs.position = _saveObstacle[i % 2];
                obs.position += new Vector3(0, 0, 3 * set);// 홀수 = 오른쪽
                
                setObstacleData.Add(obs);
            }
    
            return setObstacleData;
        }
    
        public void InstallObstacle(Transform parent)
        {
            Transform obsTrm = parent.Find("Obstacle");
            if(!_obstacleData.ContainsKey(obsTrm))
            {
                _obstacleData.Add(obsTrm, CollocateObstacle(obsTrm));
                return;
            }
            foreach(Transform t in _obstacleData[obsTrm])
            {
                Destroy(t.gameObject); // PoolManager로 교체 예정
            }
            _obstacleData[obsTrm] = CollocateObstacle(obsTrm);
        }
    }

    나름 잘 작동한다.

     

    다음 포스팅에서 뵙겠습니다.

Designed by Tistory.