Unity Spawner Template

In nearly every project I need a Spawner.
Here is a link to a very good tutorial/demo which is a perfect starting point to create a spawner.
https://unity3d.com/de/learn/tutorials/projects/survival-shooter/more-enemies

And here is my latest template sourcecode of a spawner.

Spawner Template

Spawner Template – in Unity Editor (Scene View)

using UnityEngine;
using System.Collections;
using System; //This allows the IComparable Interface

//This is the class you will be storing
//in the different collections. In order to use
//a collection's Sort() method, this class needs to
//implement the IComparable interface.

public class VisualSteps : IComparable<VisualSteps>
{
    public string dummyName;
    public int position;
    public GameObject stepCube;

    private float stepLength = 3; // Will be overwritten, if the OnCreate GameObject has different sizes!
    private float stepHeight = 0.5f; // Will be overwritten, if the OnCreate GameObject has different sizes!

    public VisualSteps(string newDummyName, int newPosition, GameObject newGameObject)
    {
        dummyName = newDummyName;
        position = newPosition;
        stepCube = newGameObject;
        stepLength = newGameObject.transform.localScale.z;
        stepHeight = newGameObject.transform.localScale.y;
        ModifyStepForPosition(position);
    }
    public VisualSteps(string newDummyName, int newPosition)
    {
        dummyName = newDummyName;
        position = newPosition;
        stepCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        ModifyStepForPosition(position);
    }

    private void ModifyStepForPosition(int stepPosition)
    {
        
        stepCube.transform.localScale = new Vector3(50-stepPosition, stepHeight, stepLength);
        stepCube.transform.position = new Vector3(0, -10+(stepPosition* stepHeight), (stepPosition * stepLength));
        ChangeColorOfStep(stepPosition);
    }
    private void ChangeColorOfStep(int stepPosition)
    {
        stepCube.GetComponent<Renderer>().material.color = UnityEngine.Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
    }

    //This method is required by the IComparable
    //interface. 
    //IMPORANT - can be deleted here! Not necessary for the Step Spawner...
    public int CompareTo(VisualSteps other)
    {
        if (other == null)
        {
            return 1;
        }
        //Return the difference in power.
        return position - other.position;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnSteps : MonoBehaviour {
    public AudioClip[] meditationSounds;
    //public GameObject[] optionSteps;
    public GameObject stepPrefab;
    private int currentStep;
    List<VisualSteps> steps = new List<VisualSteps>();

    void Awake()
    {
        if (meditationSounds == null) {
            Debug.Log("Error - no Sounds");
            Debug.Break();
        } else { 
            int i = 0;
            foreach (AudioClip aaa in meditationSounds)
            {
                if (stepPrefab == null) { 
                    steps.Add(new VisualSteps("Step_Primitive_"+i.ToString(), i));
                    
                }
                else
                {
                    steps.Add(new VisualSteps("Step_Prefab_" + i.ToString(), i, (GameObject)Instantiate(stepPrefab)));//, transform.position + new Vector3(spawnPointXPosition(), 1, spawnAwayRadius), Quaternion.identity);));
                }
                //Make spawned Gameobjects Children in Unity Editor of the GameObject this script is attached to
                steps[i].stepCube.transform.parent = this.transform;
                //Add here the Sounds - or Stuff....
                i = i + 1;
            }
        }
    }
}