From 9f54f1082800d512154ded0e1827d12e0cc40f9d Mon Sep 17 00:00:00 2001 From: Jakir Hussain Date: Fri, 23 Aug 2019 14:37:03 +0100 Subject: [PATCH] 1.2.5: Refactored StateMachine.UpdateState to now be compatible with the UI via direct invocation. Fixed missing references in manual for improving the docs. Various improvements to documentation. --- .../Events/Event Objects/AppEvent.cs | 14 +- .../Runtime Lists/RuntimeList.cs | 1 - .../State Machines/StateMachine.cs | 28 +- .../State Machines/StateMachineBase.cs | 44 +- .../State Machines/StateMachineController.cs | 28 +- .../StateMachineTests/StateMachineTests.cs | 18 +- .../Assets/Scriptable Framework/package.json | 2 +- .../State Machines/usingStateMachines.md | 10 +- docfx/images/stateMachines3.png | Bin 0 -> 45687 bytes .../api/ScriptableFramework.AnimatorList.html | 788 ++++++++++++++++++ ...ptableFramework.AnimatorListPopulator.html | 623 ++++++++++++++ ...ScriptableFramework.AnimatorReference.html | 600 +++++++++++++ ...eFramework.AnimatorReferencePopulator.html | 623 ++++++++++++++ docs/api/ScriptableFramework.AppEvent-1.html | 24 + docs/api/ScriptableFramework.AppEvent.html | 24 + .../api/ScriptableFramework.AppEventBase.html | 24 + ...criptableFramework.AppEventListener-1.html | 24 + .../ScriptableFramework.AppEventListener.html | 24 + ...iptableFramework.AppEventListenerBase.html | 24 + docs/api/ScriptableFramework.AppVersion.html | 24 + docs/api/ScriptableFramework.BoolEvent.html | 24 + ...ScriptableFramework.BoolEventListener.html | 24 + docs/api/ScriptableFramework.BoolList.html | 39 +- .../api/ScriptableFramework.BoolResponse.html | 24 + docs/api/ScriptableFramework.BoolValue.html | 39 +- docs/api/ScriptableFramework.BoundsEvent.html | 24 + ...riptableFramework.BoundsEventListener.html | 24 + .../ScriptableFramework.BoundsResponse.html | 24 + docs/api/ScriptableFramework.ColorEvent.html | 24 + ...criptableFramework.ColorEventListener.html | 24 + docs/api/ScriptableFramework.ColorList.html | 39 +- .../ScriptableFramework.ColorResponse.html | 24 + docs/api/ScriptableFramework.ColorValue.html | 39 +- ...ramework.CustomEditors.AppEventEditor.html | 24 + ....CustomEditors.AppEventListenerEditor.html | 24 + ...mework.CustomEditors.AppVersionEditor.html | 24 + ...mework.CustomEditors.DataStringEditor.html | 24 + ...rk.CustomEditors.EditorOverride.Cache.html | 24 + ...k.CustomEditors.EditorOverride.Colors.html | 24 + ...ramework.CustomEditors.EditorOverride.html | 24 + ...ork.CustomEditors.FrameworkExtensions.html | 24 + ...ork.CustomEditors.RuntimeObjectEditor.html | 24 + ...tomEditors.RuntimeObjectManagerEditor.html | 24 + ...mework.CustomEditors.SceneAssetEditor.html | 24 + ...rk.CustomEditors.SearchableEnumDrawer.html | 24 + ...amework.CustomEditors.SearchablePopup.html | 24 + .../ScriptableFramework.CustomEditors.html | 24 + docs/api/ScriptableFramework.DataString.html | 24 + .../api/ScriptableFramework.DefaultState.html | 24 + docs/api/ScriptableFramework.Dragable.html | 24 + docs/api/ScriptableFramework.FloatEvent.html | 24 + ...criptableFramework.FloatEventListener.html | 24 + docs/api/ScriptableFramework.FloatList.html | 39 +- .../ScriptableFramework.FloatResponse.html | 24 + docs/api/ScriptableFramework.FloatValue.html | 39 +- .../ScriptableFramework.FoldoutAttribute.html | 24 + .../ScriptableFramework.GameObjectList.html | 37 +- ...ableFramework.GameObjectListPopulator.html | 24 + ...riptableFramework.GameObjectReference.html | 37 +- ...ramework.GameObjectReferencePopulator.html | 24 + ...riptableFramework.IReferenceContainer.html | 596 +++++++++++++ .../ScriptableFramework.IValueContainer.html | 595 +++++++++++++ .../ScriptableFramework.InputValidation.html | 24 + docs/api/ScriptableFramework.IntEvent.html | 24 + .../ScriptableFramework.IntEventListener.html | 24 + docs/api/ScriptableFramework.IntList.html | 39 +- docs/api/ScriptableFramework.IntResponse.html | 24 + docs/api/ScriptableFramework.IntValue.html | 39 +- .../ScriptableFramework.MeshRendererList.html | 37 +- ...leFramework.MeshRendererListPopulator.html | 24 + ...ptableFramework.MeshRendererReference.html | 37 +- ...mework.MeshRendererReferencePopulator.html | 24 + docs/api/ScriptableFramework.Platform.html | 24 + .../ScriptableFramework.ReferenceItem-1.html | 66 +- .../ScriptableFramework.ReferenceList-1.html | 66 +- docs/api/ScriptableFramework.ReleaseType.html | 24 + .../ScriptableFramework.RuntimeItem-1.html | 24 + .../ScriptableFramework.RuntimeList-1.html | 27 +- .../ScriptableFramework.RuntimeObject.html | 24 + ...iptableFramework.RuntimeObjectManager.html | 24 + ...amework.SceneAsset.SceneLoadException.html | 24 + docs/api/ScriptableFramework.SceneAsset.html | 24 + ...ableFramework.SearchableEnumAttribute.html | 24 + docs/api/ScriptableFramework.StateChange.html | 24 + .../api/ScriptableFramework.StateMachine.html | 96 +-- .../ScriptableFramework.StateMachineBase.html | 168 +--- ...tableFramework.StateMachineController.html | 96 +-- ...ScriptableFramework.StateMachineReset.html | 24 + docs/api/ScriptableFramework.StateToggle.html | 24 + docs/api/ScriptableFramework.StringEvent.html | 24 + ...riptableFramework.StringEventListener.html | 24 + docs/api/ScriptableFramework.StringList.html | 39 +- .../ScriptableFramework.StringResponse.html | 24 + docs/api/ScriptableFramework.StringValue.html | 39 +- ....Tests.AppEventGenericTests.ClearData.html | 24 + ...Tests.AppEventGenericTests.RaiseEvent.html | 24 + ...AppEventGenericTests.RegisterListener.html | 24 + ...pEventGenericTests.UnregisterListener.html | 24 + ...eFramework.Tests.AppEventGenericTests.html | 24 + ...entListenerGenericTests.OnEventRaised.html | 24 + ...ventListenerGenericTests.RegisterSelf.html | 24 + ...ntListenerGenericTests.UnregisterSelf.html | 24 + ...rk.Tests.AppEventListenerGenericTests.html | 24 + ...s.AppEventListenerTests.OnEventRaised.html | 24 + ...ts.AppEventListenerTests.RegisterSelf.html | 24 + ....AppEventListenerTests.UnregisterSelf.html | 24 + ...Framework.Tests.AppEventListenerTests.html | 24 + ...amework.Tests.AppEventTests.ClearData.html | 24 + ...mework.Tests.AppEventTests.RaiseEvent.html | 24 + ....Tests.AppEventTests.RegisterListener.html | 24 + ...ests.AppEventTests.UnregisterListener.html | 24 + ...riptableFramework.Tests.AppEventTests.html | 24 + ...ptableFramework.Tests.DataStringTests.html | 24 + ...ableFramework.Tests.ListenerResponder.html | 24 + ...rk.Tests.ReferenceItemTests.ClearData.html | 24 + ...ests.ClearWithForAssetReferencingOnly.html | 602 +++++++++++++ ...bleFramework.Tests.ReferenceItemTests.html | 24 + ...rk.Tests.ReferenceListTests.ClearData.html | 24 + ...ests.ClearWithForAssetReferencingOnly.html | 602 +++++++++++++ ...bleFramework.Tests.ReferenceListTests.html | 24 + ...ork.Tests.StateMachineTests.ClearData.html | 24 + ....Tests.StateMachineTests.ReapplyState.html | 24 + ...s.StateMachineTests.UpdateStateForAll.html | 24 + ...StateMachineTests.UpdateStateForIndex.html | 24 + ...StateMachineTests.UpdateStateForRange.html | 24 + ...tateMachineTests.UpdateStateForSingle.html | 24 + ...ableFramework.Tests.StateMachineTests.html | 24 + ...ggleTests.RespondToStateMachineChange.html | 24 + ...s.StateToggleTests.UpdateStateMachine.html | 24 + ...tableFramework.Tests.StateToggleTests.html | 24 + ...ptableFramework.Tests.StringListTests.html | 24 + ...mework.Tests.ValueItemTests.ClearData.html | 24 + ...iptableFramework.Tests.ValueItemTests.html | 24 + ...mework.Tests.ValueListTests.ClearData.html | 24 + ...iptableFramework.Tests.ValueListTests.html | 24 + docs/api/ScriptableFramework.Tests.html | 28 + .../ScriptableFramework.TransformList.html | 37 +- ...tableFramework.TransformListPopulator.html | 24 + ...criptableFramework.TransformReference.html | 37 +- ...Framework.TransformReferencePopulator.html | 24 + docs/api/ScriptableFramework.ValueItem-1.html | 70 +- docs/api/ScriptableFramework.ValueList-1.html | 70 +- .../api/ScriptableFramework.Vector3Event.html | 24 + ...iptableFramework.Vector3EventListener.html | 24 + docs/api/ScriptableFramework.Vector3List.html | 39 +- .../ScriptableFramework.Vector3Response.html | 24 + .../api/ScriptableFramework.Vector3Value.html | 39 +- docs/api/ScriptableFramework.html | 47 ++ docs/api/index.html | 24 + docs/articles/Events/eventListeners.html | 6 + docs/articles/Events/eventObjects.html | 5 +- docs/articles/Runtime Items/valueItems.html | 8 +- docs/articles/Runtime Lists/valueLists.html | 8 +- .../creatingRuntimeObjects.html | 5 +- .../runtimeObjectProperties.html | 5 +- .../stateMachineControllers.html | 5 +- .../usingStateMachineControllers.html | 5 +- .../State Machines/usingStateMachines.html | 8 +- docs/articles/advancedTopics.html | 4 + docs/articles/events.html | 7 +- docs/articles/modularSceneLoading.html | 7 +- docs/articles/populators.html | 6 +- docs/articles/runtimeItems.html | 7 +- docs/articles/runtimeLists.html | 5 +- docs/articles/runtimeObjects.html | 9 +- docs/articles/stateMachines.html | 7 +- docs/articles/versioningYourApps.html | 5 +- docs/images/stateMachines3.png | Bin 0 -> 45687 bytes docs/manifest.json | 513 +++++++----- docs/xrefmap.yml | 328 +++++++- 170 files changed, 9409 insertions(+), 638 deletions(-) create mode 100644 docfx/images/stateMachines3.png create mode 100644 docs/api/ScriptableFramework.AnimatorList.html create mode 100644 docs/api/ScriptableFramework.AnimatorListPopulator.html create mode 100644 docs/api/ScriptableFramework.AnimatorReference.html create mode 100644 docs/api/ScriptableFramework.AnimatorReferencePopulator.html create mode 100644 docs/api/ScriptableFramework.IReferenceContainer.html create mode 100644 docs/api/ScriptableFramework.IValueContainer.html create mode 100644 docs/api/ScriptableFramework.Tests.ReferenceItemTests.ClearWithForAssetReferencingOnly.html create mode 100644 docs/api/ScriptableFramework.Tests.ReferenceListTests.ClearWithForAssetReferencingOnly.html create mode 100644 docs/images/stateMachines3.png diff --git a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/Events/Event Objects/AppEvent.cs b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/Events/Event Objects/AppEvent.cs index c702331..6052555 100644 --- a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/Events/Event Objects/AppEvent.cs +++ b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/Events/Event Objects/AppEvent.cs @@ -36,10 +36,20 @@ public override bool RaiseEvent ([CallerFilePath] string fileName = "", [CallerM { #if UNITY_EDITOR if (ScriptableFrameworkSettings.EditorEventLogging) + { #endif - Debug.Log (string.Format ("[EVENT] '{0}' was raised from {1}.{2}() at line {3}", name, Path.GetFileNameWithoutExtension (fileName), methodName, callerLineNumber)); + //System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame (1, false); + + + //Debug.Log (string.Format ("[EVENT] '{0}' was raised from {1}.{2} at line {3}", name, Path.GetFileNameWithoutExtension (stackFrame.GetFileName ()), stackFrame.GetMethod ().Name, stackFrame.GetFileLineNumber ())); + Debug.Log (string.Format ("[EVENT] '{0}' was raised from {1}.{2}() at line {3}", name, Path.GetFileNameWithoutExtension (fileName), methodName, callerLineNumber)); - if (listeners.Count == 0) +#if UNITY_EDITOR + } +#endif + + + if (listeners.Count == 0) { Debug.LogWarning (string.Format ("[EVENT] '{0}' was raised but has no listeners", name)); return false; diff --git a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/Runtime Lists/RuntimeList.cs b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/Runtime Lists/RuntimeList.cs index 1b757be..59d8530 100644 --- a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/Runtime Lists/RuntimeList.cs +++ b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/Runtime Lists/RuntimeList.cs @@ -17,7 +17,6 @@ public abstract class RuntimeList : RuntimeObject, IList /// /// A list of the elements in this object to be accessed externally via square bracket operator. /// - /// The internal list that actually contains the elements of this object. [Space] [SerializeField] protected List items = new List (); diff --git a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachine.cs b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachine.cs index d0026e1..14af5b8 100644 --- a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachine.cs +++ b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachine.cs @@ -22,38 +22,32 @@ public class StateMachine : StateMachineBase /// Actually runs the loop which sets the GameObjects on or off. /// /// Index of the object to be left on. - /// Whether or not the operation succeeded. - protected override bool ApplyState(int newSelectionIndex) + protected override void ApplyState(int newSelectionIndex) { selectionIndex = newSelectionIndex; for (int i = 0; i < gameObjects.Count; i++) { - if (!CheckListItemBeforeUpdate(i)) return false; + if (!CheckListItemBeforeUpdate(i)) return; gameObjects[i].SetActive(i == selectionIndex); } - - return true; } /// /// Actually runs the loop which sets all the GameObjects on or off. /// /// The new state for all GameObjects. - /// Whether or not the operation succeeded. - protected override bool ApplyState(bool stateForAll) + protected override void ApplyState (bool stateForAll) { selectionIndex = -1; for (int i = 0; i < gameObjects.Count; i++) { - if (!CheckListItemBeforeUpdate(i)) return false; + if (!CheckListItemBeforeUpdate(i)) return; gameObjects[i].SetActive(stateForAll); } - - return true; } /// @@ -61,19 +55,16 @@ protected override bool ApplyState(bool stateForAll) /// /// The index of the object to update. /// The state to provide that object with. - /// Whether or not the operation succeeded. - protected override bool ApplyState(int newSelectionIndex, bool stateAtThisObject) + protected override void ApplyState (int newSelectionIndex, bool stateAtThisObject) { selectionIndex = -1; for (int i = 0; i < gameObjects.Count; i++) { - if (!CheckListItemBeforeUpdate(i)) return false; + if (!CheckListItemBeforeUpdate(i)) return; } gameObjects[newSelectionIndex].SetActive(stateAtThisObject); - - return true; } /// @@ -82,22 +73,19 @@ protected override bool ApplyState(int newSelectionIndex, bool stateAtThisObject /// Where to start applying your state (inclusive). /// How many objects to affect. /// The state to apply within your given range. - /// Whether or not the operation succeeded. - protected override bool ApplyState(int startIndex, int length, bool stateToApply) + protected override void ApplyState (int startIndex, int length, bool stateToApply) { selectionIndex = -1; for (int i = 0; i < gameObjects.Count; i++) { - if (!CheckListItemBeforeUpdate(i)) return false; + if (!CheckListItemBeforeUpdate(i)) return; if (i >= startIndex && i < startIndex + length) gameObjects[i].SetActive (stateToApply); else gameObjects[i].SetActive (!stateToApply); } - - return true; } /// diff --git a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachineBase.cs b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachineBase.cs index 4627a9f..ee9bab4 100644 --- a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachineBase.cs +++ b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachineBase.cs @@ -28,26 +28,24 @@ public abstract class StateMachineBase : RuntimeObject /// /// Index of the state to be active. /// If true, the update for all other objects will be skipped. - /// Whether or not the operation succeeded. - public bool UpdateState (int newSelectionIndex) + public void UpdateState (int newSelectionIndex) { - if (!CheckListBeforeUpdate ()) return false; + if (!CheckListBeforeUpdate ()) return; - if (!CheckSelectionIndexBeforeUpdate (newSelectionIndex)) return false; + if (!CheckSelectionIndexBeforeUpdate (newSelectionIndex)) return; - return ApplyState (newSelectionIndex); + ApplyState (newSelectionIndex); } /// /// Applies the same state to all objects in the current list. /// /// The new state for all contained object. - /// Whether or not the operation succeeded. - public bool UpdateState (bool stateForAll) + public void UpdateState (bool stateForAll) { - if (!CheckListBeforeUpdate ()) return false; + if (!CheckListBeforeUpdate ()) return; - return ApplyState (stateForAll); + ApplyState (stateForAll); } /// @@ -55,14 +53,13 @@ public bool UpdateState (bool stateForAll) /// /// The index of the object to update. /// The state to provide that object with. - /// Whether or not the operation succeeded. - public bool UpdateState (int newSelectionIndex, bool stateAtThisObject) + public void UpdateState (int newSelectionIndex, bool stateAtThisObject) { - if (!CheckListBeforeUpdate ()) return false; + if (!CheckListBeforeUpdate ()) return; - if (!CheckSelectionIndexBeforeUpdate (newSelectionIndex)) return false; + if (!CheckSelectionIndexBeforeUpdate (newSelectionIndex)) return; - return ApplyState (newSelectionIndex, stateAtThisObject); + ApplyState (newSelectionIndex, stateAtThisObject); } /// @@ -72,12 +69,11 @@ public bool UpdateState (int newSelectionIndex, bool stateAtThisObject) /// Where to start applying your state (inclusive). /// How many objects to affect. /// The state to apply within your given range. - /// Whether or not the operation succeeded. - public bool UpdateState (int startIndex, int length, bool stateToApply) + public void UpdateState (int startIndex, int length, bool stateToApply) { - if (!CheckListBeforeUpdate ()) return false; + if (!CheckListBeforeUpdate ()) return; - return ApplyState (startIndex, length, stateToApply); + ApplyState (startIndex, length, stateToApply); } /// @@ -85,23 +81,20 @@ public bool UpdateState (int startIndex, int length, bool stateToApply) /// /// Index of the state to be active. /// If true, the update for all other objects will be skipped. - /// Whether or not the operation succeeded. - protected abstract bool ApplyState (int newSelectionIndex); + protected abstract void ApplyState (int newSelectionIndex); /// /// Actually runs the loop which sets the state of all objects in the list. /// /// State to apply for all. - /// Whether or not the operation succeeded. - protected abstract bool ApplyState (bool stateForAll); + protected abstract void ApplyState (bool stateForAll); /// /// Actually applies the new state to the selected object. /// /// The index of the object to update. /// The state to provide that object with. - /// Whether or not the operation succeeded. - protected abstract bool ApplyState (int newSelectionIndex, bool stateAtThisObject); + protected abstract void ApplyState (int newSelectionIndex, bool stateAtThisObject); /// /// Actually runs the loop which applies your given range of objects and the rest with another. @@ -109,8 +102,7 @@ public bool UpdateState (int startIndex, int length, bool stateToApply) /// Where to start applying your state (inclusive). /// How many objects to affect. /// The state to apply within your given range. - /// Whether or not the operation succeeded. - protected abstract bool ApplyState (int startIndex, int length, bool stateToApply); + protected abstract void ApplyState (int startIndex, int length, bool stateToApply); /// /// Checks if the list is null. Since the list can be a varying type, defining this as diff --git a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachineController.cs b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachineController.cs index e212b0f..dc91bb4 100644 --- a/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachineController.cs +++ b/Scriptable Framework/Assets/Scriptable Framework/API/RuntimeObjects/State Machines/StateMachineController.cs @@ -22,38 +22,32 @@ public class StateMachineController : StateMachineBase /// Actually runs the loop which sets each object's state on or off. /// /// Index of the state to be active. - /// Whether or not the operation succeeded. - protected override bool ApplyState (int newSelectionIndex) + protected override void ApplyState (int newSelectionIndex) { selectionIndex = newSelectionIndex; for (int i = 0; i < subStateMachines.Count; i++) { - if (!CheckListItemBeforeUpdate (i)) return false; + if (!CheckListItemBeforeUpdate (i)) return; subStateMachines[i].UpdateState (i == selectionIndex); } - - return true; } /// /// Actually runs the loop which sets each object's state on or off. /// /// The new state for all objects. - /// Whether or not the operation succeeded. - protected override bool ApplyState (bool stateForAll) + protected override void ApplyState (bool stateForAll) { selectionIndex = -1; for (int i = 0; i < subStateMachines.Count; i++) { - if (!CheckListItemBeforeUpdate (i)) return false; + if (!CheckListItemBeforeUpdate (i)) return; subStateMachines[i].UpdateState (stateForAll); } - - return true; } /// @@ -61,16 +55,13 @@ protected override bool ApplyState (bool stateForAll) /// /// The index of the object to update. /// The state to provide that object with. - /// Whether or not the operation succeeded. - protected override bool ApplyState (int newSelectionIndex, bool stateAtThisObject) + protected override void ApplyState (int newSelectionIndex, bool stateAtThisObject) { selectionIndex = -1; - if (!CheckListItemBeforeUpdate (newSelectionIndex)) return false; + if (!CheckListItemBeforeUpdate (newSelectionIndex)) return; subStateMachines[newSelectionIndex].UpdateState (stateAtThisObject); - - return true; } /// @@ -79,22 +70,19 @@ protected override bool ApplyState (int newSelectionIndex, bool stateAtThisObjec /// Where to start applying your state (inclusive). /// How many objects to affect. /// The state to apply within your given range. - /// Whether or not the operation succeeded. - protected override bool ApplyState (int startIndex, int length, bool stateToApply) + protected override void ApplyState (int startIndex, int length, bool stateToApply) { selectionIndex = -1; for (int i = 0; i < subStateMachines.Count; i++) { - if (!CheckListItemBeforeUpdate (i)) return false; + if (!CheckListItemBeforeUpdate (i)) return; if (i >= startIndex && i < startIndex + length) subStateMachines[i].UpdateState (stateToApply); else subStateMachines[i].UpdateState (!stateToApply); } - - return true; } /// diff --git a/Scriptable Framework/Assets/Scriptable Framework/Tests/Editor/RuntimeData Tests/StateMachineTests/StateMachineTests.cs b/Scriptable Framework/Assets/Scriptable Framework/Tests/Editor/RuntimeData Tests/StateMachineTests/StateMachineTests.cs index 2537f4b..d58f58a 100644 --- a/Scriptable Framework/Assets/Scriptable Framework/Tests/Editor/RuntimeData Tests/StateMachineTests/StateMachineTests.cs +++ b/Scriptable Framework/Assets/Scriptable Framework/Tests/Editor/RuntimeData Tests/StateMachineTests/StateMachineTests.cs @@ -37,7 +37,8 @@ public void AddToList (int instances) [Test] public void UpdateStateSuccess () { - Assert.True (stateMachine.UpdateState (1)); + stateMachine.UpdateState (1); + Assert.True (!gameObjects[0].activeSelf && gameObjects[1].activeSelf && !gameObjects[2].activeSelf); } [Test] @@ -79,7 +80,8 @@ public void UpdateStateWithOutOfRangeIndex () [Test] public void UpdateStateWithSameIndex () { - Assert.True (stateMachine.UpdateState (0)); + stateMachine.UpdateState (0); + Assert.True (gameObjects[0].activeSelf && !gameObjects[1].activeSelf && !gameObjects[2].activeSelf); } [Test] @@ -128,7 +130,8 @@ public void AddToList (int instances) [Test] public void UpdateStateSuccess () { - Assert.True (stateMachine.UpdateState (true)); + stateMachine.UpdateState (true); + Assert.True (gameObjects[0].activeSelf && gameObjects[1].activeSelf && gameObjects[2].activeSelf); } [Test] @@ -193,7 +196,8 @@ public void AddToList (int instances) [Test] public void UpdateStateSuccess () { - Assert.True (stateMachine.UpdateState (1, true)); + stateMachine.UpdateState (1, true); + Assert.True (gameObjects[0].activeSelf && gameObjects[1].activeSelf && !gameObjects[2].activeSelf); } [Test] @@ -229,7 +233,8 @@ public void UpdateStateToggle () [Test] public void UpdateStateWithSameIndex () { - Assert.True (stateMachine.UpdateState (0, true)); + stateMachine.UpdateState (0, true); + Assert.True (gameObjects[0].activeSelf && !gameObjects[1].activeSelf && !gameObjects[2].activeSelf); } [Test] @@ -291,7 +296,8 @@ public void AddToList (int instances) [Test] public void UpdateStateSuccess () { - Assert.True (stateMachine.UpdateState (1, 2, true)); + stateMachine.UpdateState (1, 2, true); + Assert.True (!gameObjects[0].activeSelf && gameObjects[1].activeSelf && gameObjects[2].activeSelf); } [Test] diff --git a/Scriptable Framework/Assets/Scriptable Framework/package.json b/Scriptable Framework/Assets/Scriptable Framework/package.json index 2de3f93..330dabb 100644 --- a/Scriptable Framework/Assets/Scriptable Framework/package.json +++ b/Scriptable Framework/Assets/Scriptable Framework/package.json @@ -2,7 +2,7 @@ "name": "com.open.scriptable-framework", "displayName": "Scriptable Framework", "author": "Jak Hussain, Dean Giddy, Conor Galvin", - "version": "1.2.4", + "version": "1.2.5", "unity": "2018.3", "description": "A modularity framework developed to better enable Unity developers to decouple and test their code using ScriptableObject based dependencies that can be dragged and dropped into the inspector. The API and workflow makes it easy to use advanced programming patterns and SOLID principals in your projects which promotes a higher quality of code.The Scriptable Framework is the core of all future module development for Arup. See GitHub for documentation.", "keywords": [ diff --git a/docfx/articles/State Machines/usingStateMachines.md b/docfx/articles/State Machines/usingStateMachines.md index 2759ef9..e592f85 100644 --- a/docfx/articles/State Machines/usingStateMachines.md +++ b/docfx/articles/State Machines/usingStateMachines.md @@ -8,4 +8,12 @@ Because of the execution order of what goes on with Scriptable Framework behind ![Figure2](~/images/stateMachines2.png) -**NOTE**: It is much quicker to use a populator to set the references in your GameObjectList automatically rather than to write your own code for it. See the Populators manual for further details. \ No newline at end of file +**NOTE**: It is much quicker to use a populator to set the references in your GameObjectList automatically rather than to write your own code for it. See the Populators manual for further details. + +## StateMachines via UI Components + +Traditionally, a UI component like a button or a dropdown would have an instance of a MonoBehaviour dragged into them so that one of its methods could be assigned for the UI object to invoke. What most people don't know is, you can also do this with ScriptableObjects! + +![Figure3](~/images/stateMachines3.png) + +The image above shows an example of how a dropdown component has a StateMachine assigned to its object reference. By doing this, you can call the `UpdateState` method directly from the UI and not write any code at all for controlling objects in your scene. \ No newline at end of file diff --git a/docfx/images/stateMachines3.png b/docfx/images/stateMachines3.png new file mode 100644 index 0000000000000000000000000000000000000000..1e0e4c54baab9dab5768d73eac6a5c59e83bf730 GIT binary patch literal 45687 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 + + + + + + + Class AnimatorList + + + + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+ + + + + + diff --git a/docs/api/ScriptableFramework.AnimatorListPopulator.html b/docs/api/ScriptableFramework.AnimatorListPopulator.html new file mode 100644 index 0000000..86b57fc --- /dev/null +++ b/docs/api/ScriptableFramework.AnimatorListPopulator.html @@ -0,0 +1,623 @@ + + + + + + + + Class AnimatorListPopulator + + + + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+ + + + + + diff --git a/docs/api/ScriptableFramework.AnimatorReference.html b/docs/api/ScriptableFramework.AnimatorReference.html new file mode 100644 index 0000000..1150afe --- /dev/null +++ b/docs/api/ScriptableFramework.AnimatorReference.html @@ -0,0 +1,600 @@ + + + + + + + + Class AnimatorReference + + + + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+ + + + + + diff --git a/docs/api/ScriptableFramework.AnimatorReferencePopulator.html b/docs/api/ScriptableFramework.AnimatorReferencePopulator.html new file mode 100644 index 0000000..015b53f --- /dev/null +++ b/docs/api/ScriptableFramework.AnimatorReferencePopulator.html @@ -0,0 +1,623 @@ + + + + + + + + Class AnimatorReferencePopulator + + + + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+ + + + + + diff --git a/docs/api/ScriptableFramework.AppEvent-1.html b/docs/api/ScriptableFramework.AppEvent-1.html index 0fcf85c..c9c183a 100644 --- a/docs/api/ScriptableFramework.AppEvent-1.html +++ b/docs/api/ScriptableFramework.AppEvent-1.html @@ -86,6 +86,18 @@ ScriptableFramework