GameObject TrySpawnPrefab(GameObject prefab, List <BoxCollider> spawnAreas, List <GameObject> prevSpawned) { var obj = Instantiate(prefab); int tries = 50; do { var box = spawnAreas[Random.Range(0, spawnAreas.Count)]; obj.transform.position = BoxPointSelector.GetRandPointWithinBox(box, spawnSpacing); obj.transform.position += Vector3.down * obj.transform.position.y; }while(CheckOverlapping(obj, prevSpawned) && --tries > 0); obj.transform.Rotate(Vector3.up, Random.Range(0.0f, 360.0f)); return(obj); }
protected override void Update() { base.Update(); switch (phase) { case 0: { var diff = player.transform.position - transform.position; diff.y = 0.0f; Move(diff); if (diff.sqrMagnitude < Mathf.Pow(fireballDist, 2)) { StopMoving(); phase = 1; animCtrl.SetBool("spin", true); } } break; case 1: if (fireballDuration.Update(Time.deltaTime)) { phase = 2; // animCtrl.SetBool( "spin",false ); // animCtrl.SetBool( "walk",true ); fireballDuration.Reset(); } else { if (fireballRefire.Update(Time.deltaTime)) { fireballRefire.Reset(); float randY = BoxPointSelector.GetRandPointWithinBox(boxColl).y; var pos = transform.position; pos.y = randY; pos.x += Random.Range(-1.0f, 1.0f); pos.z += Random.Range(-1.0f, 1.0f); // float ang = Random.Range( 0.0f,360.0f ); // var dir = new Vector3( Mathf.Cos( ang ),Mathf.Sin( ang ),0.0f ) * fireballSpeed; var targetPos = player.transform.position + new Vector3( Random.Range(-1.0f, 1.0f) * fireballSpread.x, Random.Range(-1.0f, 1.0f) * fireballSpread.y, Random.Range(-1.0f, 1.0f) * fireballSpread.z); var dir = targetPos - pos; FireProjectile(fireballPrefab, pos, dir.normalized * fireballSpeed); } } break; case 2: if (spawnDuration.Update(Time.deltaTime)) { prevMinion.ActivateSelf(); spawnDuration.Reset(); phase = 3; animCtrl.SetBool("spin", false); animCtrl.SetBool("walk", true); targetSpot = player.transform.position; } else { if (spawnRefire.Update(Time.deltaTime)) { spawnRefire.Reset(); var minion = Instantiate(minionPrefab); minion.transform.position = transform.position + Vector3.up * 1.0f; var jumpDir = new Vector3( Random.Range(-1.0f, 1.0f), 0.0f, Random.Range(-1.0f, 1.0f)) .normalized *minionSpawnHorizontal; jumpDir.y = minionSpawnJump * minionSpawnJump; minion.GetComponent <Rigidbody>().AddForce(jumpDir, ForceMode.Impulse); // Activate last minion when we spawn new one so they dont all follow while flying. prevMinion?.ActivateSelf(); prevMinion = minion.GetComponent <EnemyBase>(); prevMinion.DisableDrops(); } } break; case 3: if (trackingDuration.Update(Time.deltaTime)) { trackingDuration.Reset(); phase = 0; } else { if (trackRetarget.Update(Time.deltaTime)) { trackRetarget.Reset(); targetSpot = player.transform.position; } Move(targetSpot - transform.position); } break; } }
public void PopulateRoom(List <GameObject> decoPrefabs, float decoSpawnChance, List <GameObject> enemyPrefabs, bool spawnChest = false) { if (chestPrefab == null) { chestPrefab = ResLoader.Load("Prefabs/Dungeon/TreasureChest"); } var possibleSpawnAreas = new List <Transform>(); Transform spawnAreas = transform.Find("SpawnAreas"); for (int i = 0; i < spawnAreas.childCount; ++i) { bool canSpawn = false; if (!ignoreWalls) { foreach (int decoWall in decoConns[i]) { foreach (int openWall in doorMap[exitDir][exitChoice]) { if (decoWall == openWall) { canSpawn = true; } } } } if (canSpawn || ignoreWalls) { possibleSpawnAreas.Add(spawnAreas.GetChild(i)); } } // foreach( var area in possibleSpawnAreas ) for (int i = 0; i < possibleSpawnAreas.Count; ++i) { var area = possibleSpawnAreas[i]; var boxes = area.GetComponentsInChildren <BoxCollider>(); var chosenBox = boxes[Random.Range(0, boxes.Length - 1)]; var spawnLoc = BoxPointSelector.GetRandPointWithinBox( chosenBox, 1.6f); GameObject spawnedObj = null; if (Random.Range(0.0f, 1.0f) < decoSpawnChance || (i >= possibleSpawnAreas.Count - 1 && spawnChest)) { if (spawnChest) { spawnedObj = Instantiate(chestPrefab); } else { spawnedObj = Instantiate(decoPrefabs[Random.Range(0, decoPrefabs.Count)]); } spawnLoc.y = area.position.y; } else { spawnedObj = Instantiate(enemyPrefabs[Random.Range(0, enemyPrefabs.Count)]); } spawnedObj.transform.position = spawnLoc; spawnedObj.transform.Rotate(Vector3.up, Random.Range(0.0f, 360.0f)); } int nChildren = spawnAreas.childCount; for (int i = 0; i < nChildren; ++i) { var boxes = spawnAreas.GetChild(i).GetComponentsInChildren <BoxCollider>(); foreach (var box in boxes) { Destroy(box); } } }