diff --git a/src/gg.regression.unity.bots/Runtime/Fonts/Regression.asset b/src/gg.regression.unity.bots/Runtime/Fonts/Regression.asset index 44d8728f..bd7e636b 100644 --- a/src/gg.regression.unity.bots/Runtime/Fonts/Regression.asset +++ b/src/gg.regression.unity.bots/Runtime/Fonts/Regression.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1abac230bf22e4d1a41f9be7b7019f77392b45a6df3d6313253bc88102f672d1 -size 2185893 +oid sha256:a702146f6820836cd8654f165e22166259d748787bf5838a150aeb705f0c69d4 +size 2187021 diff --git a/src/gg.regression.unity.bots/Runtime/Prefabs/RGOverlayCanvas.prefab b/src/gg.regression.unity.bots/Runtime/Prefabs/RGOverlayCanvas.prefab index c606dd1d..9380342a 100644 --- a/src/gg.regression.unity.bots/Runtime/Prefabs/RGOverlayCanvas.prefab +++ b/src/gg.regression.unity.bots/Runtime/Prefabs/RGOverlayCanvas.prefab @@ -31,6 +31,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1094668923711103164} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -106,6 +107,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6927235806806861544} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -184,6 +186,7 @@ RectTransform: - {fileID: 8867301982941913259} - {fileID: 1873950661224102372} m_Father: {fileID: 8117107699251341521} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -272,6 +275,7 @@ RectTransform: - {fileID: 8117107699251341521} - {fileID: 5070724337647967428} m_Father: {fileID: 1094668923711103164} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -377,6 +381,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2586173674173139519} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -515,6 +520,7 @@ RectTransform: m_Children: - {fileID: 2517803416891369262} m_Father: {fileID: 504710645255300407} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -664,6 +670,7 @@ RectTransform: - {fileID: 7561077974882775834} - {fileID: 1824198797412453037} m_Father: {fileID: 5224021696837641672} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -740,6 +747,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7599706311069070457} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -825,6 +833,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -977,6 +986,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1129,6 +1139,7 @@ RectTransform: m_Children: - {fileID: 266832984541047860} m_Father: {fileID: 1090041802443136416} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1261,6 +1272,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1415,6 +1427,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1566,6 +1579,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1094668923711103164} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -1699,6 +1713,7 @@ RectTransform: m_Children: - {fileID: 5483322438096022206} m_Father: {fileID: 7599706311069070457} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -1782,6 +1797,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8461864424661141685} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -1917,6 +1933,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2069,6 +2086,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2145,6 +2163,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 5630640976557725279} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2325,6 +2344,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2476,6 +2496,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1094668923711103164} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -2607,6 +2628,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2741,6 +2763,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6927235806806861544} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2816,6 +2839,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6927235806806861544} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2893,6 +2917,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3045,6 +3070,7 @@ RectTransform: m_Children: - {fileID: 7599706311069070457} m_Father: {fileID: 7561077974882775834} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -3134,6 +3160,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2943620597921803164} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3227,6 +3254,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 9177377740776242902} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -3304,6 +3332,7 @@ RectTransform: - {fileID: 2586173674173139519} - {fileID: 473555547563468943} m_Father: {fileID: 1094668923711103164} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -3341,6 +3370,7 @@ GameObject: - component: {fileID: 2691063060475736242} - component: {fileID: 2237490060797875882} - component: {fileID: 8695714631924223571} + - component: {fileID: 5044916670311169477} m_Layer: 5 m_Name: RGOverlayCanvas m_TagString: Untagged @@ -3364,6 +3394,7 @@ RectTransform: - {fileID: 1094668923711103164} - {fileID: 8701351736407767869} m_Father: {fileID: 0} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -3387,9 +3418,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 - m_VertexColorAlwaysGammaSpace: 0 m_AdditionalShaderChannelsFlag: 25 - m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 29999 m_TargetDisplay: 0 @@ -3485,7 +3514,6 @@ MonoBehaviour: m_EditorClassIdentifier: recordingMinFPS: 0 minimizeRecordingCriteria: 1 - minimizeRecordingMouseMovements: 0 --- !u!114 &4232611005985544413 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3579,6 +3607,19 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 686ca1d3e71249b18c62c52d27937490, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!114 &5044916670311169477 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7029756735420670719} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f462c11d53b847fda7053d07bb8557da, type: 3} + m_Name: + m_EditorClassIdentifier: + pauseEditorOnPlaybackError: 0 --- !u!1 &7034141691038978701 GameObject: m_ObjectHideFlags: 0 @@ -3611,6 +3652,7 @@ RectTransform: m_Children: - {fileID: 985415874430226196} m_Father: {fileID: 1090041802443136416} + m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3687,6 +3729,7 @@ RectTransform: - {fileID: 5061430410649258493} - {fileID: 5716806768315515097} m_Father: {fileID: 1090041802443136416} + m_RootOrder: 12 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3726,6 +3769,7 @@ RectTransform: m_Children: - {fileID: 9177377740776242902} m_Father: {fileID: 7561077974882775834} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -3851,6 +3895,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3983,6 +4028,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 504710645255300407} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -4121,6 +4167,7 @@ RectTransform: m_Children: - {fileID: 7703921365364316530} m_Father: {fileID: 504710645255300407} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -4279,6 +4326,7 @@ RectTransform: - {fileID: 5789129086972528656} - {fileID: 6927235806806861544} m_Father: {fileID: 5224021696837641672} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -4323,7 +4371,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 77fc1e88a9b44c159e04099241437fe5, type: 3} m_Name: m_EditorClassIdentifier: - pauseEditorOnPlaybackWarning: 0 --- !u!114 &5122435472915985299 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4381,6 +4428,7 @@ RectTransform: m_Children: - {fileID: 2717452967654519485} m_Father: {fileID: 5070724337647967428} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -4392,7 +4440,6 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: - serializedVersion: 3 m_TransformParent: {fileID: 1094668923711103164} m_Modifications: - target: {fileID: 4489364121807382, guid: 04ac259d13a0945ac87ddc5cac56785e, type: 3} @@ -8176,9 +8223,6 @@ PrefabInstance: value: -10 objectReference: {fileID: 0} m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 04ac259d13a0945ac87ddc5cac56785e, type: 3} --- !u!1 &1768688999565580427 stripped GameObject: @@ -8195,7 +8239,6 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: - serializedVersion: 3 m_TransformParent: {fileID: 5224021696837641672} m_Modifications: - target: {fileID: 210366935220034040, guid: b173f524aed5741e7bf7718478ebfae9, type: 3} @@ -8495,9 +8538,6 @@ PrefabInstance: value: objectReference: {fileID: 7029756735420670719} m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: b173f524aed5741e7bf7718478ebfae9, type: 3} --- !u!1 &5563740331335366267 stripped GameObject: @@ -8514,7 +8554,6 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: - serializedVersion: 3 m_TransformParent: {fileID: 8867301982941913259} m_Modifications: - target: {fileID: 4199513441948227604, guid: 2a80ebd7f472840da84a654a4fa3d09e, type: 3} @@ -8634,12 +8673,6 @@ PrefabInstance: value: UnityEngine.Object, UnityEngine objectReference: {fileID: 0} m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: - - targetCorrespondingSourceObject: {fileID: 4854958758869477337, guid: 2a80ebd7f472840da84a654a4fa3d09e, type: 3} - insertIndex: -1 - addedObject: {fileID: 1644905056975458796} m_SourcePrefab: {fileID: 100100000, guid: 2a80ebd7f472840da84a654a4fa3d09e, type: 3} --- !u!1 &3723146531997908583 stripped GameObject: diff --git a/src/gg.regression.unity.bots/Runtime/Prefabs/RGOverlayCanvasV2.prefab b/src/gg.regression.unity.bots/Runtime/Prefabs/RGOverlayCanvasV2.prefab index 3509dd80..79fbbf50 100644 --- a/src/gg.regression.unity.bots/Runtime/Prefabs/RGOverlayCanvasV2.prefab +++ b/src/gg.regression.unity.bots/Runtime/Prefabs/RGOverlayCanvasV2.prefab @@ -31,6 +31,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6927235806806861544} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -106,6 +107,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 130924262344969576} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -183,6 +185,7 @@ RectTransform: m_Children: - {fileID: 3141922717576822039} m_Father: {fileID: 6746351550061287240} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -307,6 +310,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1094668923711103164} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} @@ -443,6 +447,7 @@ RectTransform: m_Children: - {fileID: 7961718474796200068} m_Father: {fileID: 6746351550061287240} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -531,6 +536,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 47554025908246306} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 0, y: 0.5} @@ -606,6 +612,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1452189883864539947} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -740,6 +747,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 47554025908246306} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -880,6 +888,7 @@ RectTransform: - {fileID: 2517803416891369262} - {fileID: 6648679281401812096} m_Father: {fileID: 5224021696837641672} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -954,6 +963,7 @@ RectTransform: m_Children: - {fileID: 1508444460829567942} m_Father: {fileID: 3393945995968011374} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -991,6 +1001,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1775505273637563011} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -1070,6 +1081,7 @@ RectTransform: m_Children: - {fileID: 6986221192224276067} m_Father: {fileID: 7825146823198246843} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -1203,6 +1215,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1357,6 +1370,7 @@ RectTransform: - {fileID: 4362780102445503521} - {fileID: 4911149214502031902} m_Father: {fileID: 1452189883864539947} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -1448,9 +1462,7 @@ Canvas: m_OverrideSorting: 1 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 - m_VertexColorAlwaysGammaSpace: 0 m_AdditionalShaderChannelsFlag: 25 - m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 30000 m_TargetDisplay: 0 @@ -1485,6 +1497,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1094668923711103164} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -1562,6 +1575,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1714,6 +1728,7 @@ RectTransform: m_Children: - {fileID: 266832984541047860} m_Father: {fileID: 1090041802443136416} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1847,6 +1862,7 @@ RectTransform: m_Children: - {fileID: 130924262344969576} m_Father: {fileID: 8326409972815191664} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1972,6 +1988,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2126,6 +2143,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2277,6 +2295,7 @@ RectTransform: m_Children: - {fileID: 1593904811034481552} m_Father: {fileID: 5849487789424347138} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -2352,6 +2371,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2163531068832325664} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2427,6 +2447,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 5849487789424347138} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2508,6 +2529,7 @@ RectTransform: - {fileID: 4515592992782609972} - {fileID: 536196743177323916} m_Father: {fileID: 2530510026482189899} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -2595,6 +2617,7 @@ RectTransform: m_Children: - {fileID: 2530510026482189899} m_Father: {fileID: 8326409972815191664} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2683,6 +2706,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2163531068832325664} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 0, y: 0.5} @@ -2762,6 +2786,7 @@ RectTransform: - {fileID: 4334941368482101610} - {fileID: 3393945995968011374} m_Father: {fileID: 8587920458476045062} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -2853,9 +2878,7 @@ Canvas: m_OverrideSorting: 1 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 - m_VertexColorAlwaysGammaSpace: 0 m_AdditionalShaderChannelsFlag: 25 - m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 30000 m_TargetDisplay: 0 @@ -2890,6 +2913,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1094668923711103164} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.75} m_AnchorMax: {x: 0, y: 0.75} @@ -3025,6 +3049,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3179,6 +3204,7 @@ RectTransform: m_Children: - {fileID: 1852812869902392873} m_Father: {fileID: 6648679281401812096} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -3267,6 +3293,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3141922717576822039} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -3342,6 +3369,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3418,6 +3446,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 5630640976557725279} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3598,6 +3627,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3750,6 +3780,7 @@ RectTransform: m_Children: - {fileID: 3152240568156906031} m_Father: {fileID: 1094668923711103164} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -3881,6 +3912,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -4014,6 +4046,7 @@ RectTransform: m_Children: - {fileID: 2163531068832325664} m_Father: {fileID: 4362780102445503521} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -4052,6 +4085,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -4184,6 +4218,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6927235806806861544} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -4259,6 +4294,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6927235806806861544} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -4336,6 +4372,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1090041802443136416} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -4486,6 +4523,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 47554025908246306} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -4561,6 +4599,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1452189883864539947} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} @@ -4695,6 +4734,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8587920458476045062} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -4775,6 +4815,7 @@ RectTransform: - {fileID: 6746351550061287240} - {fileID: 2953817864760835568} m_Father: {fileID: 4901750364568730873} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -4907,6 +4948,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2943620597921803164} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -5003,6 +5045,7 @@ RectTransform: - {fileID: 5248371518487353189} - {fileID: 5849487789424347138} m_Father: {fileID: 7825146823198246843} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0.5, y: 1} @@ -5138,6 +5181,7 @@ RectTransform: - {fileID: 8587920458476045062} - {fileID: 7825146823198246843} m_Father: {fileID: 1094668923711103164} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.8} m_AnchorMax: {x: 1, y: 0.8} @@ -5239,6 +5283,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8587920458476045062} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} @@ -5373,6 +5418,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8587920458476045062} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -5497,6 +5543,7 @@ GameObject: - component: {fileID: 6730627180652117754} - component: {fileID: 3294850002957852004} - component: {fileID: 1014070567865872360} + - component: {fileID: 3419008647784595734} m_Layer: 5 m_Name: RGOverlayCanvasV2 m_TagString: Untagged @@ -5519,6 +5566,7 @@ RectTransform: - {fileID: 1090041802443136416} - {fileID: 1094668923711103164} m_Father: {fileID: 0} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -5542,9 +5590,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 - m_VertexColorAlwaysGammaSpace: 0 m_AdditionalShaderChannelsFlag: 25 - m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 29999 m_TargetDisplay: 0 @@ -5621,7 +5667,6 @@ MonoBehaviour: m_EditorClassIdentifier: recordingMinFPS: 0 minimizeRecordingCriteria: 1 - minimizeRecordingMouseMovements: 0 --- !u!114 &4232611005985544413 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5707,6 +5752,19 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 686ca1d3e71249b18c62c52d27937490, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!114 &3419008647784595734 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7029756735420670719} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f462c11d53b847fda7053d07bb8557da, type: 3} + m_Name: + m_EditorClassIdentifier: + pauseEditorOnPlaybackError: 0 --- !u!1 &7034141691038978701 GameObject: m_ObjectHideFlags: 0 @@ -5739,6 +5797,7 @@ RectTransform: m_Children: - {fileID: 985415874430226196} m_Father: {fileID: 1090041802443136416} + m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -5815,6 +5874,7 @@ RectTransform: - {fileID: 5061430410649258493} - {fileID: 5716806768315515097} m_Father: {fileID: 1090041802443136416} + m_RootOrder: 12 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -5852,6 +5912,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6128659421540762060} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -5988,6 +6049,7 @@ RectTransform: - {fileID: 1276465453068283002} - {fileID: 1092592833771759674} m_Father: {fileID: 7961718474796200068} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -6073,6 +6135,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2065522685927686854} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -6212,6 +6275,7 @@ RectTransform: - {fileID: 8326409972815191664} - {fileID: 2387824098431642500} m_Father: {fileID: 4901750364568730873} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -6343,6 +6407,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2163531068832325664} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -6478,6 +6543,7 @@ RectTransform: m_Children: - {fileID: 1775505273637563011} m_Father: {fileID: 1094668923711103164} + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0.7} @@ -6553,6 +6619,7 @@ RectTransform: - {fileID: 6128659421540762060} - {fileID: 2065522685927686854} m_Father: {fileID: 4901750364568730873} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -6589,6 +6656,7 @@ RectTransform: m_Children: - {fileID: 7980167310545832456} m_Father: {fileID: 4911149214502031902} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -6626,6 +6694,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1452189883864539947} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -6700,6 +6769,7 @@ RectTransform: m_Children: - {fileID: 47554025908246306} m_Father: {fileID: 4334941368482101610} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -6738,6 +6808,7 @@ RectTransform: - {fileID: 6280591337693800581} - {fileID: 5080053995929809686} m_Father: {fileID: 6128659421540762060} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -6835,6 +6906,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6280591337693800581} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -6910,6 +6982,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6033063948165999297} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -7059,6 +7132,7 @@ RectTransform: - {fileID: 5789129086972528656} - {fileID: 6927235806806861544} m_Father: {fileID: 5224021696837641672} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -7103,7 +7177,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 77fc1e88a9b44c159e04099241437fe5, type: 3} m_Name: m_EditorClassIdentifier: - pauseEditorOnPlaybackWarning: 0 --- !u!114 &5122435472915985299 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/src/gg.regression.unity.bots/Runtime/Scripts/RemoteOrchestration/Models/WorkAssignment.cs b/src/gg.regression.unity.bots/Runtime/Scripts/RemoteOrchestration/Models/WorkAssignment.cs index 550043e8..125edd4f 100644 --- a/src/gg.regression.unity.bots/Runtime/Scripts/RemoteOrchestration/Models/WorkAssignment.cs +++ b/src/gg.regression.unity.bots/Runtime/Scripts/RemoteOrchestration/Models/WorkAssignment.cs @@ -91,8 +91,8 @@ public void Update() var activeBotSequence = RGRemoteWorkerBehaviour.GetActiveBotSequence(); if (activeBotSequence == null) { - var playbackController = UnityEngine.Object.FindObjectOfType(); - var lastWarning = playbackController.GetLastSegmentPlaybackWarning(); + var statusManager = UnityEngine.Object.FindObjectOfType(); + var lastWarning = statusManager.LastError(); // ended if (lastWarning != null) { diff --git a/src/gg.regression.unity.bots/Runtime/Scripts/RemoteOrchestration/RGRemoteWorkerAssignmentManager.cs b/src/gg.regression.unity.bots/Runtime/Scripts/RemoteOrchestration/RGRemoteWorkerAssignmentManager.cs index 5f2a5fa0..9e31341c 100644 --- a/src/gg.regression.unity.bots/Runtime/Scripts/RemoteOrchestration/RGRemoteWorkerAssignmentManager.cs +++ b/src/gg.regression.unity.bots/Runtime/Scripts/RemoteOrchestration/RGRemoteWorkerAssignmentManager.cs @@ -304,7 +304,7 @@ public static ActiveSequence GetActiveBotSequence() var controller = FindObjectOfType(); if (controller != null && controller.GetState() != PlayState.NotLoaded) { - if (controller.GetState() == PlayState.Playing || controller.GetState() == PlayState.Starting || (controller.GetState() == PlayState.Stopped && controller.ReplayCompletedSuccessfully() == null && controller.GetLastSegmentPlaybackWarning() == null)) + if (controller.GetState() == PlayState.Playing || controller.GetState() == PlayState.Starting || (controller.GetState() == PlayState.Stopped && controller.ReplayCompletedSuccessfully() == null)) { // a group of segments is playing.. let's see if we can figure out more details or not if (BotSequence.ActiveBotSequence != null) diff --git a/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentPlaybackStatusManager.cs b/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentPlaybackStatusManager.cs new file mode 100644 index 00000000..64fa6d42 --- /dev/null +++ b/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentPlaybackStatusManager.cs @@ -0,0 +1,294 @@ +using System; +using System.Text; +using RegressionGames.StateRecorder.BotSegments.Models; +using RegressionGames.StateRecorder.JsonConverters; +using StateRecorder.BotSegments; +using UnityEngine; +// ReSharper disable InconsistentNaming +// ReSharper disable CheckNamespace +namespace RegressionGames.StateRecorder.BotSegments +{ + + [Serializable] + public class ActiveSequenceInfo : IStringBuilderWriteable + { + public ActiveSequenceInfo(BotSequence botSequence) + { + this.name = botSequence.name; + this.description = botSequence.description; + this.resourcePath = botSequence.resourcePath; + this.segmentCount = botSequence.segments.Count; + } + + public readonly string name; + public readonly string description; + public readonly string resourcePath; + public readonly int segmentCount; + + public void WriteToStringBuilder(StringBuilder stringBuilder) + { + stringBuilder.Append("{\"segmentCount\":"); + IntJsonConverter.WriteToStringBuilder(stringBuilder, segmentCount); + stringBuilder.Append(",\"name\":"); + StringJsonConverter.WriteToStringBuilder(stringBuilder, name); + stringBuilder.Append(",\"description\":"); + StringJsonConverter.WriteToStringBuilder(stringBuilder, description); + stringBuilder.Append(",\"resourcePath\":"); + StringJsonConverter.WriteToStringBuilder(stringBuilder, resourcePath); + stringBuilder.Append("}"); + } + } + + [Serializable] + public class ActiveSegmentInfo : IStringBuilderWriteable + { + public ActiveSegmentInfo(BotSegment botSegment) + { + this.name = botSegment.name; + this.description = botSegment.description; + this.segmentNumber = botSegment.Replay_SegmentNumber; + this.resourcePath = botSegment.resourcePath; + UpdateStatus(botSegment); + } + + public void UpdateStatus(BotSegment botSegment) + { + this.actionStarted = botSegment.Replay_ActionStarted; + this.actionCompleted = botSegment.Replay_ActionCompleted; + this.endCriteriaMatched = botSegment.Replay_Matched; + } + + public readonly string name; + public readonly string description; + public readonly string resourcePath; + + public readonly int segmentNumber; + + public bool actionStarted; + public bool actionCompleted; + public bool endCriteriaMatched; + + public void WriteToStringBuilder(StringBuilder stringBuilder) + { + stringBuilder.Append("{\"segmentNumber\":"); + IntJsonConverter.WriteToStringBuilder(stringBuilder, segmentNumber); + stringBuilder.Append(",\"resourcePath\":"); + StringJsonConverter.WriteToStringBuilder(stringBuilder, resourcePath); + stringBuilder.Append(",\"actionStarted\":"); + BooleanJsonConverter.WriteToStringBuilder(stringBuilder, actionStarted); + stringBuilder.Append(",\"actionCompleted\":"); + BooleanJsonConverter.WriteToStringBuilder(stringBuilder, actionCompleted); + stringBuilder.Append(",\"endCriteriaMatched\":"); + BooleanJsonConverter.WriteToStringBuilder(stringBuilder, endCriteriaMatched); + stringBuilder.Append(",\"name\":"); + StringJsonConverter.WriteToStringBuilder(stringBuilder, name); + stringBuilder.Append(",\"description\":"); + StringJsonConverter.WriteToStringBuilder(stringBuilder, description); + + stringBuilder.Append("}"); + } + } + + [Serializable] + public class BotSegmentPlaybackStatus : IStringBuilderWriteable + { + public ActiveSequenceInfo activeSequence; + public ActiveSegmentInfo activeSegment; + + public string activeSegmentErrorStatus; + public Exception activeSegmentExceptionStatus; + + public ExplorationState explorationState; + + public string explorationErrorStatus; + public Exception explorationExceptionStatus; + + public void WriteToStringBuilder(StringBuilder stringBuilder) + { + stringBuilder.Append("{\"activeSegmentErrorStatus\":"); + StringJsonConverter.WriteToStringBuilder(stringBuilder, activeSegmentErrorStatus); + stringBuilder.Append(",\"explorationState\":"); + StringJsonConverter.WriteToStringBuilder(stringBuilder, explorationState.ToString()); + stringBuilder.Append(",\"explorationErrorStatus\":"); + StringJsonConverter.WriteToStringBuilder(stringBuilder, explorationErrorStatus); + stringBuilder.Append(",\"activeSequence\":"); + activeSequence.WriteToStringBuilder(stringBuilder); + stringBuilder.Append(",\"activeSegment\":"); + activeSegment.WriteToStringBuilder(stringBuilder); + stringBuilder.Append("}"); + } + } + + /** + * Manages the current status of bot sequence / segment playback. + * Also handles updating the on screen status and writing to the log. + */ + public class BotSegmentPlaybackStatusManager : MonoBehaviour + { + public bool pauseEditorOnPlaybackError = false; + + private float _lastTimeErrorClearedOrLogged; + + private string _lastSegmentMessage; + private string _lastExplorationMessage; + private string _lastLoggedMessage; + + // ReSharper disable once InconsistentNaming + private const int ERROR_LOG_WAIT_INTERVAL = 3; // seconds before we log an error.. this is to avoid spamming the log every update + + private readonly BotSegmentPlaybackStatus PlaybackStatus = new(); + + public string LastError() + { + return _lastLoggedMessage; + } + + public void Reset() + { + var now = Time.unscaledTime; + + _lastTimeErrorClearedOrLogged = now; + _lastSegmentMessage = null; + _lastExplorationMessage = null; + _lastLoggedMessage = null; + + PlaybackStatus.activeSequence = null; + PlaybackStatus.activeSegment = null; + + PlaybackStatus.activeSegmentErrorStatus = null; + + PlaybackStatus.explorationState = ExplorationState.STOPPED; + PlaybackStatus.explorationErrorStatus = null; + } + + public void UpdateActiveSequence(BotSequence sequence) + { + PlaybackStatus.activeSequence = sequence == null ? null : new ActiveSequenceInfo(sequence); + } + + /** + * Leaves the current error status unchanged + */ + public void UpdateActiveSegment(BotSegment segment) + { + if (segment == null) + { + PlaybackStatus.activeSegment = null; + } + else + { + if (PlaybackStatus.activeSegment != null && this.PlaybackStatus.activeSegment.segmentNumber == segment.Replay_SegmentNumber && this.PlaybackStatus.activeSegment.resourcePath == segment.resourcePath) + { + // try to avoid allocating/gc one of these on every update + PlaybackStatus.activeSegment.UpdateStatus(segment); + } + else + { + PlaybackStatus.activeSegment = new ActiveSegmentInfo(segment); + } + } + } + + public void UpdateActiveSegmentAndErrorStatus(BotSegment segment, string errorStatus, Exception exceptionStatus = null) + { + UpdateActiveSegment(segment); + PlaybackStatus.activeSegmentErrorStatus = errorStatus; + PlaybackStatus.activeSegmentExceptionStatus = exceptionStatus; + } + + // ReSharper disable once ParameterHidesMember + public void UpdateExplorationStatus(ExplorationState explorationState, string errorStatus, Exception exceptionStatus = null) + { + PlaybackStatus.explorationState = explorationState; + PlaybackStatus.explorationErrorStatus = errorStatus; + PlaybackStatus.explorationExceptionStatus = exceptionStatus; + } + + private void LogPlaybackStatus() + { + var now = Time.unscaledTime; + + var logPrefix = $"({"" + PlaybackStatus.activeSegment?.segmentNumber ?? "?"}) - Bot Segment - "; + // we want to update the UI for every exploration error, but we only want to log every X often to avoid spamming the log + // this should be set anytime the exploration error status is set.. but just in case + if (!string.IsNullOrEmpty(PlaybackStatus.activeSegmentErrorStatus)) + { + _lastSegmentMessage = "Error processing BotAction\n\n" + PlaybackStatus.activeSegmentErrorStatus; + } + else + { + _lastSegmentMessage = null; + } + + var loggedMessage = _lastSegmentMessage; + + + var forceLogOnFirstOrLastExploration = false; + + if (!string.IsNullOrEmpty(PlaybackStatus.explorationErrorStatus)) + { + if (_lastExplorationMessage == null ) + { + forceLogOnFirstOrLastExploration = true; + } + _lastExplorationMessage = PlaybackStatus.explorationErrorStatus; + loggedMessage = "Error processing exploratory BotAction\n\n" + PlaybackStatus.explorationErrorStatus + "\n\n\nPre-Exploration Error - " + _lastSegmentMessage; + } + else + { + if (_lastExplorationMessage != null) + { + forceLogOnFirstOrLastExploration = true; + } + + _lastExplorationMessage = null; + } + + if (loggedMessage == null) + { + // clear ui status instantly once we have no errors + FindObjectOfType()?.SetKeyFrameWarningText(null); + _lastTimeErrorClearedOrLogged = now; + _lastLoggedMessage = null; + } + else + { + // don't be a spammer + if (forceLogOnFirstOrLastExploration || _lastLoggedMessage != logPrefix + loggedMessage) + { + if (forceLogOnFirstOrLastExploration || _lastTimeErrorClearedOrLogged + ERROR_LOG_WAIT_INTERVAL < now) + { + _lastLoggedMessage = logPrefix + loggedMessage; + if (PlaybackStatus.explorationExceptionStatus != null) + { + RGDebug.LogException(PlaybackStatus.explorationExceptionStatus, _lastLoggedMessage); + } + else if (PlaybackStatus.activeSegmentExceptionStatus != null) + { + RGDebug.LogException(PlaybackStatus.activeSegmentExceptionStatus, _lastLoggedMessage); + } + else + { + RGDebug.LogWarning(_lastLoggedMessage); + } + + _lastTimeErrorClearedOrLogged = now; + FindObjectOfType()?.SetKeyFrameWarningText(_lastLoggedMessage); + if (pauseEditorOnPlaybackError) + { + Debug.Break(); + } + } + } + + } + + } + + public void Update() + { + LogPlaybackStatus(); + } + + } +} diff --git a/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentPlaybackStatusManager.cs.meta b/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentPlaybackStatusManager.cs.meta new file mode 100644 index 00000000..4294b4cf --- /dev/null +++ b/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentPlaybackStatusManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f462c11d53b847fda7053d07bb8557da +timeCreated: 1734446595 \ No newline at end of file diff --git a/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentsPlaybackController.cs b/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentsPlaybackController.cs index 98835275..356faa12 100644 --- a/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentsPlaybackController.cs +++ b/src/gg.regression.unity.bots/Runtime/Scripts/StateRecorder/BotSegments/BotSegmentsPlaybackController.cs @@ -32,8 +32,6 @@ public enum PlayState public class BotSegmentsPlaybackController : MonoBehaviour { - public bool pauseEditorOnPlaybackWarning = false; - private BotSegmentsPlaybackContainer _dataPlaybackContainer; //tracks in playback is in progress or paused or starting or stopped @@ -44,8 +42,6 @@ public class BotSegmentsPlaybackController : MonoBehaviour private Action _loopCountCallback; - private string _lastSegmentPlaybackWarning = null; - // We track this as a list instead of a single entry to allow the UI and game object conditions to evaluate separately // We still only unlock the input sequences for a key frame once both UI and game object conditions are met // This is done this way to allow situations like when loading screens (UI) are changing while game objects are loading in the background and the process is not consistent/deterministic between the 2 @@ -68,7 +64,7 @@ private void ProcessBotSegments() { if (_unpaused) { - _lastTimeLoggedKeyFrameConditions = now; + _explorationStartTimer = now; _unpaused = false; } @@ -95,12 +91,15 @@ private void ProcessBotSegments() // track if any segment matched this update var matchedThisUpdate = false; + _botSegmentPlaybackStatusManager.UpdateActiveSequence(BotSequence.ActiveBotSequence); + // track if we have a new segment to evaluate... so long as we do, keep looping here before releasing from this Update call // thus we process each new segment as soon as possible and don't have any artificial one frame delays before processing var nextBotSegmentIndex = 0; while (nextBotSegmentIndex < _nextBotSegments.Count) { var nextBotSegment = _nextBotSegments[nextBotSegmentIndex]; + _botSegmentPlaybackStatusManager.UpdateActiveSegment(nextBotSegment); // if we're working on the first entry in the list is the only time we do actions if (nextBotSegmentIndex == 0) @@ -132,24 +131,22 @@ private void ProcessBotSegments() nextBotSegment.StopAction(transformStatuses, entityStatuses); } - _lastTimeLoggedKeyFrameConditions = now; - FindObjectOfType()?.SetKeyFrameWarningText(null); + _explorationStartTimer = now; + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(nextBotSegment, null); matchedThisUpdate = true; } - // wait ACTION_WARNING_INTERVAL seconds between logging this as some actions take quite a while - if (nextBotSegment.Replay_ActionStarted && !nextBotSegment.Replay_ActionCompleted && _lastTimeLoggedKeyFrameConditions < now - ACTION_WARNING_INTERVAL) + if (nextBotSegment.Replay_ActionStarted && !nextBotSegment.Replay_ActionCompleted) { - _lastTimeLoggedKeyFrameConditions = now; - var loggedMessage = $"({nextBotSegment.Replay_SegmentNumber}) - Bot Segment - Waiting for actions to complete"; - FindObjectOfType()?.SetKeyFrameWarningText(loggedMessage); - RGDebug.LogInfo(loggedMessage); + var loggedMessage = "Waiting for actions to complete"; + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(nextBotSegment, loggedMessage); } } if (nextBotSegment.Replay_Matched && nextBotSegment.Replay_ActionStarted && nextBotSegment.Replay_ActionCompleted) { - _lastTimeLoggedKeyFrameConditions = now; + _explorationStartTimer = now; + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(nextBotSegment, null); RGDebug.LogInfo($"({nextBotSegment.Replay_SegmentNumber}) - Bot Segment - DONE - Criteria Matched && Action Completed - {nextBotSegment.name ?? nextBotSegment.resourcePath} - {nextBotSegment.description}"); //Process the inputs from that bot segment if necessary _nextBotSegments.RemoveAt(nextBotSegmentIndex); @@ -162,14 +159,13 @@ private void ProcessBotSegments() } else { - // only log this every ACTION_WARNING_INTERVAL seconds for the first key frame being evaluated after its actions complete - if (nextBotSegmentIndex == 0 && nextBotSegment.Replay_ActionCompleted && _lastTimeLoggedKeyFrameConditions < now - ACTION_WARNING_INTERVAL) + if (nextBotSegmentIndex == 0 && nextBotSegment.Replay_ActionCompleted) { var warningText = KeyFrameEvaluator.Evaluator.GetUnmatchedCriteria(); if (warningText != null) { - var loggedMessage = $"({nextBotSegment.Replay_SegmentNumber}) - Bot Segment - Unmatched Criteria for \r\n" + warningText; - LogPlaybackWarning(loggedMessage); + var loggedMessage = "Unmatched Criteria for \r\n" + warningText; + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(nextBotSegment, loggedMessage); } } ++nextBotSegmentIndex; @@ -188,8 +184,8 @@ private void ProcessBotSegments() var next = _dataPlaybackContainer.DequeueBotSegment(); if (next != null) { - _lastTimeLoggedKeyFrameConditions = now; - FindObjectOfType()?.SetKeyFrameWarningText(null); + _explorationStartTimer = now; + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(nextBotSegment, null); RGDebug.LogInfo($"({next.Replay_SegmentNumber}) - Bot Segment - Added {(next.HasTransientCriteria ? "" : "Non-")}Transient BotSegment for Evaluation after Transient BotSegment - {next.name ?? next.resourcePath} - {next.description}"); _nextBotSegments.Add(next); //next while loop iteration will get this guy @@ -203,8 +199,8 @@ private void ProcessBotSegments() var next = _dataPlaybackContainer.DequeueBotSegment(); if (next != null) { - _lastTimeLoggedKeyFrameConditions = now; - FindObjectOfType()?.SetKeyFrameWarningText(null); + _explorationStartTimer = now; + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(nextBotSegment, null); RGDebug.LogInfo($"({next.Replay_SegmentNumber}) - Bot Segment - Added {(next.HasTransientCriteria ? "" : "Non-")}Transient BotSegment for Evaluation - {next.name ?? next.resourcePath} - {next.description}"); _nextBotSegments.Add(next); //next while loop iteration will get this guy @@ -220,8 +216,8 @@ private void ProcessBotSegments() } catch (Exception ex) { - var loggedMessage = $"(?) - Bot Segment - Exception processing BotSegments\r\n" + ex.Message; - LogPlaybackWarning(loggedMessage, ex); + var loggedMessage = "Exception processing BotSegments\r\n" + ex.Message; + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(null, loggedMessage, ex); // uncaught exception... stop the segment UnloadSegmentsAndReset(); throw; @@ -290,72 +286,46 @@ private void ProcessBotSegmentAction(BotSegment firstActionSegment, Dictionary()?.SetKeyFrameWarningText(null); + // for every non error action when not exploring, reset the timer + // we don't do it while exploring so that the original message stays here until the segment action fully completes + _explorationStartTimer = now; + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(firstActionSegment, null); } } if (error != null) { // arranges this to build up a status message with real action + exploratory status - // TODO: (REG-2213) Update all this to use a status manager to manage reporting - - string loggedMessage; - - if (firstActionSegment.botAction?.data is IKeyMomentExploration) - { - loggedMessage = $"Error processing BotAction\n\n" + error + "\n\n\nRunning exploratory actions..."; - } - else - { - loggedMessage = $"Error processing BotAction\n\n" + error; - } + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(firstActionSegment, error); - var timeThresholdReached = _lastTimeLoggedKeyFrameConditions < now - ACTION_WARNING_INTERVAL; + var explorationThresholdReached = _explorationStartTimer + EXPLORATION_START_INTERVAL < now; - // wait the action warning interval before starting to explore actions - if (timeThresholdReached) - { - // log this before we start exploring so we can see why it started exploring - LogPlaybackWarning(logPrefix + loggedMessage); - } - - if (firstActionSegment.botAction?.data is IKeyMomentExploration && (_explorationDriver.ExplorationState == ExplorationState.PAUSED || timeThresholdReached)) + // we either reached the threshold to start exploring, or already are ping ponging between exploration and real actions + if (firstActionSegment.botAction?.data is IKeyMomentExploration && (_explorationDriver.ExplorationState == ExplorationState.PAUSED || explorationThresholdReached)) { _explorationDriver.StartExploring(); } - string explorationError = null; - if (firstActionSegment.botAction?.data is IKeyMomentExploration keyMomentExploration) + if (firstActionSegment.botAction?.data is IKeyMomentExploration keyMomentExploration && _explorationDriver.ExplorationState == ExplorationState.EXPLORING) { - _explorationDriver.PerformExploratoryAction(firstActionSegment.Replay_SegmentNumber, transformStatuses, entityStatuses, out explorationError); + _explorationDriver.PerformExploratoryAction(firstActionSegment.Replay_SegmentNumber, transformStatuses, entityStatuses, out var explorationError); + _botSegmentPlaybackStatusManager.UpdateExplorationStatus(ExplorationState.EXPLORING, explorationError); // we just interfered mid action.. reset this thing to try again keyMomentExploration.KeyMomentExplorationReset(); } - - if (explorationError != null) - { - // put this on top to minimize screen flicker - loggedMessage = $"Error processing exploratory BotAction\n\n" + explorationError +"\n\n\nPre-Exploration Error - " + loggedMessage; - LogPlaybackWarning(logPrefix + loggedMessage); - } - else if (_explorationDriver.ExplorationState != ExplorationState.STOPPED || timeThresholdReached) - { - // forcefully keep the message up there while exploring so it doesn't clear the screen for long intervals - LogPlaybackWarning(logPrefix + loggedMessage); - } } } if (firstActionSegment.botAction?.IsCompleted == true && firstActionSegment.botAction?.data is IKeyMomentExploration) { // for every non error action, reset the timer - _lastTimeLoggedKeyFrameConditions = now; - FindObjectOfType()?.SetKeyFrameWarningText(null); + _explorationStartTimer = now; + _botSegmentPlaybackStatusManager.UpdateActiveSegmentAndErrorStatus(firstActionSegment, null); + _botSegmentPlaybackStatusManager.UpdateExplorationStatus(ExplorationState.STOPPED, null); _explorationDriver.StopExploring(firstActionSegment.Replay_SegmentNumber); _explorationDriver.ReportPreviouslyCompletedAction(firstActionSegment.botAction.data); } @@ -363,8 +333,8 @@ private void ProcessBotSegmentAction(BotSegment firstActionSegment, Dictionary(); + KeyboardEventSender.Initialize(); SceneManager.sceneLoaded += OnSceneLoad; SceneManager.sceneUnloaded += OnSceneUnload; @@ -471,6 +444,7 @@ void OnSceneUnload(Scene s) void OnEnable() { _screenRecorder = GetComponentInParent(); + _botSegmentPlaybackStatusManager = GetComponentInParent(); } private bool _unpaused; @@ -498,9 +472,9 @@ public void SetDataContainer(BotSegmentsPlaybackContainer dataPlaybackContainer) { UnloadSegmentsAndReset(); _replaySuccessful = null; - _lastSegmentPlaybackWarning = null; MouseEventSender.Reset(); + _botSegmentPlaybackStatusManager.Reset(); _dataPlaybackContainer = dataPlaybackContainer; if (_dataPlaybackContainer != null) @@ -560,7 +534,7 @@ public void Play() _replaySuccessful = null; _playState = PlayState.Starting; _loopCount = -1; - _lastTimeLoggedKeyFrameConditions = Time.unscaledTime; + _explorationStartTimer = Time.unscaledTime; } else if (_playState == PlayState.Paused) { @@ -636,7 +610,7 @@ public void Stop() _loopCount = -1; _replaySuccessful = null; WaitingForKeyFrameConditions = null; - _lastSegmentPlaybackWarning = null; + _botSegmentPlaybackStatusManager.Reset(); _screenRecorder.StopRecording(); #if ENABLE_LEGACY_INPUT_MANAGER @@ -667,7 +641,7 @@ public void PrepareForNextLoop() // don't change _loopCount _replaySuccessful = null; WaitingForKeyFrameConditions = null; - _lastSegmentPlaybackWarning = null; + _botSegmentPlaybackStatusManager.Reset(); #if ENABLE_LEGACY_INPUT_MANAGER RGLegacyInputWrapper.StopSimulation(); @@ -695,11 +669,6 @@ public PlayState GetState() return _playState; } - public string GetLastSegmentPlaybackWarning() - { - return _lastSegmentPlaybackWarning; - } - public void Update() { if (_dataPlaybackContainer != null) @@ -737,34 +706,10 @@ public void Update() } } - private float _lastTimeLoggedKeyFrameConditions = 0; + private float _explorationStartTimer = 0; // ReSharper disable once InconsistentNaming - private const int ACTION_WARNING_INTERVAL = 3; // seconds before we log or start exploring other bot actions - - private void LogPlaybackWarning(string loggedMessage, Exception ex = null) - { - var now = Time.unscaledTime; - _lastTimeLoggedKeyFrameConditions = now; - // avoid spamming the log - if (loggedMessage != _lastSegmentPlaybackWarning) - { - _lastSegmentPlaybackWarning = loggedMessage; - if (ex != null) - { - RGDebug.LogException(ex, loggedMessage); - } - else - { - RGDebug.LogWarning(loggedMessage); - } - } - FindObjectOfType()?.SetKeyFrameWarningText(loggedMessage); - if (pauseEditorOnPlaybackWarning) - { - Debug.Break(); - } - } + private const int EXPLORATION_START_INTERVAL = 3; // seconds before we log or start exploring other bot actions public void OnGUI() { diff --git a/src/gg.regression.unity.bots/Tests/TestFramework/Scripts/RGTestUtils.cs b/src/gg.regression.unity.bots/Tests/TestFramework/Scripts/RGTestUtils.cs index 807d4ac5..3e967b43 100644 --- a/src/gg.regression.unity.bots/Tests/TestFramework/Scripts/RGTestUtils.cs +++ b/src/gg.regression.unity.bots/Tests/TestFramework/Scripts/RGTestUtils.cs @@ -85,6 +85,7 @@ public static IEnumerator StartPlaybackFromZipFile(string recordingPath, Action< { RGDebug.LogInfo("Loading and starting playback recording from " + recordingPath); var playbackController = Object.FindObjectOfType(); + var statusManager = Object.FindObjectOfType(); var botSegments = BotSegmentZipParser.ParseBotSegmentZipFromSystemPath(recordingPath, out var sessionId); var replayData = new BotSegmentsPlaybackContainer(botSegments, sessionId); playbackController.SetDataContainer(replayData); @@ -111,7 +112,7 @@ public static IEnumerator StartPlaybackFromZipFile(string recordingPath, Action< { saveLocation = playbackController.SaveLocation() + ".zip", success = !didTimeout, - statusMessage = didTimeout?playbackController.GetLastSegmentPlaybackWarning():null + statusMessage = didTimeout?statusManager.LastError():null }; setPlaybackResult(result); playbackController.Stop(); @@ -129,6 +130,7 @@ public static IEnumerator StartPlaybackFromDirectory(string recordingPath, Actio { RGDebug.LogInfo("Loading and starting playback recording from " + recordingPath); var playbackController = Object.FindObjectOfType(); + var statusManager = Object.FindObjectOfType(); var botSegments = BotSegmentDirectoryParser.ParseBotSegmentSystemDirectory(recordingPath, out var sessionId); var replayData = new BotSegmentsPlaybackContainer(botSegments, sessionId); playbackController.SetDataContainer(replayData); @@ -155,7 +157,7 @@ public static IEnumerator StartPlaybackFromDirectory(string recordingPath, Actio { saveLocation = playbackController.SaveLocation() + ".zip", success = !didTimeout, - statusMessage = didTimeout?playbackController.GetLastSegmentPlaybackWarning():null + statusMessage = didTimeout?statusManager.LastError():null }; setPlaybackResult(result); playbackController.Stop(); @@ -313,6 +315,7 @@ public static IEnumerator StartBotSegment(BotSegment botSegment, Action(); + var statusManager = Object.FindObjectOfType(); playbackController.SetDataContainer(new BotSegmentsPlaybackContainer(new[] { botSegment })); @@ -339,7 +342,7 @@ public static IEnumerator StartBotSegment(BotSegment botSegment, Action(); + var statusManager = Object.FindObjectOfType(); playbackController.SetDataContainer(new BotSegmentsPlaybackContainer(botSegmentList.segments)); @@ -384,7 +388,7 @@ public static IEnumerator StartBotSegmentList(BotSegmentList botSegmentList, Act { saveLocation = playbackController.SaveLocation() + ".zip", success = !didTimeout, - statusMessage = didTimeout?playbackController.GetLastSegmentPlaybackWarning():null + statusMessage = didTimeout?statusManager.LastError():null }; setPlaybackResult(result); playbackController.Stop(); @@ -432,6 +436,7 @@ public static IEnumerator StartBotSequence(BotSequence botSequence, Action(); + var statusManager = Object.FindObjectOfType(); yield return null; // Allow the recording to start playing var didTimeout = false; @@ -454,7 +459,7 @@ public static IEnumerator StartBotSequence(BotSequence botSequence, Action