diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 952cd82e5..83307878d 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -63,7 +63,7 @@ jobs:
- uses: game-ci/unity-test-runner@main
id: test
with:
- unityVersion: '2021.2.2f1'
+ unityVersion: '2021.2.3f1'
projectPath: VisualPinball.Unity/VisualPinball.Unity.Test/TestProject~
artifactsPath: VisualPinball.Unity/VisualPinball.Unity.Test/TestProject~/artifacts
testMode: all
diff --git a/VisualPinball.Engine.Test/VisualPinball.Engine.Test.csproj b/VisualPinball.Engine.Test/VisualPinball.Engine.Test.csproj
index 44d658923..c06fdcef7 100644
--- a/VisualPinball.Engine.Test/VisualPinball.Engine.Test.csproj
+++ b/VisualPinball.Engine.Test/VisualPinball.Engine.Test.csproj
@@ -10,7 +10,7 @@
0.1.0.0
0.1.0.0
0.1.0.0
- 8
+ 9.0
false
@@ -31,7 +31,7 @@
-
+
@@ -40,7 +40,7 @@
- $(NuGetPackageRoot)\fluentassertions\5.10.3\lib\net47\FluentAssertions.dll
+ $(NuGetPackageRoot)\fluentassertions\6.2.0\lib\netstandard2.1\FluentAssertions.dll
diff --git a/VisualPinball.Engine/VisualPinball.Engine.csproj b/VisualPinball.Engine/VisualPinball.Engine.csproj
index 549155bf2..a3956fc81 100644
--- a/VisualPinball.Engine/VisualPinball.Engine.csproj
+++ b/VisualPinball.Engine/VisualPinball.Engine.csproj
@@ -10,7 +10,7 @@
0.1.0.0
0.1.0.0
0.1.0.0
- 8
+ 9.0
false
https://visualpinball.org
https://user-images.githubusercontent.com/70426/101756172-0965a200-3ad6-11eb-8c71-edb751f0f5d5.png
diff --git a/VisualPinball.Resources/VisualPinball.Resources.csproj b/VisualPinball.Resources/VisualPinball.Resources.csproj
index be9cc57ba..bad18b0b4 100644
--- a/VisualPinball.Resources/VisualPinball.Resources.csproj
+++ b/VisualPinball.Resources/VisualPinball.Resources.csproj
@@ -8,7 +8,7 @@
0.1.0.0
0.1.0.0
0.1.0.0
- 8
+ 9.0
false
https://visualpinball.org
https://user-images.githubusercontent.com/70426/101756172-0965a200-3ad6-11eb-8c71-edb751f0f5d5.png
diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switch-inspector.png b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switch-inspector.png
new file mode 100644
index 000000000..974bc0872
Binary files /dev/null and b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switch-inspector.png differ
diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switch-switch-manager.png b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switch-switch-manager.png
new file mode 100644
index 000000000..67c24e9c4
Binary files /dev/null and b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switch-switch-manager.png differ
diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switches.md b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switches.md
index 4de6fc1ac..d0483bd09 100644
--- a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switches.md
+++ b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/collision-switches.md
@@ -6,15 +6,19 @@ description: VPE supports collisions switches, which turn hittable game objects
# Collision Switches
-A Collision Switch turns a hittable game object into a switch device. Example's of hittable game objects are Walls, Rubbers, and Primitives.
+A Collision Switch turns a hittable game object into a switch device. Examples of hittable game objects are walls, rubbers, and primitives.
## Setup
To create a Collision Switch:
-- Add the Collision Switch directly to a hittable game object. Select the game object you want to add it to, click on *Add Component* in the inspector and select *Visual Pinball -> Mechs -> Collision Switch*.
+- Add the collision switch directly to a hittable game object. Select the game object you want to add it to, click on *Add Component* in the inspector and select *Visual Pinball -> Mechs -> Collision Switch*.
-To associate the collision switch with a game logic engine switch, use the [Switch Manager](xref:switch_manager) and select the switch in the *Element* column.
+
+
+To associate the collision switch with a game logic engine switch, use the [Switch Manager](xref:switch_manager) and select the switch in the *Element* column:
+
+
## Runtime
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.Burst.dll b/VisualPinball.Unity/Plugins/.unity/Unity.Burst.dll
index 1a779e1ed..87df334b8 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.Burst.dll and b/VisualPinball.Unity/Plugins/.unity/Unity.Burst.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.Collections.dll b/VisualPinball.Unity/Plugins/.unity/Unity.Collections.dll
index b3cdd4624..d6abe886a 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.Collections.dll and b/VisualPinball.Unity/Plugins/.unity/Unity.Collections.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.Entities.Hybrid.dll b/VisualPinball.Unity/Plugins/.unity/Unity.Entities.Hybrid.dll
index 296811c86..4a58d193e 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.Entities.Hybrid.dll and b/VisualPinball.Unity/Plugins/.unity/Unity.Entities.Hybrid.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.Entities.dll b/VisualPinball.Unity/Plugins/.unity/Unity.Entities.dll
index f807c74d8..a8ec7557f 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.Entities.dll and b/VisualPinball.Unity/Plugins/.unity/Unity.Entities.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.InputSystem.dll b/VisualPinball.Unity/Plugins/.unity/Unity.InputSystem.dll
index 585478b23..32bfde3d8 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.InputSystem.dll and b/VisualPinball.Unity/Plugins/.unity/Unity.InputSystem.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.Extensions.Hybrid.dll b/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.Extensions.Hybrid.dll
deleted file mode 100644
index b4495c647..000000000
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.Extensions.Hybrid.dll and /dev/null differ
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.Extensions.dll b/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.Extensions.dll
index f90943ef6..8b35f3b15 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.Extensions.dll and b/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.Extensions.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.dll b/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.dll
index 1250610b9..8aeccf0dc 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.dll and b/VisualPinball.Unity/Plugins/.unity/Unity.Mathematics.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.Rendering.Hybrid.dll b/VisualPinball.Unity/Plugins/.unity/Unity.Rendering.Hybrid.dll
deleted file mode 100644
index 4b9b73c75..000000000
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.Rendering.Hybrid.dll and /dev/null differ
diff --git a/VisualPinball.Unity/Plugins/.unity/Unity.Transforms.dll b/VisualPinball.Unity/Plugins/.unity/Unity.Transforms.dll
index d8a75abce..74d6b81ce 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/Unity.Transforms.dll and b/VisualPinball.Unity/Plugins/.unity/Unity.Transforms.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEditor.CoreModule.dll b/VisualPinball.Unity/Plugins/.unity/UnityEditor.CoreModule.dll
new file mode 100644
index 000000000..447e977a6
Binary files /dev/null and b/VisualPinball.Unity/Plugins/.unity/UnityEditor.CoreModule.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEditor.dll b/VisualPinball.Unity/Plugins/.unity/UnityEditor.dll
index 5c230563f..45a5f08d3 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/UnityEditor.dll and b/VisualPinball.Unity/Plugins/.unity/UnityEditor.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEngine.AudioModule.dll b/VisualPinball.Unity/Plugins/.unity/UnityEngine.AudioModule.dll
index fb58a68b5..b61ed1c2f 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/UnityEngine.AudioModule.dll and b/VisualPinball.Unity/Plugins/.unity/UnityEngine.AudioModule.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEngine.CoreModule.dll b/VisualPinball.Unity/Plugins/.unity/UnityEngine.CoreModule.dll
index c6cba729d..2a6a8f14c 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/UnityEngine.CoreModule.dll and b/VisualPinball.Unity/Plugins/.unity/UnityEngine.CoreModule.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEngine.IMGUIModule.dll b/VisualPinball.Unity/Plugins/.unity/UnityEngine.IMGUIModule.dll
index f11b10141..8e66595cf 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/UnityEngine.IMGUIModule.dll and b/VisualPinball.Unity/Plugins/.unity/UnityEngine.IMGUIModule.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEngine.ImageConversionModule.dll b/VisualPinball.Unity/Plugins/.unity/UnityEngine.ImageConversionModule.dll
index 014be9309..a71ec3388 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/UnityEngine.ImageConversionModule.dll and b/VisualPinball.Unity/Plugins/.unity/UnityEngine.ImageConversionModule.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEngine.InputLegacyModule.dll b/VisualPinball.Unity/Plugins/.unity/UnityEngine.InputLegacyModule.dll
new file mode 100644
index 000000000..139db53b8
Binary files /dev/null and b/VisualPinball.Unity/Plugins/.unity/UnityEngine.InputLegacyModule.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEngine.TextRenderingModule.dll b/VisualPinball.Unity/Plugins/.unity/UnityEngine.TextRenderingModule.dll
index f9a25e2a9..ed966bda6 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/UnityEngine.TextRenderingModule.dll and b/VisualPinball.Unity/Plugins/.unity/UnityEngine.TextRenderingModule.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEngine.UIElementsModule.dll b/VisualPinball.Unity/Plugins/.unity/UnityEngine.UIElementsModule.dll
index 5a71163bb..8bfa3ff97 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/UnityEngine.UIElementsModule.dll and b/VisualPinball.Unity/Plugins/.unity/UnityEngine.UIElementsModule.dll differ
diff --git a/VisualPinball.Unity/Plugins/.unity/UnityEngine.dll b/VisualPinball.Unity/Plugins/.unity/UnityEngine.dll
index 9d8c08a7f..233f215a4 100644
Binary files a/VisualPinball.Unity/Plugins/.unity/UnityEngine.dll and b/VisualPinball.Unity/Plugins/.unity/UnityEngine.dll differ
diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/CollisionSwitchInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/CollisionSwitchInspector.cs
new file mode 100644
index 000000000..2bba20950
--- /dev/null
+++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/CollisionSwitchInspector.cs
@@ -0,0 +1,65 @@
+// Visual Pinball Engine
+// Copyright (C) 2021 freezy and VPE Team
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+// ReSharper disable AssignmentInConditionalExpression
+
+using UnityEditor;
+using UnityEngine;
+
+namespace VisualPinball.Unity.Editor
+{
+ [CustomEditor(typeof(CollisionSwitchComponent)), CanEditMultipleObjects]
+ public class CollisionSwitchInspector : ItemInspector
+ {
+ protected override MonoBehaviour UndoTarget => target as MonoBehaviour;
+
+ public override void OnInspectorGUI()
+ {
+ base.OnInspectorGUI();
+
+ if (Application.isPlaying) {
+ var tableApi = TableComponent.GetComponent().TableApi;
+ var switchApi = tableApi.Switchable((MonoBehaviour)target);
+
+ if (switchApi is CollisionSwitchApi { IsHittable: true }) {
+ DrawSwitch($"Collision switch exposed as {target.name}.", switchApi.IsSwitchEnabled);
+ }
+ else {
+ GUILayout.Label($"Collision switch not connected to hittable.");
+ }
+ }
+ else {
+ GUILayout.Label($"Collision switch will be exposed as {target.name}.");
+ }
+ }
+
+ private static void DrawSwitch(string label, bool sw)
+ {
+ var labelPos = EditorGUILayout.GetControlRect();
+ labelPos.height = 18;
+
+ var icon = Icons.Switch(sw, IconSize.Small, sw ? IconColor.Orange : IconColor.Gray);
+ var width = ((labelPos.height / icon.height) * icon.width) + 2;
+
+ labelPos.x += width;
+ labelPos.width -= width;
+
+ var switchPos = new Rect(labelPos.x - width, labelPos.y, labelPos.height, labelPos.height);
+ GUI.Label(labelPos, label);
+ GUI.DrawTexture(switchPos, icon);
+ }
+ }
+}
diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/CollisionSwitchInspector.cs.meta b/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/CollisionSwitchInspector.cs.meta
new file mode 100644
index 000000000..a4bf449d3
--- /dev/null
+++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/CollisionSwitchInspector.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3782e6d4e88e4429a8349552e3506208
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/DropTargetBankInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/DropTargetBankInspector.cs
index f2c125026..3be0b8b74 100644
--- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/DropTargetBankInspector.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/DropTargetBankInspector.cs
@@ -30,7 +30,11 @@ public class DropTargetBankInspector : ItemInspector
"3 Bank",
"4 Bank",
"5 Bank",
- "6 Bank"
+ "6 Bank",
+ "7 Bank",
+ "8 Bank",
+ "9 Bank",
+ "10 Bank"
};
private static readonly int[] BankSizeValues = {
@@ -39,7 +43,11 @@ public class DropTargetBankInspector : ItemInspector
3,
4,
5,
- 6
+ 6,
+ 7,
+ 8,
+ 9,
+ 10
};
private bool _togglePlayfield = true;
@@ -47,7 +55,7 @@ public class DropTargetBankInspector : ItemInspector
private SerializedProperty _bankSizeProperty;
private SerializedProperty _dropTargetsProperty;
- protected override MonoBehaviour UndoTarget => throw new System.NotImplementedException();
+ protected override MonoBehaviour UndoTarget => target as MonoBehaviour;
override protected void OnEnable()
{
@@ -186,8 +194,8 @@ private static void DrawSwitch(string label, bool sw)
var width = ((labelPos.height / icon.height) * icon.width) + 2;
labelPos.x += width;
- labelPos.width -= width;
-
+ labelPos.width -= width;
+
var switchPos = new Rect(labelPos.x - width, labelPos.y, labelPos.height, labelPos.height);
GUI.Label(labelPos, label);
GUI.DrawTexture(switchPos, icon);
diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Utils/Icons.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Utils/Icons.cs
index 0e7941322..8ef7dd4f2 100644
--- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Utils/Icons.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Utils/Icons.cs
@@ -260,6 +260,7 @@ public Texture2D Lookup(T mb, IconSize size = IconSize.Large, IconColor color
case TeleporterComponent _: return Icons.Teleporter(size, color);
case TriggerComponent _: return Icons.Trigger(size, color);
case TroughComponent _: return Icons.Trough(size, color);
+ case CollisionSwitchComponent _: return Icons.Switch(false, size, color);
default: return null;
}
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VisualPinball.Unity.Editor.csproj b/VisualPinball.Unity/VisualPinball.Unity.Editor/VisualPinball.Unity.Editor.csproj
index d0aaadca2..f4f742070 100644
--- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VisualPinball.Unity.Editor.csproj
+++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VisualPinball.Unity.Editor.csproj
@@ -1,6 +1,6 @@
- netstandard2.0
+ netstandard2.1
VisualPinball.Unity.Editor
A bridge between VisualPinball.Engine and Unity
freezy;ravarcade;shaderbytes;rbxnk;jsm174;Vroonsh;Rowlan;kleisauke;ecurtz;Pandeli
@@ -8,7 +8,7 @@
0.1.0.0
0.1.0.0
0.1.0.0
- 8
+ 9.0
@@ -31,6 +31,9 @@
..\Plugins\.unity\UnityEditor.dll
+
+ ..\Plugins\.unity\UnityEditor.CoreModule.dll
+
..\Plugins\.unity\UnityEngine.IMGUIModule.dll
@@ -40,7 +43,7 @@
..\Plugins\.unity\UnityEngine.TextRenderingModule.dll
-
+
..\Plugins\.unity\Unity.InputSystem.dll
diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Rock.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Rock.cs
index 8a5e0cff6..c663e3fe7 100644
--- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Rock.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Rock.cs
@@ -38,43 +38,46 @@ public override void PostPatch(GameObject tableGo)
var playfieldGo = Playfield(tableGo);
playfieldGo.isStatic = true;
- SetupLights(tableGo, playfieldGo);
-
+ SetupLamps(tableGo, playfieldGo);
+
SetupFlippers(playfieldGo);
SetupDropTargetBanks(tableGo, playfieldGo);
SetupTrough(tableGo, playfieldGo);
- SetupPinMame(tableGo, playfieldGo);
- SetupDisplays(tableGo);
+
+ SetupCollisionSwitch(playfieldGo.transform.Find("Walls/sw41a").gameObject);
+ SetupCollisionSwitch(playfieldGo.transform.Find("Walls/sw41b").gameObject);
+ SetupCollisionSwitch(playfieldGo.transform.Find("Walls/sw41c").gameObject);
+ SetupCollisionSwitch(playfieldGo.transform.Find("Walls/sw41d").gameObject);
+ SetupCollisionSwitch(playfieldGo.transform.Find("Walls/sw41e").gameObject);
+ SetupCollisionSwitch(playfieldGo.transform.Find("Walls/sw41f").gameObject);
SetupLeftSlingshot(playfieldGo.transform.Find("Walls/LeftSlingshot").gameObject);
SetupRightSlingshot(playfieldGo.transform.Find("Walls/RightSlingshot").gameObject);
+
+ SetupPinMame(tableGo, playfieldGo);
+ SetupDisplays(tableGo);
}
- private static void SetupLights(GameObject tableGo, GameObject playfieldGo)
+ private static void SetupLamps(GameObject tableGo, GameObject playfieldGo)
{
var displayRegEx = new Regex("^[a-c][0-9a-f][0-9a-f]$");
- var giRegEx = new Regex("^gi\\d+$");
-
+
foreach (var child in playfieldGo.transform.Find("Lights").gameObject.transform.Cast().ToList()) {
var go = child.gameObject;
- if (!displayRegEx.Match(go.name).Success) {
+ if (displayRegEx.Match(go.name).Success) {
+ Object.DestroyImmediate(go);
+ }
+ else {
var lc = go.GetComponentInParent();
if (lc != null) {
lc.FadeSpeedUp = .2f;
lc.FadeSpeedDown = .1f;
- }
- foreach (var l in go.GetComponentsInChildren())
- {
- RenderPipeline.Current.LightConverter.SetIntensity(l, giRegEx.Match(go.name).Success ? 120 : 50);
- RenderPipeline.Current.LightConverter.SetTemperature(l, 2700);
+ PrefabUtility.RecordPrefabInstancePropertyModifications(lc);
}
}
- else {
- Object.DestroyImmediate(go);
- }
}
var lampGroups = CreateEmptyGameObject(playfieldGo, "Lamp Groups");
@@ -83,7 +86,7 @@ private static void SetupLights(GameObject tableGo, GameObject playfieldGo)
AddLightGroup(tableGo, lampGroup1,
"gi2", "gi4", "gi6", "gi7", "gi9",
- "gi10", "gi11", "gi12", "gi13", "gi15", "gi16", "gi17", "gi18", "gi19",
+ "gi10", "gi11", "gi12", "gi13", "gi14", "gi15", "gi16", "gi17", "gi18", "gi19",
"gi20", "gi21", "gi23", "gi25", "gi26", "gi28", "gi29",
"gi30", "gi31");
@@ -134,6 +137,53 @@ private static void SetupTrough(GameObject tableGo, GameObject playfieldGo)
troughComponent.RollTime = 300;
}
+ private static void SetupCollisionSwitch(GameObject go)
+ {
+ go.AddComponent();
+ }
+
+ private static void SetupLeftSlingshot(GameObject go)
+ {
+ var playfieldGo = go.GetComponentInParent().gameObject;
+ var ssParentGo = GetOrCreateGameObject(playfieldGo, "Slingshots");
+
+ var ssGo = PrefabUtility.InstantiatePrefab(SlingshotComponent.LoadPrefab(), ssParentGo.transform) as GameObject;
+ var ss = ssGo!.GetComponent();
+
+ ss.name = "Left Slingshot";
+ ss.SlingshotSurface = go.GetComponent();
+ ss.RubberOff = playfieldGo.transform.Find("Rubbers/LeftSling1").GetComponent();
+ ss.RubberOn = playfieldGo.transform.Find("Rubbers/LeftSling4").GetComponent();
+ ss.CoilArm = playfieldGo.transform.Find("Primitives/Lemk").GetComponent();
+ ss.CoilArmAngle = 22f;
+
+ EditorUtility.SetDirty(ssGo);
+ PrefabUtility.RecordPrefabInstancePropertyModifications(ss);
+
+ ss.RebuildMeshes();
+ }
+
+ private static void SetupRightSlingshot(GameObject go)
+ {
+ var playfieldGo = go.GetComponentInParent().gameObject;
+ var ssParentGo = GetOrCreateGameObject(playfieldGo, "Slingshots");
+
+ var ssGo = PrefabUtility.InstantiatePrefab(SlingshotComponent.LoadPrefab(), ssParentGo.transform) as GameObject;
+ var ss = ssGo!.GetComponent();
+
+ ss.name = "Right Slingshot";
+ ss.SlingshotSurface = go.GetComponent();
+ ss.RubberOff = playfieldGo.transform.Find("Rubbers/RightSling1").GetComponent();
+ ss.RubberOn = playfieldGo.transform.Find("Rubbers/RightSling3").GetComponent();
+ ss.CoilArm = playfieldGo.transform.Find("Primitives/Remk").GetComponent();
+ ss.CoilArmAngle = 22f;
+
+ EditorUtility.SetDirty(ssGo);
+ PrefabUtility.RecordPrefabInstancePropertyModifications(ss);
+
+ ss.RebuildMeshes();
+ }
+
private static void SetupPinMame(GameObject tableGo, GameObject playfieldGo)
{
#if !NO_PINMAME
@@ -155,7 +205,8 @@ private static void SetupDisplays(GameObject tableGo)
{
const float scale = 0.5f;
var cabinetGo = tableGo.transform.Find("Cabinet").gameObject;
- var go = new GameObject {
+ var go = new GameObject
+ {
name = "Segment Display [0]",
transform = {
localEulerAngles = new Vector3(0, 0, 0),
@@ -174,7 +225,8 @@ private static void SetupDisplays(GameObject tableGo)
segment.LitColor = new UnityEngine.Color(0, 0.87f, 0.87f);
segment.Emission = 3;
- go = new GameObject {
+ go = new GameObject
+ {
name = "Segment Display [1]",
transform = {
localEulerAngles = new Vector3(0, 0, 0),
@@ -196,48 +248,6 @@ private static void SetupDisplays(GameObject tableGo)
#endregion
- private static void SetupLeftSlingshot(GameObject go)
- {
- var playfieldGo = go.GetComponentInParent().gameObject;
- var ssParentGo = GetOrCreateGameObject(playfieldGo, "Slingshots");
-
- var ssGo = PrefabUtility.InstantiatePrefab(SlingshotComponent.LoadPrefab(), ssParentGo.transform) as GameObject;
- var ss = ssGo!.GetComponent();
-
- ss.name = "Left Slingshot";
- ss.SlingshotSurface = go.GetComponent();
- ss.RubberOff = playfieldGo.transform.Find("Rubbers/LeftSling1").GetComponent();
- ss.RubberOn = playfieldGo.transform.Find("Rubbers/LeftSling4").GetComponent();
- ss.CoilArm = playfieldGo.transform.Find("Primitives/Lemk").GetComponent();
- ss.CoilArmAngle = 22f;
-
- EditorUtility.SetDirty(ssGo);
- PrefabUtility.RecordPrefabInstancePropertyModifications(ss);
-
- ss.RebuildMeshes();
- }
-
- private static void SetupRightSlingshot(GameObject go)
- {
- var playfieldGo = go.GetComponentInParent().gameObject;
- var ssParentGo = GetOrCreateGameObject(playfieldGo, "Slingshots");
-
- var ssGo = PrefabUtility.InstantiatePrefab(SlingshotComponent.LoadPrefab(), ssParentGo.transform) as GameObject;
- var ss = ssGo!.GetComponent();
-
- ss.name = "Right Slingshot";
- ss.SlingshotSurface = go.GetComponent();
- ss.RubberOff = playfieldGo.transform.Find("Rubbers/RightSling1").GetComponent();
- ss.RubberOn = playfieldGo.transform.Find("Rubbers/RightSling3").GetComponent();
- ss.CoilArm = playfieldGo.transform.Find("Primitives/Remk").GetComponent();
- ss.CoilArmAngle = 22f;
-
- EditorUtility.SetDirty(ssGo);
- PrefabUtility.RecordPrefabInstancePropertyModifications(ss);
-
- ss.RebuildMeshes();
- }
-
[NameMatch("LeftFlipper2", Ref = "Playfield/Flippers/LeftFlipper1")]
[NameMatch("LeftFlipper3", Ref = "Playfield/Flippers/LeftFlipper1")]
[NameMatch("LeftFlipper4", Ref = "Playfield/Flippers/LeftFlipper1")]
@@ -349,10 +359,127 @@ public void AddRightSlingshotDragPoints(RubberComponent rubberComponent)
[NameMatch("gi1")]
[NameMatch("gi3")]
[NameMatch("gi8")]
- [NameMatch("gi14")]
- public void DisableUnusedLights(GameObject go)
+ public void DisableLamps(GameObject go)
{
go.SetActive(false);
}
+
+ [NameMatch("gi14")]
+ public void FixGI14(GameObject go)
+ {
+ go.GetComponent().Position = new Vector3(894.29f, 178.4f);
+ }
+
+ [NameMatch("gi2")]
+ [NameMatch("gi4")]
+ [NameMatch("gi6")]
+ [NameMatch("gi7")]
+ [NameMatch("gi9")]
+ [NameMatch("gi10")]
+ [NameMatch("gi11")]
+ [NameMatch("gi12")]
+ [NameMatch("gi13")]
+ [NameMatch("gi14")]
+ [NameMatch("gi15")]
+ [NameMatch("gi16")]
+ [NameMatch("gi17")]
+ [NameMatch("gi18")]
+ [NameMatch("gi19")]
+ [NameMatch("gi20")]
+ [NameMatch("gi21")]
+ [NameMatch("gi23")]
+ [NameMatch("gi25")]
+ [NameMatch("gi26")]
+ [NameMatch("gi28")]
+ [NameMatch("gi29")]
+ [NameMatch("gi30")]
+ [NameMatch("gi31")]
+ [NameMatch("gi22")]
+ [NameMatch("gi24")]
+ [NameMatch("gi27")]
+ public void FixGIs(GameObject go)
+ {
+ LightTemperature(go, 2700f);
+ LightIntensity(go, 120f);
+ }
+
+ [NameMatch("L3")]
+ [NameMatch("L5")]
+ [NameMatch("L6")]
+ [NameMatch("L7")]
+ [NameMatch("L8")]
+ [NameMatch("L9")]
+ [NameMatch("L10")]
+ [NameMatch("L11")]
+ [NameMatch("L12")]
+ [NameMatch("L13a")]
+ [NameMatch("L13b")]
+ [NameMatch("L14")]
+ [NameMatch("L15")]
+ [NameMatch("L16")]
+ [NameMatch("L17")]
+ [NameMatch("L18")]
+ [NameMatch("L19")]
+ [NameMatch("L20")]
+ [NameMatch("L21")]
+ [NameMatch("L22")]
+ [NameMatch("L23")]
+ [NameMatch("L24")]
+ [NameMatch("L25")]
+ [NameMatch("L26")]
+ [NameMatch("L27")]
+ [NameMatch("L28")]
+ [NameMatch("L29")]
+ [NameMatch("L30")]
+ [NameMatch("L31")]
+ [NameMatch("L32")]
+ [NameMatch("L33")]
+ [NameMatch("L34")]
+ [NameMatch("L35")]
+ [NameMatch("L36")]
+ [NameMatch("L37")]
+ [NameMatch("L38")]
+ [NameMatch("L39")]
+ [NameMatch("L40")]
+ [NameMatch("L41")]
+ [NameMatch("L42")]
+ [NameMatch("L43")]
+ [NameMatch("L44")]
+ [NameMatch("L45")]
+ [NameMatch("L46")]
+ [NameMatch("L47a")]
+ [NameMatch("L47b")]
+ [NameMatch("L51a")]
+ [NameMatch("L51b")]
+ public void FixLamps(GameObject go)
+ {
+ LightTemperature(go, 2700f);
+ LightIntensity(go, 50f);
+ }
+
+ [NameMatch("AL1a")]
+ [NameMatch("AL1b")]
+ [NameMatch("AL2a")]
+ [NameMatch("AL2b")]
+ [NameMatch("AL3a")]
+ [NameMatch("AL3b")]
+ [NameMatch("AL4a")]
+ [NameMatch("AL4b")]
+ [NameMatch("AL5a")]
+ [NameMatch("AL5b")]
+ [NameMatch("AL6a")]
+ [NameMatch("AL6b")]
+ [NameMatch("AL7a")]
+ [NameMatch("AL7b")]
+ [NameMatch("AL8a")]
+ [NameMatch("AL8b")]
+ [NameMatch("AL9a")]
+ [NameMatch("AL10a")]
+ public void FixAuxilaryLamps(GameObject go)
+ {
+ LightTemperature(go, 5500f);
+ LightColor(go, UnityEngine.Color.white);
+ LightIntensity(go, 175f);
+ }
}
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.csproj b/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.csproj
index e74f3933f..d25803d52 100644
--- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.csproj
+++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.csproj
@@ -1,6 +1,6 @@
- netstandard2.0
+ netstandard2.1
VisualPinball.Unity.Patcher
A bridge between VisualPinball.Engine and Unity
freezy;ravarcade;shaderbytes;rbxnk;jsm174;Vroonsh;Rowlan;kleisauke;ecurtz;Pandeli
@@ -8,15 +8,28 @@
0.1.0.0
0.1.0.0
0.1.0.0
- 8
+ 9.0
+ NO_PINMAME
+
+ ..\Plugins\.unity\UnityEngine.dll
+
..\Plugins\.unity\UnityEngine.CoreModule.dll
+
+ ..\Plugins\.unity\UnityEditor.dll
+
+
+ ..\Plugins\.unity\UnityEditor.CoreModule.dll
+
+
+ ..\Plugins\.unity\Unity.Entities.Hybrid.dll
+
diff --git a/VisualPinball.Unity/VisualPinball.Unity.Test/VisualPinball.Unity.Test.csproj b/VisualPinball.Unity/VisualPinball.Unity.Test/VisualPinball.Unity.Test.csproj
index 58ed0f174..22da3fc89 100644
--- a/VisualPinball.Unity/VisualPinball.Unity.Test/VisualPinball.Unity.Test.csproj
+++ b/VisualPinball.Unity/VisualPinball.Unity.Test/VisualPinball.Unity.Test.csproj
@@ -8,7 +8,7 @@
0.1.0.0
0.1.0.0
0.1.0.0
- 8
+ 9.0
true
false
@@ -22,6 +22,12 @@
+
+
+
+
+
+
@@ -29,11 +35,9 @@
-
-
-
-
-
+
+ $(NuGetPackageRoot)\fluentassertions\6.2.0\lib\netstandard2.1\FluentAssertions.dll
+
..\Plugins\.unity\UnityEngine.CoreModule.dll
diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs
index ca2da9e2b..84536be78 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs
@@ -252,6 +252,11 @@ public void RegisterDropTargetBankComponent(DropTargetBankComponent component)
Register(new DropTargetBankApi(component.gameObject, this), component);
}
+ public void RegisterCollisionSwitchComponent(CollisionSwitchComponent component)
+ {
+ Register(new CollisionSwitchApi(component.gameObject, this), component);
+ }
+
public void RegisterPlunger(PlungerComponent component, Entity entity, Entity parentEntity, InputActionReference actionRef)
{
var plungerApi = new PlungerApi(component.gameObject, entity, parentEntity, this);
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch.meta
new file mode 100644
index 000000000..6dcd39b7b
--- /dev/null
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a7ec3abc220874fb381040742ad852e1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchApi.cs
new file mode 100644
index 000000000..7c4690f63
--- /dev/null
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchApi.cs
@@ -0,0 +1,72 @@
+using System;
+using Logger = NLog.Logger;
+using NLog;
+using UnityEngine;
+using Unity.Entities;
+
+namespace VisualPinball.Unity
+{
+ public class CollisionSwitchApi : IApi, IApiSwitch, IApiSwitchDevice
+ {
+ private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
+
+ private readonly CollisionSwitchComponent _collisionSwitchComponent;
+ private Player _player;
+ private IApiHittable _hittable;
+ private BallManager _ballManager;
+
+ private protected readonly SwitchHandler SwitchHandler;
+
+ public event EventHandler Init;
+ public event EventHandler Switch;
+
+ public bool IsSwitchEnabled => SwitchHandler.IsEnabled;
+ IApiSwitchStatus IApiSwitch.AddSwitchDest(SwitchConfig switchConfig) => SwitchHandler.AddSwitchDest(switchConfig.WithPulse(true));
+ void IApiSwitch.AddWireDest(WireDestConfig wireConfig) => SwitchHandler.AddWireDest(wireConfig.WithPulse(true));
+ void IApiSwitch.RemoveWireDest(string destId) => SwitchHandler.RemoveWireDest(destId);
+ IApiSwitch IApiSwitchDevice.Switch(string deviceItem) => this;
+ public void OnSwitch(bool closed) => SwitchHandler.OnSwitch(closed);
+ public void DestroyBall(Entity ballEntity) => _ballManager.DestroyEntity(ballEntity);
+
+ public bool IsHittable => _hittable != null;
+
+ internal CollisionSwitchApi(GameObject go, Player player)
+ {
+ _collisionSwitchComponent = go.GetComponentInChildren();
+ _player = player;
+
+ SwitchHandler = new SwitchHandler(go.name, player);
+ }
+
+ void IApi.OnInit(BallManager ballManager)
+ {
+ _ballManager = ballManager;
+ _hittable = _player.TableApi.Hittable(_collisionSwitchComponent.GetComponentInParent());
+
+ if (_hittable != null) {
+ _hittable.Hit += OnHit;
+ }
+ else {
+ Logger.Error($"{_collisionSwitchComponent.name} not connected to a hittable component");
+ }
+
+ Init?.Invoke(this, EventArgs.Empty);
+ }
+
+ private void OnHit(object sender, HitEventArgs e)
+ {
+ Switch?.Invoke(this, new SwitchEventArgs(true, e.BallEntity));
+ OnSwitch(true);
+ }
+
+ void IApi.OnDestroy()
+ {
+ Logger.Info($"Destroying {_collisionSwitchComponent.name}");
+
+ if (_hittable != null) {
+ _hittable.Hit -= OnHit;
+ }
+ }
+ }
+}
+
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchApi.cs.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchApi.cs.meta
new file mode 100644
index 000000000..e9e475045
--- /dev/null
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchApi.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3553a7261c4ac441faf3906050ceb4fa
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchComponent.cs
new file mode 100644
index 000000000..d7b2d4402
--- /dev/null
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchComponent.cs
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+using UnityEngine;
+using VisualPinball.Engine.Game.Engines;
+
+namespace VisualPinball.Unity
+{
+ [AddComponentMenu("Visual Pinball/Mechs/Collision Switch")]
+ public class CollisionSwitchComponent : MonoBehaviour, ISwitchDeviceComponent
+ {
+ public const string MainSwitchItem = "collision_switch";
+
+ public IEnumerable AvailableSwitches => new[] {
+ new GamelogicEngineSwitch(MainSwitchItem) {
+ IsPulseSwitch = true
+ }
+ };
+
+ public SwitchDefault SwitchDefault => SwitchDefault.NormallyOpen;
+
+ IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableSwitches;
+
+ #region Runtime
+
+ private void Awake()
+ {
+ GetComponentInParent().RegisterCollisionSwitchComponent(this);
+ }
+
+ #endregion
+ }
+}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchComponent.cs.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchComponent.cs.meta
new file mode 100644
index 000000000..98abb7986
--- /dev/null
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/CollisionSwitch/CollisionSwitchComponent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f30359a678fd54f90960124bb74b94ef
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {fileID: 2800000, guid: aa545c22775b5064eb6c1ca118601601, type: 3}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs
index 6b9d3578c..064af1189 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs
@@ -136,7 +136,7 @@ internal interface IApiSlingshot
/// implement , and the ones that only support one switch also
/// implement and return themself at .
///
- internal interface IApiSwitch
+ public interface IApiSwitch
{
///
/// Set up this switch to send its status to the gamelogic engine with the given ID.
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs
index b7d30327f..d1152ba8c 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs
@@ -45,7 +45,8 @@ public class TableApi : IApi
private readonly Dictionary _teleportersByName = new Dictionary();
private readonly Dictionary _triggersByName = new Dictionary();
private readonly Dictionary _troughsByName = new Dictionary();
-
+ private readonly Dictionary _switchablesByName = new Dictionary();
+ private readonly Dictionary _hittablesByName = new Dictionary();
private readonly Dictionary _bumpersByComponent = new Dictionary();
private readonly Dictionary _dropTargetsByComponent = new Dictionary();
@@ -66,6 +67,8 @@ public class TableApi : IApi
private readonly Dictionary _teleportersByComponent = new Dictionary();
private readonly Dictionary _triggersByComponent = new Dictionary();
private readonly Dictionary _troughsByComponent = new Dictionary();
+ private readonly Dictionary _switchablesByComponent = new Dictionary();
+ private readonly Dictionary _hittablesByComponent = new Dictionary();
#endregion
@@ -220,6 +223,22 @@ public TableApi(Player player)
public DropTargetBankApi DropTargetBank(string name) => Get(name);
public DropTargetBankApi DropTargetBank(MonoBehaviour component) => Get(component);
+ ///
+ /// Returns a switchable component by name.
+ ///
+ /// Name of the switchable component
+ /// Switchable or `null` if no switchable with that name exists.
+ public IApiSwitch Switchable(string name) => _switchablesByName[name];
+ public IApiSwitch Switchable(MonoBehaviour component) => _switchablesByComponent[component];
+
+ ///
+ /// Returns a hittable by name.
+ ///
+ /// Name of the hittable
+ /// Hittable or `null` if no hittable with that name exists.
+ public IApiHittable Hittable(string name) => _hittablesByName[name];
+ public IApiHittable Hittable(MonoBehaviour component) => _hittablesByComponent[component];
+
#endregion
#region Registration
@@ -229,8 +248,21 @@ internal void Register(MonoBehaviour component, T api) where T : IApi
var nameDict = GetNameDictionary();
var compDict = GetComponentDictionary();
- nameDict[component.name] = api;
- compDict[component] = api;
+ if (nameDict != null) {
+ nameDict[component.name] = api;
+ compDict[component] = api;
+ }
+
+ if (api is IApiHittable hittable) {
+ _hittablesByName[component.name] = hittable;
+ _hittablesByComponent[component] = hittable;
+ }
+
+ if (api is IApiSwitch switchable)
+ {
+ _switchablesByName[component.name] = switchable;
+ _switchablesByComponent[component] = switchable;
+ }
}
private bool Has(string name) where T : IApi => GetNameDictionary().ContainsKey(name);
@@ -263,7 +295,9 @@ private Dictionary GetNameDictionary(Type t) where T : IApi
if (t == typeof(TeleporterApi)) return _teleportersByName as Dictionary;
if (t == typeof(TriggerApi)) return _triggersByName as Dictionary;
if (t == typeof(TroughApi)) return _troughsByName as Dictionary;
- throw new ArgumentException($"Unknown API type {t}.");
+
+ // can be null, because we don't track all elements, namely hittable switches
+ return null;
}
private Dictionary GetComponentDictionary(Type t) where T : IApi
@@ -288,7 +322,9 @@ private Dictionary GetComponentDictionary(Type t) where T :
if (t == typeof(TeleporterApi)) return _teleportersByComponent as Dictionary;
if (t == typeof(TriggerApi)) return _triggersByComponent as Dictionary;
if (t == typeof(TroughApi)) return _troughsByComponent as Dictionary;
- throw new ArgumentException($"Unknown API type {t}.");
+
+ // can be null, because we don't track all elements, namely hittable switches
+ return null;
}
#endregion
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VisualPinball.Unity.asmdef b/VisualPinball.Unity/VisualPinball.Unity/VisualPinball.Unity.asmdef
index 10ec8ede2..9a2c65ad7 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VisualPinball.Unity.asmdef
+++ b/VisualPinball.Unity/VisualPinball.Unity/VisualPinball.Unity.asmdef
@@ -7,10 +7,8 @@
"Unity.Collections",
"Unity.Mathematics",
"Unity.Mathematics.Extensions",
- "Unity.Mathematics.Extensions.Hybrid",
"Unity.Physics",
"Unity.Physics.Hybrid",
- "Unity.Rendering.Hybrid",
"Unity.Transforms",
"Unity.InputSystem",
"VisualPinball.Engine",
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VisualPinball.Unity.csproj b/VisualPinball.Unity/VisualPinball.Unity/VisualPinball.Unity.csproj
index dc4895630..c96d012ba 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VisualPinball.Unity.csproj
+++ b/VisualPinball.Unity/VisualPinball.Unity/VisualPinball.Unity.csproj
@@ -1,6 +1,6 @@
- netstandard2.0
+ netstandard2.1
VisualPinball.Unity
A bridge between VisualPinball.Engine and Unity
freezy;ravarcade;shaderbytes;rbxnk;jsm174;Vroonsh;Rowlan;kleisauke;ecurtz;Pandeli
@@ -8,8 +8,9 @@
0.1.0.0
0.1.0.0
0.1.0.0
- 8
+ 9.0
true
+ UNITY_EDITOR
@@ -34,6 +35,18 @@
..\Plugins\.unity\UnityEngine.ImageConversionModule.dll
+
+ ..\Plugins\.unity\UnityEngine.IMGUIModule.dll
+
+
+ ..\Plugins\.unity\UnityEngine.AudioModule.dll
+
+
+ ..\Plugins\.unity\UnityEditor.dll
+
+
+ ..\Plugins\.unity\UnityEditor.CoreModule.dll
+
..\Plugins\.unity\Unity.Collections.dll
@@ -43,22 +56,16 @@
..\Plugins\.unity\Unity.Mathematics.Extensions.dll
-
- ..\Plugins\.unity\Unity.Mathematics.Extensions.Hybrid.dll
-
..\Plugins\.unity\Unity.Entities.dll
..\Plugins\.unity\Unity.Entities.Hybrid.dll
-
- ..\Plugins\.unity\Unity.Rendering.Hybrid.dll
-
..\Plugins\.unity\Unity.Transforms.dll
-
+
..\Plugins\.unity\Unity.InputSystem.dll