public EnemyData[] GetAvailableEnemies(WaveData _waveData) { EnemyDatas i_totalEnemies = enemyDatas; int enemyCount = i_totalEnemies.enemyDatas.Count - _waveData.currentEnemies.Count; if (enemyCount <= 0) { return(new EnemyData[0]); } EnemyData[] i_availableEnemiesList = new EnemyData[enemyCount]; List <EnemyData> i_unavailableEnemiesList = new List <EnemyData>(); foreach (WaveEnemy wep in _waveData.currentEnemies) { i_unavailableEnemiesList.Add(wep.enemyType); } int index = 0; for (int i = 0; i < i_totalEnemies.enemyDatas.Count; i++) { if (IsEnemyAvailable(i_totalEnemies.enemyDatas[i], i_unavailableEnemiesList) && index <= enemyCount) { i_availableEnemiesList[index] = i_totalEnemies.enemyDatas[i]; index++; } } return(i_availableEnemiesList); }
public static List <Enemy> GetListEnemyPrefab(int level_total, int minLevel, int maxLevel) { List <EnemyDatas> listEnable = new List <EnemyDatas>(); int total_Uutien = 0; // Lấy danh sách có thể có Enemy foreach (EnemyDatas le in _EnemyDatas) { if (le.inGroup(MAP_GamePlay.CodeEnemyCurrent) && le.type == TypeEnemy.Normal && le.Level <= maxLevel && le.Level >= minLevel) { listEnable.Add(le); total_Uutien += le.Priority; } } if (listEnable.Count == 0) { Debug.Log("Data không hợp lệ"); return(null); } // Sắp xếp for (int i = 0; i < listEnable.Count - 1; i++) { for (int j = i + 1; j < listEnable.Count; j++) { if (listEnable[j].Priority < listEnable[i].Priority) { EnemyDatas a = listEnable[i]; listEnable[i] = listEnable[j]; listEnable[j] = a; } } } // Tao danh sach Enemy List <Enemy> listEnemy = new List <Enemy>(); int MaxEnemy = 50; do { int a = UnityEngine.Random.Range(1, total_Uutien + 1); EnemyDatas le = GetEnemy(listEnable, a); level_total -= le.Level; if (level_total < 0) { break; } listEnemy.Add(le.GetEnemy); MaxEnemy++; } while (true || MaxEnemy >= 50); return(listEnemy); }
public void InstantiateEnemy(WaveEnemy _enemy) { if (_enemy.spawnIndexes.Count <= 0) { Debug.LogWarning("Can't spawn enemy: no spawn assigned"); return; } int i_chosenSpawnerIndex = Random.Range(0, _enemy.spawnIndexes.Count); i_chosenSpawnerIndex = _enemy.spawnIndexes[i_chosenSpawnerIndex]; GameObject i_spawner = spawnList[i_chosenSpawnerIndex].transform.gameObject; Spawner i_spawnerScript = i_spawner.GetComponent <Spawner>(); if (i_spawnerScript != null && !i_spawnerScript.IsFree()) { return; } //A custom spawner is assigned, it can be used to spawn enemy if (i_spawnerScript != null) { if (!i_spawnerScript.IsFree()) { return; } EnemyBehaviour spawnedEnemy = i_spawnerScript.SpawnEnemy(EnemyDatas.GetEnemyDatas().GetEnemyByID(_enemy.enemyType.name), true); RegisterEnemy(spawnedEnemy); } //No custom spawner found, it'll spawn the enemy instantly on the assigned position else { GameObject i_newEnemy = Instantiate(_enemy.enemyType.prefab).gameObject; EnemyBehaviour i_enemyBehaviour = i_newEnemy.GetComponent <EnemyBehaviour>(); if (i_enemyBehaviour == null) { Destroy(i_newEnemy); Debug.LogWarning("Wave can't instantiate enemy: invalid prefab"); return; } if (i_enemyBehaviour.GetNavMesh() != null) { i_enemyBehaviour.GetNavMesh().enabled = false; } i_newEnemy.transform.position = spawnList[i_chosenSpawnerIndex].transform.position; i_enemyBehaviour.GetNavMesh().enabled = true; RegisterEnemy(i_enemyBehaviour); } UpdateCurrentPowerLevel(); nextEnemyToSpawn = null; }
private void OnEnable() { waveEditor = (WaveController)target; enemyDatas = Resources.Load <EnemyDatas>("EnemyDatas"); availableSpawners = GetAvailableSpawners(); //Generates dictionaries enemyFoldoutIndex = new Dictionary <WaveData, int>(); enemyAvailable = new Dictionary <WaveData, EnemyData[]>(); //Fill dictionaries; foreach (WaveData wave in waveEditor.waveList) { enemyFoldoutIndex.Add(wave, 0); enemyAvailable.Add(wave, new EnemyData[0]); UpdateAvailableEnemies(wave); } }