void SpawnWalls() { GameObject _obj = null; WallController _wall = null; Vector3 _spawnPoint = Vector3.zero; _obj = pooler.GetGameObject(false); switch (level) { case Level.WALLS_TO_LEFT: _spawnPoint = wallsToLeft.GetPosition(ref wallIndex); if (_spawnPoint == Vector3.zero) { print("BOOM"); level = Level.DEFAULT; wallIndex = 0; SpawnWalls(); return; } break; default: if (spawnCount < 10) { wallIndex = 0; } else if (spawnCount >= 10 && spawnCount < 20) { wallIndex = Random.Range(0, 2); } else if (spawnCount >= 20 && spawnCount < 30) { wallIndex = 1; } else if (spawnCount >= 40 && spawnCount < 50) { wallIndex = Random.Range(0, 3); } else if (spawnCount >= 60 && spawnCount < 70) { wallIndex = Random.Range(1, 3); } else if (spawnCount >= 80 && spawnCount < 90) { wallIndex = 2; } else { wallIndex = Random.Range(0, 3); } break; } if (_obj != null) { _obj.SetActive(true); } else { pooler.PoolGameObject(_obj = Instantiate(lstWall[wallIndex], _spawnPoint, Quaternion.identity)); } if (level == Level.DEFAULT) { _wall = _obj.GetComponent <WallController>(); //prevent blocking here //....... /* * * save recent wall * save recent spawnpoint * create new spawnpoint near recent spawnpoint with the distance of the opening space of the recent wall * */ float _minX = _recentSpawnPointX - _wall.GetXPositionDistance(); float _maxX = _recentSpawnPointX + _wall.GetXPositionDistance(); _minX = _minX < _wall.GetMinXPosition() ? _wall.GetMinXPosition() : _minX; _maxX = _maxX > _wall.GetMaxXPosition() ? _wall.GetMaxXPosition() : _maxX; _spawnPoint = new Vector3(Random.Range(_minX, _maxX), startYpos, Z_POSITION); _recentSpawnPointX = _spawnPoint.x; } //if (spawnCount < 20) _spawnPoint = new Vector3(0, startYpos, Z_POSITION); _obj.transform.position = _spawnPoint; spawnCount++; startYpos += yDistance; }