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: + +![Switch Manager](collision-switch-switch-manager.png) ## 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