// Attempt to change state public void changeState(MinionStateMachine.MinionState new_state) { if (new_state == currState_) { return; } // can we make this state change? if (!checkStateChange(currState_, new_state)) { return; } Debug.Log("MinonStateMachine.changeState: Current State = " + stateToString(currState_) + ", New State = " + stateToString(new_state)); Debug.Log("MinonStateMachine.changeState: state change OK"); // set the new state currState_ = new_state; // send the event if (MinionStateChangeEvent != null) { MinionStateChangeEvent(new_state); } }
// return a string of the given state public string stateToString(MinionStateMachine.MinionState state) { switch (state) { case MinionState.idle: return("Idle"); case MinionState.left: return("Left"); case MinionState.right: return("Right"); case MinionState.killed: return("Killed"); case MinionState.resurrect: return("Resurrect"); case MinionState.jump: return("Jump"); case MinionState.falling: return("Falling"); case MinionState.landing: return("Landing"); } return("Unknown"); }
// Use this for initialization void Start() { // current state currState_ = MinionStateMachine.MinionState.idle; // grab the Minion state engine minionStateMachine_ = GetComponent <MinionStateMachine> (); }
// handle the state change void MinionStateHandler(MinionStateMachine.MinionState new_state) { // perform checks on state change, not continuously switch (new_state) { case MinionStateMachine.MinionState.jump: // apply jump force float fx = 0f; float fy = minionJumpVerticalForce_; if (currState_ == MinionStateMachine.MinionState.left) { fx = -minionJumpHorizontalForce_; } else if (currState_ == MinionStateMachine.MinionState.right) { fx = minionJumpHorizontalForce_; } GetComponent <Rigidbody2D> ().AddForce(new Vector2(fx, fy)); break; case MinionStateMachine.MinionState.falling: // if switching to falling from left or right state, set the horizontal velocity appropriately if (currState_ == MinionStateMachine.MinionState.left) { GetComponent <Rigidbody2D> ().velocity = new Vector2(-moveSpeed_, GetComponent <Rigidbody2D> ().velocity.y); } else if (currState_ == MinionStateMachine.MinionState.right) { GetComponent <Rigidbody2D> ().velocity = new Vector2(moveSpeed_, GetComponent <Rigidbody2D> ().velocity.y); } break; } currState_ = new_state; }
// check for valid state changes public bool checkStateChange(MinionStateMachine.MinionState old_state, MinionStateMachine.MinionState new_state) { bool flag = false; switch (new_state) { case MinionState.idle: if (old_state != MinionState.falling) { flag = true; } break; case MinionState.left: if ((old_state == MinionState.idle) || (old_state == MinionState.right) || (old_state == MinionState.landing)) { flag = true; } break; case MinionState.right: if ((old_state == MinionState.idle) || (old_state == MinionState.left) || (old_state == MinionState.landing)) { flag = true; } break; case MinionState.jump: if ((old_state == MinionState.idle) || (old_state == MinionState.left) || (old_state == MinionState.right)) { flag = true; } break; case MinionState.falling: if ((old_state == MinionState.idle) || (old_state == MinionState.left) || (old_state == MinionState.right) || (old_state == MinionState.jump)) { flag = true; } break; case MinionState.landing: if (old_state == MinionState.falling) { flag = true; } break; case MinionState.killed: if ((old_state == MinionState.idle) || (old_state == MinionState.left) || (old_state == MinionState.right) || (old_state == MinionState.jump) || (old_state == MinionState.falling)) { flag = true; } break; case MinionState.resurrect: if (old_state == MinionState.killed) { flag = true; } break; } return(flag); }
// handle the state change void MinionStateHandler(MinionStateMachine.MinionState new_state) { currState_ = new_state; }
// Use this for initialization void Start() { // initial minion state currState_ = MinionStateMachine.MinionState.idle; }