Skip to content

Instantly share code, notes, and snippets.

@ashblue
Last active April 15, 2019 17:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ashblue/33f69657329736123b7e12335bae9eb7 to your computer and use it in GitHub Desktop.
Save ashblue/33f69657329736123b7e12335bae9eb7 to your computer and use it in GitHub Desktop.
class Door : MonoBehavior {
private Fsm _fsmDoor;
private enum State {
Opened,
Closed,
Locked,
Unlocked,
ToggleLock,
}
private void Setup (Player player) {
var fsmLock = new FsmBuilder(gameObject)
.State(State.Locked, (locked) => {
locked.SetAnimatorBool("locked", true);
})
.State(State.Unlocked, (unlocked) => {
unlocked.SetAnimatorBool("locked", false);
})
.State(State.ToggleLock, (toggleLock) => {
toggleLock.SetTransition("unlock", State.Unlocked);
toggleLock.SetTransition("lock", State.Locked);
toggleLock.Do((@lock) => {
switch (@lock.State) {
case State.Locked:
@lock.Transition("unlock");
break;
case State.Unlocked:
@lock.Transition("lock");
break;
}
});
})
.Build();
_fsmDoor = new FsmBuilder(gameObject)
.State(State.Opened, (open) => {
open.SetTransition("close", State.Closed);
open.SetAnimatorString("state", "open");
open.TriggerStay("player", (door) => {
if (player.Input("open")) {
door.Transition("close");
}
});
})
.State(State.Closed, (close) => {
close.SetTransition("open", State.Opened);
close.SetAnimatorString("state", "close");
close.TriggerStay("player", (door) => {
if (player.Input("open") && fsmLock.HasState(State.Unlocked)) {
door.Transition("open");
} else if (player.Input("key") && player.HasItem("key")) {
fsmLock.SetState(State.ToggleLock);
}
});
})
.Build();
}
private void Update () {
_fsmDoor.Tick();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment