void Start()
 {
     try
     {
         cam       = Camera.main;
         state     = CameraState.zoomedOut_Exterior;
         dm        = gameObject.GetComponent <DispensaryManager>();
         db        = GameObject.Find("Database").GetComponent <Database>();
         uiManager = GameObject.Find("UIManager").GetComponent <UIManager_v5>();
         zoomedOut_ExteriorState = new PreviousCameraState(state, cam.transform.position, cam.transform.eulerAngles, dm.dispensary.gameObject.transform.position);
         zoomedOut_InteriorState = new PreviousCameraState();
         zoomedInState           = new PreviousCameraState();
         preFocusState           = new PreviousCameraState();
     }
     catch (NullReferenceException)
     {
         // Main menu
     }
 }
    public void ChangeState(bool in_, string component)
    {
        if (!camMoving)
        {
            if (in_)
            {
                mouseLockedToCamera = false;
            }
            switch (state) // current camera state, before change
            {
            case CameraState.zoomedOut_Exterior:
                if (in_)
                {
                    zoomedOut_ExteriorState = new PreviousCameraState(state, cam.transform.position, cam.transform.eulerAngles, dm.dispensary.grid.transform.position);
                    state = CameraState.zoomedOut_Interior;
                    dm.actionManager.SetSelectorToComponentsOnly();
                }
                else
                {
                    // create camera animation to move slightly backward then bounce off invisible wall
                    // to symbolize being zoomed out to maximum
                }
                break;

            case CameraState.zoomedOut_Interior:
                if (in_)
                {
                    state = CameraState.zoomedIn;
                    GameObject compGO = dm.dispensary.GetComponentGO(component);

                    // Possible zoom positions
                    List <Vector3> possibleCameraPositions = dm.dispensary.GetPossibleCameraPositions(component);
                    float          dist         = 1000;
                    Vector3        targetCamPos = Vector3.zero;
                    foreach (Vector3 pos in possibleCameraPositions)
                    {
                        float newDist = Vector3.Distance(Camera.main.transform.position, pos);
                        if (newDist < dist)
                        {
                            dist         = newDist;
                            targetCamPos = pos;
                        }
                    }

                    // Previous position
                    zoomedOut_InteriorState = new PreviousCameraState(CameraState.zoomedOut_Interior, cam.transform.position, cam.transform.eulerAngles, dm.dispensary.grid.transform.position);

                    Vector3 toSend_     = new Vector3(targetCamPos.x, targetCamPos.y, targetCamPos.z);
                    Vector3 eulerToSend = Camera.main.transform.eulerAngles;
                    yaw   = Camera.main.transform.eulerAngles.y;
                    pitch = Camera.main.transform.eulerAngles.x;
                    MoveCamera(toSend_, eulerToSend, compGO.transform.position, false, false);
                    dm.actionManager.SetSelectorToAllSelectables();
                }
                else
                {
                    MoveCamera(zoomedOut_ExteriorState.position, zoomedOut_ExteriorState.rotation, zoomedOut_ExteriorState.lookAt, true, false);
                    state = zoomedOut_ExteriorState.state;
                    zoomedOut_ExteriorState = new PreviousCameraState();
                    dm.actionManager.SetSelectorToNothing();
                }
                break;

            case CameraState.zoomedIn:
                if (in_)
                {
                }
                else
                {
                    if (preFocusState.Valid())
                    {
                        MoveCamera(preFocusState.position, preFocusState.rotation, preFocusState.lookAt, true, false);
                        state         = preFocusState.state;
                        preFocusState = new PreviousCameraState();
                        dm.actionManager.SetSelectorToAllSelectables();
                    }
                    else
                    {
                        MoveCamera(zoomedOut_InteriorState.position, zoomedOut_InteriorState.rotation, zoomedOut_InteriorState.lookAt, true, false);
                        state         = zoomedOut_InteriorState.state;
                        preFocusState = new PreviousCameraState();
                        dm.actionManager.SetSelectorToComponentsOnly();
                    }
                }
                break;
            }
        }
    }