public void selectNextCharacter()
    {
        //save old character params
        Vector3    playerPosition = playerController1.transform.position;
        Quaternion playerRotation = playerController1.transform.rotation;
        PlayerControllerAdvanced oldController = playerController1;
        Checkpoint lastCheckpoint  = oldController.lastCheckpoint;
        int        characterHP     = oldController.character.hpCurrent;
        int        oldplayerNumber = oldController.playerNumber;

        //load new characters and link to related objects
        GameObject newCharacter         = characterRoster.getNextCharacter();
        GameObject newCharacterInstance = Instantiate(newCharacter, playerPosition, playerRotation);

        playerController1 = newCharacterInstance.GetComponent <PlayerControllerAdvanced>();
        playerController1.character.playerUI  = oldController.character.playerUI;
        playerController1.lastCheckpoint      = lastCheckpoint;
        playerController1.character.hpCurrent = characterHP;
        playerController1.playerNumber        = oldController.playerNumber;
        player1UI.owner = playerController1;
        player1UI.init();
        followCam.target = newCharacterInstance.transform;

        //destroy old character and clean up
        Destroy(oldController.gameObject);
        if (spawnFX != null)
        {
            GameObject fxInstance = Instantiate(spawnFX, playerPosition, playerRotation);
        }
    }