From bce18944b7c7cabc289c0640cb2d55269631b81e Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 7 Feb 2021 22:06:36 +0100 Subject: [PATCH 1/2] debug: Add profiler markers to collider allocation. --- .../Physics/Collider/CircleCollider.cs | 5 +++++ .../Physics/Collider/Line3DCollider.cs | 5 +++++ .../Physics/Collider/LineCollider.cs | 5 +++++ .../Physics/Collider/LineSlingshotCollider.cs | 5 +++++ .../Physics/Collider/LineZCollider.cs | 5 +++++ .../Physics/Collider/PlaneCollider.cs | 5 +++++ .../Physics/Collider/PointCollider.cs | 5 +++++ .../Physics/Collider/TriangleCollider.cs | 5 +++++ .../Collision/QuadTreeCreationSystem.cs | 20 +++++++++++++++++++ .../VPT/Flipper/FlipperCollider.cs | 5 +++++ .../VPT/Gate/GateCollider.cs | 5 +++++ .../VPT/Plunger/PlungerCollider.cs | 5 +++++ .../VPT/Spinner/SpinnerCollider.cs | 5 +++++ 13 files changed, 80 insertions(+) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/CircleCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/CircleCollider.cs index 27c542886..e68a281e4 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/CircleCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/CircleCollider.cs @@ -17,6 +17,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Common; using VisualPinball.Engine.Physics; using VisualPinball.Engine.VPT; @@ -36,11 +37,15 @@ internal struct CircleCollider public ColliderType Type => _header.Type; public Entity Entity => _header.Entity; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("CircleCollider.Create"); + public static void Create(BlobBuilder builder, HitCircle src, ref BlobPtr dest, ColliderType type = ColliderType.Circle) { + PerfMarker.Begin(); ref var ptr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref ptr); collider.Init(src, type); + PerfMarker.End(); } public static CircleCollider Create(HitCircle src, ColliderType type = ColliderType.Circle) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/Line3DCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/Line3DCollider.cs index 84345d543..32cb3c2e0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/Line3DCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/Line3DCollider.cs @@ -18,6 +18,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Physics; namespace VisualPinball.Unity @@ -31,11 +32,15 @@ internal struct Line3DCollider private float _zHigh; private float3x3 _matrix; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("Line3DCollider.Create"); + public static void Create(BlobBuilder builder, HitLine3D src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var linePtr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref linePtr); collider.Init(src); + PerfMarker.End(); } private void Init(HitLine3D src) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineCollider.cs index e5c20300e..c09469863 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineCollider.cs @@ -18,6 +18,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Common; using VisualPinball.Engine.Physics; using VisualPinball.Engine.VPT; @@ -42,11 +43,15 @@ internal struct LineCollider public float V1y { set => _v1.y = value; } public float V2y { set => _v2.y = value; } + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("LineCollider.Create"); + public static void Create(BlobBuilder builder, LineSeg src, ref BlobPtr dest, ColliderType type = ColliderType.Line) { + PerfMarker.Begin(); ref var linePtr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref linePtr); collider.Init(src, type); + PerfMarker.End(); } public static LineCollider Create(LineSeg src, ColliderType type = ColliderType.Line) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineSlingshotCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineSlingshotCollider.cs index 69ce877b2..050be0e26 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineSlingshotCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineSlingshotCollider.cs @@ -18,6 +18,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Game; using VisualPinball.Engine.Physics; @@ -37,11 +38,15 @@ internal struct LineSlingshotCollider public ColliderType Type => _header.Type; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("LineSlingshotCollider.Create"); + public static void Create(BlobBuilder builder, LineSegSlingshot src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var linePtr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref linePtr); collider.Init(src); + PerfMarker.End(); } private void Init(LineSegSlingshot src) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineZCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineZCollider.cs index d032d6dc6..b75b4c0e0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineZCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/LineZCollider.cs @@ -18,6 +18,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Common; using VisualPinball.Engine.Physics; @@ -33,11 +34,15 @@ internal struct LineZCollider public float XyY { set => _xy.y = value; } + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("LineZCollider.Create"); + public static void Create(BlobBuilder builder, HitLineZ src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var linePtr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref linePtr); collider.Init(src); + PerfMarker.End(); } public static LineZCollider Create(HitLineZ src) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/PlaneCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/PlaneCollider.cs index 19458a7b2..8f20d1b14 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/PlaneCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/PlaneCollider.cs @@ -17,6 +17,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Common; using VisualPinball.Engine.Physics; @@ -31,11 +32,15 @@ internal struct PlaneCollider public ColliderType Type => _header.Type; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("PlaneCollider.Create"); + public static void Create(BlobBuilder builder, HitPlane src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var ptr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref ptr); collider.Init(src); + PerfMarker.End(); } private void Init(HitPlane src) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/PointCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/PointCollider.cs index 958dcc91e..6df821374 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/PointCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/PointCollider.cs @@ -18,6 +18,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Common; using VisualPinball.Engine.Physics; @@ -31,11 +32,15 @@ internal struct PointCollider public ColliderType Type => _header.Type; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("PointCollider.Create"); + public static void Create(BlobBuilder builder, HitPoint src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var colliderPtr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref colliderPtr); collider.Init(src); + PerfMarker.End(); } private void Init(HitPoint src) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/TriangleCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/TriangleCollider.cs index dd0e20797..86643180c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/TriangleCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collider/TriangleCollider.cs @@ -18,6 +18,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Common; using VisualPinball.Engine.Physics; using VisualPinball.Engine.VPT; @@ -37,11 +38,15 @@ internal struct TriangleCollider public float3 Normal() => _normal; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("TriangleCollider.Create"); + public static void Create(BlobBuilder builder, HitTriangle src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var trianglePtr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref trianglePtr); collider.Init(src); + PerfMarker.End(); } private void Init(HitTriangle src) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/QuadTreeCreationSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/QuadTreeCreationSystem.cs index bb431bc54..c62ba32a6 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/QuadTreeCreationSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/QuadTreeCreationSystem.cs @@ -19,6 +19,7 @@ using System.Linq; using NLog; using Unity.Entities; +using Unity.Profiling; using UnityEngine; using VisualPinball.Engine.Physics; using Logger = NLog.Logger; @@ -29,17 +30,28 @@ internal static class QuadTreeCreationSystem { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private static readonly ProfilerMarker PerfMarkerTotal = new ProfilerMarker("QuadTreeCreationSystem"); + private static readonly ProfilerMarker PerfMarkerInitItems = new ProfilerMarker("QuadTreeCreationSystem (1 - init items)"); + private static readonly ProfilerMarker PerfMarkerGenerateColliders = new ProfilerMarker("QuadTreeCreationSystem (2 - generate colliders)"); + private static readonly ProfilerMarker PerfMarkerCreateQuadTree = new ProfilerMarker("QuadTreeCreationSystem (3 - create quad tree)"); + private static readonly ProfilerMarker PerfMarkerAllocate = new ProfilerMarker("QuadTreeCreationSystem (4 - allocate)"); + private static readonly ProfilerMarker PerfMarkerSaveToEntity = new ProfilerMarker("QuadTreeCreationSystem (5 - save to entity)"); + public static void Create(EntityManager entityManager) { + PerfMarkerTotal.Begin(); var table = Object.FindObjectOfType().Table; var stopWatch = new Stopwatch(); stopWatch.Start(); + PerfMarkerInitItems.Begin(); foreach (var playable in table.Playables) { playable.Init(table); } + PerfMarkerInitItems.End(); // index hittables + PerfMarkerGenerateColliders.Begin(); var hittables = table.Hittables.Where(hittable => hittable.IsCollidable).ToArray(); var hitObjects = new List(); var id = 0; @@ -59,16 +71,20 @@ public static void Create(EntityManager entityManager) } stopWatch.Stop(); Logger.Info("Collider Count:\n" + log + "\nTotal: " + c + " colliders in " + stopWatch.ElapsedMilliseconds + "ms"); + PerfMarkerGenerateColliders.End(); // construct quad tree + PerfMarkerCreateQuadTree.Begin(); var quadTree = new Engine.Physics.QuadTree(hitObjects, table.BoundingBox); var quadTreeBlobAssetRef = QuadTreeBlob.CreateBlobAssetReference( quadTree, table.GeneratePlayfieldHit(), // todo use `null` if separate playfield mesh exists table.GenerateGlassHit() ); + PerfMarkerCreateQuadTree.End(); // playfield and glass need special treatment, since not part of the quad tree + PerfMarkerAllocate.Begin(); var playfieldHitObject = table.GeneratePlayfieldHit(); var glassHitObject = table.GenerateGlassHit(); playfieldHitObject.Id = id++; @@ -78,14 +94,18 @@ public static void Create(EntityManager entityManager) // construct collider blob var colliderBlob = ColliderBlob.CreateBlobAssetReference(hitObjects, playfieldHitObject.Id, glassHitObject.Id); + PerfMarkerAllocate.End(); // save it to entity + PerfMarkerSaveToEntity.Begin(); var collEntity = entityManager.CreateEntity(ComponentType.ReadOnly(), ComponentType.ReadOnly()); //DstEntityManager.SetName(collEntity, "Collision Data Holder"); entityManager.SetComponentData(collEntity, new QuadTreeData { Value = quadTreeBlobAssetRef }); entityManager.SetComponentData(collEntity, new ColliderData { Value = colliderBlob }); + PerfMarkerSaveToEntity.End(); Logger.Info("Static QuadTree initialized."); + PerfMarkerTotal.End(); } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index 3701021ac..bbd245435 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -18,6 +18,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Common; using VisualPinball.Engine.Game; using VisualPinball.Engine.VPT.Flipper; @@ -34,11 +35,15 @@ internal struct FlipperCollider public ColliderType Type => _header.Type; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("FlipperCollider.Create"); + public static void Create(BlobBuilder builder, FlipperHit src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var ptr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref ptr); collider.Init(src); + PerfMarker.End(); } private void Init(FlipperHit src) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateCollider.cs index abf3ab8ba..2b1bef815 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateCollider.cs @@ -18,6 +18,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.VPT.Gate; namespace VisualPinball.Unity @@ -31,11 +32,15 @@ internal struct GateCollider public ColliderType Type => _header.Type; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("GateCollider.Create"); + public static void Create(BlobBuilder builder, GateHit src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var ptr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref ptr); collider.Init(src); + PerfMarker.End(); } private void Init(GateHit src) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerCollider.cs index b266117c4..3ff069fa5 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerCollider.cs @@ -17,6 +17,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.Common; using VisualPinball.Engine.VPT.Plunger; @@ -32,11 +33,15 @@ internal struct PlungerCollider public ColliderType Type => ColliderType.Plunger; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("PlungerCollider.Create"); + public static void Create(BlobBuilder builder, PlungerHit src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var ptr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref ptr); collider.Init(src); + PerfMarker.End(); } private void Init(PlungerHit src) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerCollider.cs index 09873234a..2d2034920 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerCollider.cs @@ -17,6 +17,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; +using Unity.Profiling; using VisualPinball.Engine.VPT.Spinner; namespace VisualPinball.Unity @@ -30,11 +31,15 @@ internal struct SpinnerCollider public ColliderType Type => _header.Type; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("SpinnerCollider.Create"); + public static void Create(BlobBuilder builder, SpinnerHit src, ref BlobPtr dest) { + PerfMarker.Begin(); ref var ptr = ref UnsafeUtility.As, BlobPtr>(ref dest); ref var collider = ref builder.Allocate(ref ptr); collider.Init(src); + PerfMarker.End(); } private void Init(SpinnerHit src) From 9654530aafca03f28f4efb321903de3229e00f9f Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 11 Feb 2021 00:10:44 +0100 Subject: [PATCH 2/2] player: Add slow-motion feature. --- VisualPinball.Engine/Common/Constants.cs | 2 + .../VisualPinball.Unity/Game/Player.cs | 47 +++++++++++++++++++ .../VisualPinball.Unity/Input/InputManager.cs | 2 + 3 files changed, 51 insertions(+) diff --git a/VisualPinball.Engine/Common/Constants.cs b/VisualPinball.Engine/Common/Constants.cs index 09680f76f..132239791 100644 --- a/VisualPinball.Engine/Common/Constants.cs +++ b/VisualPinball.Engine/Common/Constants.cs @@ -124,6 +124,8 @@ public static class InputConstants public const string ActionCreateBall = "Create Ball"; public const string ActionKicker = "Kicker"; + public const string ActionSlowMotion = "Slow Motion"; + public const string ActionTimeLapse = "Time Lapse"; public const string ActionUpperLeftFlipper = "Upper Left Flipper"; public const string ActionUpperRightFlipper = "Upper Right Flipper"; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs index 14e3b8345..fe92ee76c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs @@ -16,6 +16,7 @@ using System; using System.Collections.Generic; +using NLog; using Unity.Entities; using Unity.Mathematics; using UnityEngine; @@ -37,6 +38,7 @@ using VisualPinball.Engine.VPT.Trigger; using VisualPinball.Engine.VPT.Trough; using Light = VisualPinball.Engine.VPT.Light.Light; +using Logger = NLog.Logger; namespace VisualPinball.Unity { @@ -74,6 +76,11 @@ public class Player : MonoBehaviour [NonSerialized] private readonly WirePlayer _wirePlayer = new WirePlayer(); [NonSerialized] private readonly List<(InputAction, Action)> _actions = new List<(InputAction, Action)>(); + private const float SlowMotionMax = 0.1f; + private const float TimeLapseMax = 2.5f; + + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + public Player() { TableApi = new TableApi(this); @@ -101,6 +108,7 @@ private void Awake() Table = tableComponent.CreateTable(tableComponent.Data); BallManager = new BallManager(Table, TableToWorld); _inputManager = new InputManager(); + _inputManager.Enable(HandleInput); if (engineComponent != null) { GamelogicEngine = engineComponent; @@ -139,6 +147,7 @@ private void OnDestroy() i.OnDestroy(); } + _inputManager.Disable(HandleInput); _coilPlayer.OnDestroy(); _switchPlayer.OnDestroy(); _lampPlayer.OnDestroy(); @@ -356,6 +365,44 @@ public void OnEvent(in EventData eventData) #endregion + private static void HandleInput(object obj, InputActionChange change) + { + if (obj is InputAction action && action.actionMap.name == InputConstants.MapDebug) { + var value = action.ReadValue(); + switch (action.name) { + case InputConstants.ActionSlowMotion: { + switch (change) { + case InputActionChange.ActionPerformed when value > 0.1: + Time.timeScale = math.lerp(1f, SlowMotionMax, value); + break; + case InputActionChange.ActionPerformed: + Time.timeScale = 1; + break; + case InputActionChange.ActionStarted: + Time.timeScale = SlowMotionMax; + break; + case InputActionChange.ActionCanceled: + Time.timeScale = 1; + break; + } + Logger.Info("Timescale = " + Time.timeScale); + break; + } + case InputConstants.ActionTimeLapse: { + if (change == InputActionChange.ActionPerformed) { + if (value > 0.1) { + Time.timeScale = math.lerp(1f, TimeLapseMax, value); + } else { + Time.timeScale = 1; + } + } + Logger.Info("Timescale = " + Time.timeScale); + break; + } + } + } + } + public float3 GetGravity() { var slope = Table.Data.AngleTiltMin + (Table.Data.AngleTiltMax - Table.Data.AngleTiltMin) * Table.Data.GlobalDifficulty; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Input/InputManager.cs b/VisualPinball.Unity/VisualPinball.Unity/Input/InputManager.cs index e24be1417..5232e2c84 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Input/InputManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Input/InputManager.cs @@ -152,6 +152,8 @@ public static InputActionAsset GetDefaultInputActionAsset() map = new InputActionMap(InputConstants.MapDebug); map.AddAction(InputConstants.ActionCreateBall, InputActionType.Button, "/b"); map.AddAction(InputConstants.ActionKicker, InputActionType.Button, "/n"); + map.AddAction(InputConstants.ActionSlowMotion, InputActionType.Button, "/s").AddBinding("/leftStick/down"); + map.AddAction(InputConstants.ActionTimeLapse, InputActionType.Button, "/leftStick/up"); asset.AddActionMap(map);