public void Init(PlayerController pl)
    {
        player          = pl;
        blinkController = player.GetComponent <BlinkController>();

        animator = player.GetComponent <Animator>();

        hexagons = new List <HexagonController>();

        specialAttackDetector = player.specialDetector;
        specialAttackDetector.GetComponent <PlayerSpecialAttackDetector>().Blackboard = this;
        specialAttackDetector.GetComponent <SphereCollider>().radius = player.specialAttackAffectationRadius;

        dashPSRotator = player.transform.Find("ParticleSystems/DashPSRotation");

        if (InputManager.Devices.Count >= player.Id)
        {
            controller = InputManager.Devices[player.Id - 1];
        }

        spawningState        = new PlayerSpawningState();
        idleState            = new PlayerIdleState();
        longIdleState        = new PlayerLongIdleState();
        movingState          = new PlayerMovingState();
        dashingState         = new PlayerDashingState();
        speedBumpState       = new PlayerSpeedBumpState();
        specialState         = new PlayerSpecialState();
        receivingDamageState = new PlayerReceivingDamageState();
        pushedState          = new PlayerPushedState();
        fallingState         = new PlayerFallingState();
        dyingState           = new PlayerDyingState();
        blockedState         = new PlayerBlockedState();
        invisibleState       = new PlayerInvisibleState();
        levelClearedState    = new PlayerLevelClearedState();

        spawningState.Init(this);
        idleState.Init(this);
        longIdleState.Init(this);
        movingState.Init(this);
        dashingState.Init(this);
        speedBumpState.Init(this);
        specialState.Init(this);
        receivingDamageState.Init(this);
        pushedState.Init(this);
        fallingState.Init(this);
        dyingState.Init(this);
        blockedState.Init(this);
        invisibleState.Init(this);
        levelClearedState.Init(this);

        string playerStr = "";

        switch (player.Id)
        {
        case 1: playerStr = "P1"; break;

        case 2: playerStr = "P2"; break;
        }

        moveHorizontal = playerStr + "_Horizontal";
        moveVertical   = playerStr + "_Vertical";
        aimHorizontal  = playerStr + "_AimHorizontal";
        aimVertical    = playerStr + "_AimVertical";
        fire           = playerStr + "_Fire";
        dash           = playerStr + "_Dash";
        special        = playerStr + "_Special";
        greenButton    = playerStr + "_Green";
        redButton      = playerStr + "_Red";
        blueButton     = playerStr + "_Blue";
        yellowButton   = playerStr + "_Yellow";

        playerRayCastMask  = LayerMask.GetMask(playerStr + "RayCast");
        playerPhysicsLayer = LayerMask.NameToLayer("Player");
        enemyPhysicsPlayer = LayerMask.NameToLayer("Enemy");

        ResetLifeVariables();
    }
    //Unity methods
    void Awake()
    {
        Debug.Log("Player " + playerId + " created.");
        rend = GetComponentInChildren<Renderer>();
        ctrl = GetComponent<CharacterController>();
        voxelization = GetComponent<VoxelizationClient>();

        spawningState = new PlayerSpawningState();
        idleState = new PlayerIdleState();
        longIdleState = new PlayerLongIdleState();
        movingState = new PlayerMovingState();
        dashingState = new PlayerDashingState();
        specialState = new PlayerSpecialState();
        swingingState = new PlayerSwingingState();
        receivingDamageState = new PlayerReceivingDamageState();
        fallingState = new PlayerFallingState();
        dyingState = new PlayerDyingState();

        spawningState.Init(this);
        idleState.Init(this);
        longIdleState.Init(this);
        movingState.Init(this);
        dashingState.Init(this);
        specialState.Init(this);
        swingingState.Init(this);
        receivingDamageState.Init(this);
        fallingState.Init(this);
        dyingState.Init(this);

        currentState = spawningState;

        string player = "";
        switch (playerId)
        {
            case 1: player = "P1"; break;
            case 2: player = "P2"; break;
        }

        moveHorizontal = player + "_Horizontal";
        moveVertical = player + "_Vertical";
        aimHorizontal = player + "_AimHorizontal";
        aimVertical = player + "_AimVertical";
        fire = player + "_Fire";
        dash = player + "_Dash";
        special = player + "_Special";

        playerRayCastMask = LayerMask.GetMask(player + "RayCast");
        animator = GetComponent<Animator>();
    }