void setStates()
    {
        if (inputKeeper != null && canChangeState)
        {
            if (inputKeeper.isButtonPressed("Mira") && player.GetComponent <PlayerMovements> ().onGround&& usable)
            {
                actualState = lanternState.InHand;
            }

            if (inputKeeper.isButtonPressed("Mira") && !player.GetComponent <PlayerMovements> ().onGround)
            {
                actualState = lanternState.NotUsed;
            }

            if (inputKeeper.isButtonUp("PickLantern") && (actualState == lanternState.Left || actualState == lanternState.TurnedOff))
            {
                actualState = lanternState.NotUsed;
            }

            //questo controllo va prima di quando si setta a Left o TurnedOff, per evitare che nel setStates venga prima messo a Left e, subito dopo, a Falling,
            //così da perdere ciò che si fa nell'update del Left
            if (canFall)
            {
                if (actualState == lanternState.TurnedOff || actualState == lanternState.Left)
                {
                    if (!graphicLantern.groundCheck() && graphicLantern.LanternOnPlayerPosition)
                    {
                        actualState = lanternState.Falling;
                    }
                }
            }

            //questo controllo va prima di quando si setta a Left, per evitare che nel setStates venga prima messo a Left e, subito dopo, a TurnedOff,
            //così da perdere ciò che si fa nell'update del Left
            if (actualState == lanternState.Left && touchedByEnemy)
            {
                actualState = lanternState.TurnedOff;
            }

            /*
             * if (actualState == lanternState.InHand && inputKeeper.isButtonUp("Mira") && collidingBadWall) {
             *      actualState = lanternState.NotUsed;
             * }
             */

            if (actualState == lanternState.InHand && inputKeeper.isButtonUp("Mira"))
            {
                actualState = lanternState.Left;
            }

            if (actualState == lanternState.Left && collidingBadWall)
            {
                actualState      = lanternState.NotUsed;
                collidingBadWall = false;
            }
        }
    }
    //--------------------UPDATE---------------------------

    //qui va inserita la logica del tool, usata nell'update...
    protected override void useTool()
    {
        if (inputKeeper != null && inputKeeper.isButtonUp("GlassModifier") && glassesManager.isGlassModifiable())
        {
            glassesManager.callGlassModifier();
        }

        if (actualState != lanternState.Left)
        {
            if (!glassesManager.getActualGlass().rotateWithLantern)
            {
                graphicLantern.resetCircleAngle();
            }

            if (!glassesManager.getActualGlass().canBeModified)
            {
                graphicLantern.resetTempProjectionAngle();
            }
        }



        //DEBUG
        if (Input.GetKeyUp(KeyCode.G))
        {
            enemyTouchLantern(true);
        }

        setStates();

        if (actualState == lanternState.InHand)
        {
            //AZIONI DA FARE APPENA PRESA IN MANO
            if (previousState != actualState)
            {
                deleteInstantiatedPrefab();

                if (previousState != lanternState.NotUsed)
                {
                    callParticles();
                }

                graphicLantern.setSuperSortingLayer();
                graphicLantern.switchOnLantern();
                graphicLantern.switchSupport(false);
                graphicLantern.takeLantern();

                if (!collidingBadWall)
                {
                    graphicLantern.setLeftLanternRaySrites(false);
                }
                else
                {
                    graphicLantern.setBadRaySprites(true);
                }

                deleteInstantiatedPrefab();

                audioHandler.playClipByName("Accensione");
                audioHandler.playClipByName("Mira");
                //returnParticles.activeParticles(graphicLantern.getLanternPosition());
            }

            if (!collidingBadWall)
            {
                graphicLantern.setLeftLanternRaySrites(false);
            }
            else
            {
                graphicLantern.setBadRaySprites(true);
            }

            //AZIONI CHE VENGONO FATTE SEMPRE CON LA LANTERNA IN MANO
            //importante aggiornare le sprites solo se la lanterna è in mano, per ora non cambia niente, ma secondo me è meglio farlo così, poi vediamo
            if (glassesManager.isThereAUsableGlass())
            {
                graphicLantern.glassSpriteUpdate();
            }

            graphicLantern.normalMovementsUnderMouse();
            graphicLantern.setNormalFakeProjectionSprite();

            //if (glassesManager.getActualGlass().rotateWithLantern)
            //	graphicLantern.rotateCircle();

            touchedByEnemy = false;
        }

        if (actualState == lanternState.NotUsed)
        {
            //AZIONI DA FARE APPENA LA LANTERNA SCOMPARE (NOT ON GROUND oppure TASTO SINISTRO)
            if (previousState != actualState)
            {
                audioHandler.playClipByName("Spegnimento");
                if (previousState != lanternState.InHand)
                {
                    callParticles();
                }

                graphicLantern.switchOffLantern();
            }
        }

        if (actualState == lanternState.Left)
        {
            //AZIONI DA FARE APPENA LA LANTERNA E' LASCIATA A TERRA
            if (previousState != actualState)
            {
                graphicLantern.switchSupport();
                graphicLantern.leaveLantern();
                graphicLantern.changeAlphaFakeProjectionSprite(0.0f);

                graphicLantern.setLeftLanternRaySrites();

                instantiatePrefab();

                graphicLantern.putLanternOnPlayer();

                audioHandler.playClipByName("ApparizioneProiezione");
            }
        }

        if (actualState == lanternState.TurnedOff)
        {
            //AZIONI DA FARE APPENA LA LANTERNA VIENE TOCCATA DA UN NEMICO
            if (previousState != actualState)
            {
                graphicLantern.switchOffRay();
                enemyTouchLantern(false);

                audioHandler.playClipByName("Spegnimento");
            }
        }

        if (actualState == lanternState.Falling)
        {
            if (previousState != actualState)
            {
                graphicLantern.switchOffRay();
                graphicLantern.addRigidbody();

                turnedOffTime = Time.time;

                if (previousState != lanternState.TurnedOff)
                {
                    audioHandler.playClipByName("Spegnimento");
                }
                //audioHandler.playClipByName("FallingLantern");
            }

            //dopo un po' che la lanterna sta cadendo, mi torna in mano, come NotUsed
            if (Mathf.Abs(Time.time - turnedOffTime) > timeReturnFalling)
            {
                callParticles();
                actualState = lanternState.NotUsed;
            }
        }

        if (actualState != lanternState.Falling)
        {
            if (previousState != actualState)
            {
                graphicLantern.removeRigidbody();
            }
        }

        if (actualState != lanternState.InHand)
        {
            if (previousState == lanternState.InHand)
            {
                graphicLantern.setSuperSortingLayer(false);
                audioHandler.stopClipByName("Mira");
            }
        }

        if (actualState != lanternState.Left)
        {
            if (previousState == lanternState.Left && lastInstatiatePosition != null)
            {
                graphicLantern.instantiateClouds(lastInstatiatePosition);
            }
        }

        //aggiorno il previousState con quello attuale, al prossimo frame servirà per i controlli
        previousState = actualState;

        updateLeftLantern();

        handleCanChangeState();
    }