Enemy Spawner

From Unify Community Wiki
Revision as of 20:31, 9 October 2011 by CorruptedHeart (Talk | contribs)

Jump to: navigation, search

Author: Corrupted Heart

Contents

Info

This allows you to spawn enemies based on enemy level and so on, best way to see how it works is to try it out on an object.

Set up

In order to use this correct you need a few things set up:

  1. Create a tag: Spawner
  2. Create an empty GameObject
  3. Apply the tag Spawner to it
  4. Create a child GameObject to the spawner one
  5. Add Spawner.cs to the new child Object - (These will be your actual spawn points)
  6. Append the AI part below to your AI script
  7. Add enemy prefabs to the spaces provided or just add one
  8. Select the Enemy level you want, provided there is a prefab for it
  9. Set the style of spawn and time, ect.

Spawner.cs

<csharp>// /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Filename: Spawner.cs // // Author: Garth "Corrupted Heart" de Wet <mydeathofme[at]gmail[dot]com> // Website: www.CorruptedHeart.co.cc // // Copyright (c) 2010 Garth "Corrupted Heart" de Wet // // Permission is hereby granted, free of charge (a donation is welcome at my website), to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

public class Spawner : MonoBehaviour { // Color of the gizmo public Color gizmoColor = Color.red;

//----------------------------------- // All the Enums //----------------------------------- // Spawn types public enum SpawnTypes

   {

Normal, Once, Wave, TimedWave

   }

// The different Enemy levels public enum EnemyLevels

   {

Easy, Medium, Hard, Boss

   }

//--------------------------------- // End of the Enums //---------------------------------

// Enemy level to be spawnedEnemy public EnemyLevels enemyLevel = EnemyLevels.Easy;

//---------------------------------- // Enemy Prefabs //---------------------------------- public GameObject EasyEnemy; public GameObject MediumEnemy; public GameObject HardEnemy; public GameObject BossEnemy; private Dictionary<EnemyLevels, GameObject> Enemies = new Dictionary<EnemyLevels, GameObject>(4); //---------------------------------- // End of Enemy Prefabs //----------------------------------

//---------------------------------- // Enemies and how many have been created and how many are to be created //---------------------------------- public int totalEnemy = 10; private int numEnemy = 0; private int spawnedEnemy = 0; //---------------------------------- // End of Enemy Settings //----------------------------------


// The ID of the spawner private int SpawnID;

//---------------------------------- // Different Spawn states and ways of doing them //---------------------------------- private bool waveSpawn = false; public bool Spawn = true; public SpawnTypes spawnType = SpawnTypes.Normal; // timed wave controls public float waveTimer = 30.0f; private float timeTillWave = 0.0f; //Wave controls public int totalWaves = 5; private int numWaves = 0; //---------------------------------- // End of Different Spawn states and ways of doing them //---------------------------------- void Start() { // sets a random number for the id of the spawner SpawnID = Random.Range(1, 500); Enemies.Add(EnemyLevels.Easy, EasyEnemy); Enemies.Add(EnemyLevels.Boss, BossEnemy); Enemies.Add(EnemyLevels.Medium, MediumEnemy); Enemies.Add(EnemyLevels.Hard, HardEnemy); } // Draws a cube to show where the spawn point is... Useful if you don't have a object that show the spawn point void OnDrawGizmos() { // Sets the color to red Gizmos.color = gizmoColor; //draws a small cube at the location of the gam object that the script is attached to Gizmos.DrawCube(transform.position, new Vector3 (0.5f,0.5f,0.5f)); } void Update () { if(Spawn) { // Spawns enemies everytime one dies if (spawnType == SpawnTypes.Normal) { // checks to see if the number of spawned enemies is less than the max num of enemies if(numEnemy < totalEnemy) { // spawns an enemy spawnEnemy(); } } // Spawns enemies only once else if (spawnType == SpawnTypes.Once) { // checks to see if the overall spawned num of enemies is more or equal to the total to be spawned if(spawnedEnemy >= totalEnemy) { //sets the spawner to false Spawn = false; } else { // spawns an enemy spawnEnemy(); } } //spawns enemies in waves, so once all are dead, spawns more else if (spawnType == SpawnTypes.Wave) { if(numWaves < totalWaves + 1) { if (waveSpawn) { //spawns an enemy spawnEnemy(); } if (numEnemy == 0) { // enables the wave spawner waveSpawn = true; //increase the number of waves numWaves++; } if(numEnemy == totalEnemy) { // disables the wave spawner waveSpawn = false; } } } // Spawns enemies in waves but based on time. else if(spawnType == SpawnTypes.TimedWave) { // checks if the number of waves is bigger than the total waves if(numWaves <= totalWaves) { // Increases the timer to allow the timed waves to work timeTillWave += Time.deltaTime; if (waveSpawn) { //spawns an enemy spawnEnemy(); } // checks if the time is equal to the time required for a new wave if (timeTillWave >= waveTimer) { // enables the wave spawner waveSpawn = true; // sets the time back to zero timeTillWave = 0.0f; // increases the number of waves numWaves++; // A hack to get it to spawn the same number of enemies regardless of how many have been killed numEnemy = 0; } if(numEnemy >= totalEnemy) { // diables the wave spawner waveSpawn = false; } } else { Spawn = false; } } } } // spawns an enemy based on the enemy level that you selected private void spawnEnemy() { GameObject Enemy = (GameObject) Instantiate(Enemies[enemyLevel], gameObject.transform.position, Quaternion.identity); Enemy.SendMessage("setName", SpawnID); // Increase the total number of enemies spawned and the number of spawned enemies numEnemy++; spawnedEnemy++; } // Call this function from the enemy when it "dies" to remove an enemy count public void killEnemy(int sID) { // if the enemy's spawnId is equal to this spawnersID then remove an enemy count if (SpawnID == sID) { numEnemy--; } } //enable the spawner based on spawnerID public void enableSpawner(int sID) { if (SpawnID == sID) { Spawn = true; } } //disable the spawner based on spawnerID public void disableSpawner(int sID) { if(SpawnID == sID) { Spawn = false; } } // returns the Time Till the Next Wave, for a interface, ect. public float TimeTillWave { get { return timeTillWave; } } // Enable the spawner, useful for trigger events because you don't know the spawner's ID. public void enableTrigger() { Spawn = true; } }</csharp>

AI

Add this to your enemy AI, or kill script: <csharp>// /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Filename: AISpawn.cs // // Author: Garth "Corrupted Heart" de Wet <mydeathofme[at]gmail[dot]com> // Website: www.CorruptedHeart.co.cc // // Copyright (c) 2010 Garth "Corrupted Heart" de Wet // // Permission is hereby granted, free of charge (a donation is welcome at my website), to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

using UnityEngine;

public class AISpawn : MonoBehaviour { private GameObject objSpawn; private int SpawnerID; // Used to find the parent spawner object void Start () { objSpawn = (GameObject) GameObject.FindWithTag ("Spawner"); } // Call this when you want to kill the enemy void removeMe () { objSpawn.BroadcastMessage("killEnemy", SpawnerID); Destroy(gameObject); } // this gets called in the beginning when it is created by the spawner script void setName(int sName) { SpawnerID = sName; } }</csharp>

Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox