GameObject SpawnBot(
        SpawnPointRuntimeSet spawns,
        NamedPrefab namedPrefab,
        Vector3 lookAt,
        bool player
        )
    {
        var spawnPoint = spawns.PickRandom();
        var rotation   = Quaternion.LookRotation(lookAt - spawnPoint.transform.position);
        var botGo      = Object.Instantiate(namedPrefab.prefab, spawnPoint.transform.position + namedPrefab.offset, rotation);

        botGo.name = namedPrefab.name;
        var health = botGo.GetComponent <BotHealth>();

        if (health != null)
        {
            health.onDeath.AddListener(OnBotDeath);
        }

        // add new bot to list of active bots
        activeBots.Add(botGo.GetComponent <BotBuilder>());

        // add AI script, disable controls
        BotBrain brain;

        if (player)
        {
            brain = botGo.AddComponent <HumanController>();
            gameEventChannel.Raise(GameRecord.GamePlayerDeclared(botGo));
        }
        else
        {
            brain = botGo.AddComponent <AIController>();
            gameEventChannel.Raise(GameRecord.GameEnemyDeclared(botGo));
            ((AIController)brain).AssignConfig(defaultAIConfig);
            ((AIController)brain).TargetPlayer();
        }
        aiControllers.Add(brain);
        brain.DisableControls();

        // change color of bot
        var materialDistributor = botGo.GetComponent <MaterialDistributor>();

        if (materialDistributor != null)
        {
            materialDistributor.SetMaterials((player) ? MaterialTag.Player : MaterialTag.Enemy);
        }

        return(botGo);
    }
    GameObject SpawnHazard(
        SpawnPointRuntimeSet spawns,
        NamedPrefab namedPrefab
        )
    {
        var spawnPoint = spawns.PickRandom();

        if (namedPrefab.prefab != null)
        {
            var hazardGo = Object.Instantiate(namedPrefab.prefab, spawnPoint.transform.position + namedPrefab.offset, Quaternion.identity);
            hazardGo.name = namedPrefab.name;
            var brain = hazardGo.GetComponent <BotBrain>();
            if (brain != null)
            {
                brain.DisableControls();
                aiControllers.Add(brain);
            }
            return(hazardGo);
        }
        else
        {
            return(null);
        }
    }