Complex character switching

In my game (A platformer), I need to be able to switch characters while playing. Right now, I am using the answer described here: http://answers.unity3d.com/questions/1124/how-to-change-my-character-during-the-game

All the characters (C1, C2, C3, and C4) are children of a gameobject called Player, which has the Lerpz tutorial character controller attached. When I hit Left Shift, the player changes from a cube to a sphere and keeps on moving along without a problem (The basic shapes are placeholders until I finish the models for the final ones). However, it's not going to be that simple in my game. There will be many more then four characters, some being custom characters defined by the user. Also, each character will have a different ability - a ninja can walljump, while somebody with a jetpack can glide, and a secret agent can use some sort of laser gun. Also, each character will be composed of about 12 meshes, so it won't be as simple as hiding a single mesh and revealing another when the player hits left shift. I'm new to scripting - could somebody give me an idea on how to do this, or a modification to the code I already have? Thank you!

have you tryed creating an empty game object, then adding the prefabs of each character to it, then just enabling each prefab in it? a FPS tutorial uses this, heres and example:

function Start () {
    // Select the first weapon
    SelectWeapon(0);
}

function Update () {
    // Did the user press fire?
    if (Input.GetButton ("Fire1"))
        BroadcastMessage("Fire");

    if (Input.GetKeyDown("1")) {
        SelectWeapon(0);
    }   
    else if (Input.GetKeyDown("2")) {
        SelectWeapon(1);
    }   
}

function SelectWeapon (index : int) {
    for (var i=0;i<transform.childCount;i++)    {
        // Activate the selected weapon
        if (i == index)
            transform.GetChild(i).gameObject.SetActiveRecursively(true);
        // Deactivate all other weapons
        else
            transform.GetChild(i).gameObject.SetActiveRecursively(false);
    }
}