Switching between first-person Character Controllers

I have a scene with multiple Character Controllers, all first-person. They are all based on the same Character Controller, but each one hase different children with different scripts attached. (One carries a flashlight and has a HUD, another cannot move, etc). I need to:

  1. Activate the correct Character Controller at the start of the scene (and deactivate the rest).
  2. At triggered moments, swap to another Character Controller.

There are many similar questions here in unityAnswers, but I am having a hard time coming up with a solution that caters to this specific circumstance. One idea seems to be:

Find all scripts attached to Character Controllers + all children and disable all. Disable cameras. Then, enable all scripts on the desired character controller plus its camera.

However, I do no know how to find all scripts in all children, so I haven’t been able to test this yet.

Thank you.

Just disabling the scripts may not be enough: a disabled script still can process events like OnTriggerEnter, OnCollisionEnter etc. A better and simpler alternative would be to deactivate all game objects except the one currently selected - for instance:

public int curPlayer = 0;
public GameObject[] playerControllerList;

void Start () {
    for( int i = 0; i < playerControllerList.Length; i++ ){
        // activate only curPlayer, and deactivate the others:
        playerControllerList*.SetActive(i == curPlayer);*

}
}
EDITED:
The alternative above is ideal for cases where only a single player may exist at any time. If the other players must stay alive but simply don’t answer to commands, maybe the script disabling approach is better. A reasonably way to do that is to keep in each player an enabling script: this script gets at Start an array of all scripts attached to the player instance (including itself), and enable/disable them with a dedicated function. You should then have an empty object with the players list and the selection function, which should call the enabling function in all players when selecting one of them.
The enabling script:
using UnityEngine;
using System.Collections;

public class EnablePlayer: MonoBehaviour {

MonoBehaviour[] scripts; // list of all scripts in this player

void Start(){ // get the scripts list at Start:
scripts = GetComponentsInChildren();
}
// enabling function:
public void EnableMe(bool onOff){
foreach (MonoBehaviour script in scripts){
script.enabled = onOff;
}
}
}
The control script:
using UnityEngine;
using System.Collections;

public class SelectPlayer: MonoBehaviour {
public EnablePlayer[] playerList; // drag the players here

void SelPlayer(int whichOne) {
for( int i = 0; i < playerList.Length; i++ ){
// activate only whichOne, and deactivate the others:
playerList*.EnableMe(i == whichOne);*
}
}
}
Disabling a script makes Unity stop calling its Update, FixedUpdate and LateUpdate functions - but the script still exists, so you can directly call any function, read/write its variables etc. This is good, but may be bad too: if an enemy is shooting at the player, for instance, it will keep hurting the unlucky guy even after you’ve switched to another player. If you want to avoid this, use the enabled script property to “disable” any function that you don’t want to be executed when the player isn’t selected - for instance:
public void SomeFunctionThatMustAlsoBeDisabled(){
// abort this function when the script is disabled:
if (!enabled) return;

}