// Use this for initialization
    void Start()
    {
        spriteRenderer = gameObject.GetComponentInChildren <SpriteRenderer> ();
        shadow         = gameObject.GetComponentInChildren <MeshRenderer>();
        gc             = GameController.Instance;
        rb             = GetComponent <Rigidbody> ();
        maxHealth      = health;
        Reset();
        Hide();

        //STATE MACHINE INITIALISATION
        fsm        = new FSM();
        idle       = new Idle();
        move       = new Move();
        attack     = new Attack();
        moveAttack = new MoveAttack();

        //idle:			moveVec.sqrMagnitude == 0 && shootVec.sqrMagnitude == 0
        //move:			moveVec.sqrMagnitude != 0 && shootVec.sqrMagnitude == 0
        //attack:		moveVec.sqrMagnitude == 0 && shootVec.sqrMagnitude != 0
        //moveattack:	moveVec.sqrMagnitude != 0 && shootVec.sqrMagnitude != 0

        idle.AddTransition(new Transition(move, () => moveVec.sqrMagnitude != 0 && shootVec.sqrMagnitude == 0));
        idle.AddTransition(new Transition(attack, () => moveVec.sqrMagnitude == 0 && shootVec.sqrMagnitude != 0));
        idle.AddTransition(new Transition(moveAttack, () => moveVec.sqrMagnitude != 0 && shootVec.sqrMagnitude != 0));

        move.AddTransition(new Transition(idle, () => moveVec.sqrMagnitude == 0 && shootVec.sqrMagnitude == 0));
        move.AddTransition(new Transition(attack, () => moveVec.sqrMagnitude == 0 && shootVec.sqrMagnitude != 0));
        move.AddTransition(new Transition(moveAttack, () => moveVec.sqrMagnitude != 0 && shootVec.sqrMagnitude != 0));

        //attack not moving
        attack.AddTransition(new Transition(move, () => moveVec.sqrMagnitude != 0 && shootVec.sqrMagnitude == 0 && !CurrentWeaponScript.shootDelaying));
        attack.AddTransition(new Transition(idle, () => moveVec.sqrMagnitude == 0 && shootVec.sqrMagnitude == 0 && !CurrentWeaponScript.shootDelaying));
        attack.AddTransition(new Transition(moveAttack, () => moveVec.sqrMagnitude != 0 && shootVec.sqrMagnitude != 0));

        //attack while moving
        moveAttack.AddTransition(new Transition(move, () => moveVec.sqrMagnitude != 0 && shootVec.sqrMagnitude == 0 && !CurrentWeaponScript.shootDelaying));
        moveAttack.AddTransition(new Transition(idle, () => moveVec.sqrMagnitude == 0 && shootVec.sqrMagnitude == 0 && !CurrentWeaponScript.shootDelaying));
        moveAttack.AddTransition(new Transition(attack, () => moveVec.sqrMagnitude == 0 && shootVec.sqrMagnitude != 0));


        fsm.AddState(idle);
        fsm.AddState(move);
        fsm.AddState(attack);

        fsm.Init(idle, Directions.Unspecified, Directions.Unspecified);
    }