void Initialize()
    {
        // Prevents duplicate GameManagers, but allows for easier testing
        if (Instance != FindObjectOfType<GameManager>())
        {
            gameObject.SetActive(false);
            return;
        }

        // Don't destroy this; other GameManagers in other scenes should be disabled before build and for testing should use GameStateInit
        DontDestroyOnLoad(this);

        // Create new inventory
        if (m_inventory == null)
        {
            m_inventory = new Inventory(slots);
        }

        ///////////////////////

        // Create new CharacterManager
        if (m_characters == null)
        {
            // No auto; let game states search by their own
            m_characters = new CharacterManager(false);
        }

        ///////////////////////

        // Create new CameraController
        if (m_camera == null)
        {
            // Add targets after scene load
            m_camera = new CameraController(/*Human.Link.gameObject, Dog.Link.gameObject*/);

            // Add states, but change on GameStatePlay
            m_camera.AddState(new CameraStateFollow(movementSmooth, rotationSmooth, minY, maxY));
            //Camera.ChangeState("CameraStateFollow");
        }

        ///////////////////////

        // Create a new UI Manager
        if (m_ui == null)
        {
            //BUG: this seems to be null'd after first scene load?
            m_ui = new UIManager(false);
        }

        ///////////////////////

        // Create new GameStateMachine
        if (GameState == null)
        {
            GameState = new GameStateMachine();

            // Add some states
            GameState.AddStatesRange(new GameStatePlay(), new GameStateStart(), new GameStateEnd(), new GameStateLoad(), new GameStateInit());
            GameState.ChangeState(startState); // Set starting statea
            GameState.UpdateState(); // Update to that state immidiately

        }

        ///////////////////////

        // Refresh GameManager once after all systems are initialized
        Refresh();
    }