Skip to content

Commit 8de8dca

Browse files
committed
Merge branch 'release/1.0.0'
2 parents 5e607da + a8798b3 commit 8de8dca

33 files changed

+987
-199
lines changed

Assets/FluidStateMachine/Examples/CustomFsmBuilders.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using UnityEngine;
2+
3+
namespace CleverCrow.FluidStateMachine.Examples {
4+
public class CustomStateBuilder : StateBuilderBase<CustomStateBuilder> {
5+
public CustomStateBuilder MyCustomStateBuilderMethod () {
6+
_actions.Add(new ActionEnter((action) => {
7+
Debug.Log("Registered");
8+
}));
9+
return this;
10+
}
11+
}
12+
13+
public class FsmBuilderExample : FsmBuilderBase<FsmBuilderExample, CustomStateBuilder> {
14+
public void MyCustomFsmMethod () {
15+
Debug.Log("Custom method");
16+
}
17+
}
18+
19+
public class FsmBuilderCustomUsage {
20+
private enum StateId {
21+
A,
22+
}
23+
24+
public void Init () {
25+
var fsmBuilder = new FsmBuilderExample()
26+
.State(StateId.A, (state) => {
27+
state
28+
.MyCustomStateBuilderMethod()
29+
.Update((action) => { });
30+
});
31+
32+
fsmBuilder.MyCustomFsmMethod();
33+
34+
var fsm = fsmBuilder.Build();
35+
fsm.Tick();
36+
}
37+
}
38+
}

Assets/FluidStateMachine/Examples/CustomFsmBuilders/FsmBuilderExample.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Dependencies
2+
3+
You must install Probuilder in order for the example scenes to work. If you haven't done so here are the details on how
4+
to do so with Unity's new Package Manager for free.
5+
6+
https://docs.unity3d.com/Packages/com.unity.probuilder@4.0/manual/installing.html

Assets/FluidStateMachine/Examples/README.md.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace CleverCrow.FluidStateMachine {
2+
/// <summary>
3+
/// Triggers the Exit method on the current parent FSM
4+
/// </summary>
5+
public class ActionFsmExit : ActionBase {
6+
protected override void OnEnter () {
7+
ParentState.ParentFsm.Exit();
8+
}
9+
}
10+
}

Assets/FluidStateMachine/Scripts/Actions/Defaults/ActionFsmExit.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidStateMachine/Scripts/Actions/Defaults/RunFsm.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
namespace CleverCrow.FluidStateMachine {
2+
/// <summary>
3+
/// Run a nested FSM. Triggers exit transition when nested FSM triggers an Exit event.
4+
/// </summary>
5+
public class ActionRunFsm : ActionBase {
6+
private IFsm _fsm;
7+
private string _exitTransition;
8+
private bool _triggerExit;
9+
10+
public override string Name => "Run FSM";
11+
12+
public ActionRunFsm (string exitTransition, IFsm fsm) {
13+
_fsm = fsm;
14+
_exitTransition = exitTransition;
15+
}
16+
17+
protected override void OnInit () {
18+
_fsm.EventExit.AddListener(() => _triggerExit = true);
19+
}
20+
21+
protected override void OnEnter () {
22+
_fsm.Reset();
23+
_triggerExit = false;
24+
}
25+
26+
protected override void OnUpdate () {
27+
if (_triggerExit) {
28+
Transition(_exitTransition);
29+
return;
30+
}
31+
32+
_fsm.Tick();
33+
}
34+
}
35+
}

Assets/FluidStateMachine/Scripts/Actions/Defaults/RunFsm/ActionRunFsm.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidStateMachine/Scripts/Actions/Defaults/RunFsm/Editor.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
using NSubstitute;
2+
using NUnit.Framework;
3+
using UnityEngine.Events;
4+
5+
namespace CleverCrow.FluidStateMachine.Editors {
6+
public class ActionRunFsmTest {
7+
private IFsm _fsm;
8+
9+
[SetUp]
10+
public void BeforeEach () {
11+
var unityEvent = new UnityEvent();
12+
_fsm = Substitute.For<IFsm>();
13+
_fsm.EventExit.Returns(unityEvent);
14+
}
15+
16+
public class EnterMethod : ActionRunFsmTest {
17+
[Test]
18+
public void It_should_trigger_Reset_on_the_fsm () {
19+
var runFsm = new ActionRunFsm("a", _fsm);
20+
21+
runFsm.Enter();
22+
23+
_fsm.Received(1).Reset();
24+
}
25+
}
26+
27+
public class UpdateMethod : ActionRunFsmTest {
28+
[Test]
29+
public void It_should_tick_the_nested_fsm () {
30+
var runFsm = new ActionRunFsm("a", _fsm);
31+
32+
runFsm.Update();
33+
34+
_fsm.Received(1).Tick();
35+
}
36+
37+
[Test]
38+
public void It_should_trigger_an_Exit_transition_if_FSM_triggers_an_EventExit () {
39+
var state = Substitute.For<IState>();
40+
var runFsm = new ActionRunFsm("a", _fsm) {ParentState = state};
41+
42+
runFsm.Enter();
43+
_fsm.EventExit.Invoke();
44+
runFsm.Update();
45+
46+
state.Received(1).Transition("a");
47+
}
48+
49+
[Test]
50+
public void It_should_not_trigger_transition_again_after_enter_is_called () {
51+
var state = Substitute.For<IState>();
52+
var runFsm = new ActionRunFsm("a", _fsm) {ParentState = state};
53+
54+
runFsm.Enter();
55+
_fsm.EventExit.Invoke();
56+
runFsm.Update();
57+
runFsm.Exit();
58+
runFsm.Enter();
59+
runFsm.Update();
60+
61+
state.Received(1).Transition("a");
62+
}
63+
}
64+
65+
public class IntegrationTests {
66+
private enum StateId {
67+
A,
68+
B,
69+
}
70+
71+
public class BuilderUsage {
72+
[Test]
73+
public void It_should_not_call_Enter_on_nested_FSM_when_created () {
74+
var stateEnter = false;
75+
var nestedFsm = new FsmBuilder()
76+
.Default(StateId.A)
77+
.State(StateId.A, (state) => {
78+
state.Enter((action) => stateEnter = true);
79+
})
80+
.Build();
81+
82+
new FsmBuilder()
83+
.Default(StateId.A)
84+
.State(StateId.A, (state) => {
85+
state.RunFsm("a", nestedFsm);
86+
})
87+
.Build();
88+
89+
Assert.IsFalse(stateEnter);
90+
}
91+
92+
[Test]
93+
public void It_should_call_Enter_on_nested_FSM_when_ticked () {
94+
var stateEnter = false;
95+
var nestedFsm = new FsmBuilder()
96+
.Default(StateId.A)
97+
.State(StateId.A, (state) => {
98+
state.Enter((action) => stateEnter = true);
99+
})
100+
.Build();
101+
102+
var fsm = new FsmBuilder()
103+
.Default(StateId.A)
104+
.State(StateId.A, (state) => {
105+
state.RunFsm("a", nestedFsm);
106+
})
107+
.Build();
108+
109+
fsm.Tick();
110+
111+
Assert.IsTrue(stateEnter);
112+
}
113+
114+
[Test]
115+
public void It_should_restart_nested_fsm_on_rerun () {
116+
var nestedFsm = new FsmBuilder()
117+
.Default(StateId.A)
118+
.State(StateId.A, (state) => {
119+
state.SetTransition("next", StateId.B);
120+
state.Update((action) => action.Transition("next"));
121+
})
122+
.State(StateId.B, (state) => {
123+
state.FsmExit();
124+
})
125+
.Build();
126+
127+
var fsm = new FsmBuilder()
128+
.Default(StateId.A)
129+
.State(StateId.A, (state) => {
130+
state.SetTransition("next", StateId.B);
131+
state.RunFsm("next", nestedFsm);
132+
})
133+
.State(StateId.B, (state) => {
134+
state.RunFsm("none", nestedFsm);
135+
})
136+
.Build();
137+
138+
fsm.Tick();
139+
fsm.Tick();
140+
141+
Assert.AreEqual(StateId.A, nestedFsm.CurrentState.Id);
142+
}
143+
}
144+
}
145+
}
146+
}

Assets/FluidStateMachine/Scripts/Actions/Defaults/RunFsm/Editor/ActionRunFsmTest.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidStateMachine/Scripts/Builds.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidStateMachine/Scripts/Builds/Editor.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Linq;
2+
using UnityEditor;
3+
using System.Collections.Generic;
4+
using UnityEngine;
5+
6+
namespace CleverCrow.FluidStateMachine.Editors {
7+
public class ExportProject {
8+
[MenuItem("Export/Build Fluid State Machine")]
9+
static void BuildProject () {
10+
var files = GetFiles();
11+
var path = $"{Application.dataPath}/../FluidStateMachine.unitypackage";
12+
13+
Debug.Log($"Exporting to {path}");
14+
AssetDatabase.ExportPackage(files.ToArray(), path);
15+
}
16+
17+
private static List<string> GetFiles () {
18+
return AssetDatabase
19+
.FindAssets("", new[] {
20+
"Assets/FluidStateMachine",
21+
}).ToList()
22+
.Select(AssetDatabase.GUIDToAssetPath)
23+
.Where(file => !file.Contains("Test.cs")).ToList();
24+
}
25+
}
26+
}

Assets/FluidStateMachine/Scripts/Builds/Editor/ExportProject.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidStateMachine/Scripts/Fsms/Editor/FsmBuilderTest.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,22 @@ public void It_should_set_the_default_start_state () {
3838
.State(StateEnum.A, (a) => {})
3939
.Build();
4040

41+
fsm.Tick();
42+
4143
Assert.AreEqual(fsm.GetState(StateEnum.A), fsm.CurrentState);
4244
}
45+
46+
[Test]
47+
public void It_should_set_the_default_property_on_the_fsm () {
48+
var fsm = _builder
49+
.Default(StateEnum.A)
50+
.State(StateEnum.A, (a) => {})
51+
.Build();
52+
53+
fsm.Tick();
54+
55+
Assert.AreEqual(fsm.DefaultState, fsm.CurrentState);
56+
}
4357
}
4458

4559
public class StateMethod : FsmBuilderTest {

0 commit comments

Comments
 (0)