// 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); }