From f8822831aa54245bc91d038831e1558674a6b510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C5=A0vec?= Date: Thu, 12 Sep 2024 16:55:54 +0200 Subject: [PATCH] Reimplement solo and mp rig switching --- .../ControllerInput/HVRInputManager.cs | 2 +- .../Prefabs/GlobalBoostrap/GameManager.prefab | 13 ++- Assets/Prefabs/Rig.prefab | 44 ++++---- Assets/Scenes/Lobby.unity | 96 ----------------- Assets/Scripts/Components/PlayerComponent.cs | 102 ++++++++++-------- Assets/Scripts/Installers/GlobalInstaller.cs | 10 -- Assets/Scripts/Managers/GameManager.cs | 35 +++--- Assets/Scripts/UI/HandMenuUI.cs | 10 +- Assets/Scripts/Utils/Injector.cs | 5 + 9 files changed, 119 insertions(+), 198 deletions(-) diff --git a/Assets/HurricaneVR/Framework/Scripts/ControllerInput/HVRInputManager.cs b/Assets/HurricaneVR/Framework/Scripts/ControllerInput/HVRInputManager.cs index 620b0e87..5741a127 100644 --- a/Assets/HurricaneVR/Framework/Scripts/ControllerInput/HVRInputManager.cs +++ b/Assets/HurricaneVR/Framework/Scripts/ControllerInput/HVRInputManager.cs @@ -993,7 +993,7 @@ namespace HurricaneVR.Framework.ControllerInput #else loaders = string.Join(",", XRGeneralSettings.Instance.Manager.loaders.Select(e => e.name)); #endif - Debug.Log($"{XRGeneralSettings.Instance.Manager.automaticLoading}"); + //Debug.Log($"{XRGeneralSettings.Instance.Manager.automaticLoading}"); Debug.Log($"XRGeneralSettings.Instance.Manager.isInitializationComplete {XRGeneralSettings.Instance.Manager.isInitializationComplete}"); Debug.Log($"XRPlugin Detected | XRSettings.enabled {XRSettings.enabled} | Loader : {XRPluginLoader} | Loaders Enabled: {loaders}"); diff --git a/Assets/Prefabs/GlobalBoostrap/GameManager.prefab b/Assets/Prefabs/GlobalBoostrap/GameManager.prefab index cf832d87..04c597dd 100644 --- a/Assets/Prefabs/GlobalBoostrap/GameManager.prefab +++ b/Assets/Prefabs/GlobalBoostrap/GameManager.prefab @@ -44,7 +44,16 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d357a0b6e2db94a4aadef95ef4fff758, type: 3} m_Name: m_EditorClassIdentifier: - soloRig: {fileID: 0} - multiplayerRig: {fileID: 0} + rigPrefab: {fileID: 75161255762383020, guid: 1ef3259331ddc1f4d94b628323ec45f3, type: 3} + player: {fileID: 0} networkManager: {fileID: 0} autoConnectOrHost: 0 + OnConnected: + m_PersistentCalls: + m_Calls: [] + OnDisconnected: + m_PersistentCalls: + m_Calls: [] + OnClientsChanged: + m_PersistentCalls: + m_Calls: [] diff --git a/Assets/Prefabs/Rig.prefab b/Assets/Prefabs/Rig.prefab index 803ee58d..f32580fc 100644 --- a/Assets/Prefabs/Rig.prefab +++ b/Assets/Prefabs/Rig.prefab @@ -21,22 +21,22 @@ PrefabInstance: - target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_SizeDelta.x - value: 148 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 148 objectReference: {fileID: 0} - target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979, type: 3} @@ -46,7 +46,7 @@ PrefabInstance: - target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -280 objectReference: {fileID: 0} - target: {fileID: 3680965801110432182, guid: f871c3b28fd786d4f820bea343f67979, type: 3} @@ -71,22 +71,22 @@ PrefabInstance: - target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_SizeDelta.x - value: 148 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 148 objectReference: {fileID: 0} - target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979, type: 3} @@ -96,27 +96,27 @@ PrefabInstance: - target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -280 objectReference: {fileID: 0} - target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_SizeDelta.x - value: 148 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 148 objectReference: {fileID: 0} - target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979, type: 3} @@ -126,27 +126,27 @@ PrefabInstance: - target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -206 objectReference: {fileID: 0} - target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_SizeDelta.x - value: 148 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 148 objectReference: {fileID: 0} - target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979, type: 3} @@ -156,7 +156,7 @@ PrefabInstance: - target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -280 objectReference: {fileID: 0} - target: {fileID: 7749079862415865764, guid: f871c3b28fd786d4f820bea343f67979, type: 3} @@ -275,7 +275,7 @@ PrefabInstance: - target: {fileID: 3822188217954140599, guid: 6974999791dc8804fafee05e319aa932, type: 3} propertyPath: m_Enabled - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 3924027509007222391, guid: 6974999791dc8804fafee05e319aa932, type: 3} @@ -622,7 +622,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: - GlobalObjectIdHash: 918221477 + GlobalObjectIdHash: 3394388680 InScenePlacedSourceGlobalObjectIdHash: 0 AlwaysReplicateAsRoot: 0 SynchronizeTransform: 1 diff --git a/Assets/Scenes/Lobby.unity b/Assets/Scenes/Lobby.unity index 8f2f9d41..afb583ec 100644 --- a/Assets/Scenes/Lobby.unity +++ b/Assets/Scenes/Lobby.unity @@ -2810,37 +2810,6 @@ Transform: type: 3} m_PrefabInstance: {fileID: 212601291} m_PrefabAsset: {fileID: 0} ---- !u!1 &216372457 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 216372458} - m_Layer: 0 - m_Name: Character_Sample_04 (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!4 &216372458 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 216372457} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &217767396 PrefabInstance: m_ObjectHideFlags: 0 @@ -4507,37 +4476,6 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 693918f5252cc9543ad4901c66a265ed, type: 3} ---- !u!1 &310335279 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 310335280} - m_Layer: 0 - m_Name: Character_Sample_04 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!4 &310335280 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 310335279} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &313084521 PrefabInstance: m_ObjectHideFlags: 0 @@ -11368,37 +11306,6 @@ Transform: type: 3} m_PrefabInstance: {fileID: 845377780} m_PrefabAsset: {fileID: 0} ---- !u!1 &856515704 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 856515705} - m_Layer: 0 - m_Name: InputField_Icon_Lock - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!4 &856515705 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 856515704} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &857455115 GameObject: m_ObjectHideFlags: 0 @@ -35379,6 +35286,3 @@ SceneRoots: - {fileID: 3091828949070161056} - {fileID: 2770940432321735806} - {fileID: 2097484082} - - {fileID: 856515705} - - {fileID: 310335280} - - {fileID: 216372458} diff --git a/Assets/Scripts/Components/PlayerComponent.cs b/Assets/Scripts/Components/PlayerComponent.cs index a760513c..a7918a51 100644 --- a/Assets/Scripts/Components/PlayerComponent.cs +++ b/Assets/Scripts/Components/PlayerComponent.cs @@ -11,9 +11,14 @@ using Unity.Netcode.Components; using Unity.VisualScripting; using UnityEngine; using UnityEngine.Rendering.Universal; +using Zenject; public class PlayerComponent : NetworkBehaviour { + [SerializeField] + [Inject] + private HVRInputModule inputModule; + [SerializeField] private NetworkObject networkObject; @@ -45,46 +50,61 @@ public class PlayerComponent : NetworkBehaviour public Vector3 Rotation => controller.Camera.forward; private bool isSoloRig => !networkObject.IsPlayerObject; - private bool isMultiplayerLocalRig => networkObject.IsLocalPlayer; + private bool isLocalRig => networkObject.IsLocalPlayer; - private bool isMultiplayerRemoteRig => !networkObject.IsOwner && networkObject.IsPlayerObject; + private bool isRemoteRig => !networkObject.IsOwner && networkObject.IsPlayerObject; - public override void OnNetworkSpawn() - { - base.OnNetworkSpawn(); + // Teleport information after player is loaded into scene + private Vector3 teleportPosition; + private Vector3 teleportRotation; + private bool teleportAfterLoad; - if (!isSoloRig) - { - name = $"Player - {networkObject.OwnerClientId}" - + (networkObject.IsLocalPlayer ? " (local)" : ""); - } - - if (isMultiplayerRemoteRig) - { - StartCoroutine(DestroyMultiplayerComponents()); - } - } + private bool isLoaded; private void Start() { + this.Inject(); + StartCoroutine(AddDontDestroyToDependencies()); - if (isSoloRig || isMultiplayerLocalRig) + if (isSoloRig) { - foreach (var pointer in GetComponentsInChildren()) - { - HVRInputModule.Instance.AddPointer(pointer); - } + AddPointersToInputModule(); + + name = "Player - SP"; + + StartCoroutine(DestroyComponentsNotNeededForSolo()); + DontDestroyOnLoad(gameObject); + } + else if (isLocalRig) + { + AddPointersToInputModule(); + + name = $"Player - MP {networkObject.OwnerClientId} (local)"; + } + else if (isRemoteRig) + { + name = $"Player - MP {networkObject.OwnerClientId}"; + StartCoroutine(DestroyComponentsNotNeededForRemoteRigs()); } - if (!isSoloRig) return; + isLoaded = true; - audioListener.enabled = true; - StartCoroutine(DestroySoloComponents()); - DontDestroyOnLoad(gameObject); + if (teleportAfterLoad) + { + Teleport(teleportPosition, teleportRotation); + } } - private IEnumerator DestroyMultiplayerComponents() + private void AddPointersToInputModule() + { + foreach (var pointer in GetComponentsInChildren()) + { + inputModule.AddPointer(pointer); + } + } + + private IEnumerator DestroyComponentsNotNeededForRemoteRigs() { yield return new WaitForEndOfFrame(); @@ -105,7 +125,7 @@ public class PlayerComponent : NetworkBehaviour controller.RemoveMultiplayerComponents(); } - private IEnumerator DestroySoloComponents() + private IEnumerator DestroyComponentsNotNeededForSolo() { yield return new WaitForEndOfFrame(); @@ -140,26 +160,18 @@ public class PlayerComponent : NetworkBehaviour } } - public void ToggleAudioListener(bool enabled) => audioListener.enabled = enabled; - - public void Toggle(bool active) - { - // Only toggle solo rig components, not multiplayer one - if (networkObject == null || isSoloRig) - { - foreach (var d in dependencies) - { - d.SetActive(active); - } - - audioListener.enabled = active; - gameObject.SetActive(active); - } - } - public void Teleport(Vector3 position, Vector3 direction) { - teleporter.Teleport(position, direction); + if (isLoaded) + { + teleporter.Teleport(position, direction); + } + else + { + teleportPosition = position; + teleportRotation = direction; + teleportAfterLoad = true; + } } public void FadeScreen(float to, float duration) diff --git a/Assets/Scripts/Installers/GlobalInstaller.cs b/Assets/Scripts/Installers/GlobalInstaller.cs index 1cbc2599..274744b1 100644 --- a/Assets/Scripts/Installers/GlobalInstaller.cs +++ b/Assets/Scripts/Installers/GlobalInstaller.cs @@ -24,9 +24,6 @@ public class GlobalInstaller : MonoInstaller [SerializeField] private GameObject gameManagerPrefab; - [SerializeField] - private GameObject playerPrefab; - [SerializeField] private GameObject uiManagerPrefab; @@ -81,13 +78,6 @@ public class GlobalInstaller : MonoInstaller Container.BindInstance(networkManager) .AsSingle(); - var playerGO = Instantiate(playerPrefab); - playerGO.name = playerPrefab.name; - var playerComponent = playerGO.GetComponent(); - - Container.BindInstance(playerComponent) - .AsSingle(); - Container.Bind() .FromComponentInNewPrefab(uiManagerPrefab) .AsSingle() diff --git a/Assets/Scripts/Managers/GameManager.cs b/Assets/Scripts/Managers/GameManager.cs index 9dd9b4e6..405d21c8 100644 --- a/Assets/Scripts/Managers/GameManager.cs +++ b/Assets/Scripts/Managers/GameManager.cs @@ -10,15 +10,13 @@ using System.Collections.Generic; public class GameManager : NetworkBehaviour { [SerializeField] - [ReadOnly] - [Inject] - private PlayerComponent soloRig; + private GameObject rigPrefab; [SerializeField] [ReadOnly] - private PlayerComponent multiplayerRig; + private PlayerComponent player; - public PlayerComponent LocalPlayer => multiplayerRig ?? soloRig; + public PlayerComponent LocalPlayer => player; [SerializeField] [ReadOnly] @@ -43,6 +41,8 @@ public class GameManager : NetworkBehaviour networkManager.OnClientConnectedCallback += OnClientConnectedCallback; networkManager.OnClientDisconnectCallback += OnClientDisconnectCallback; + player = SpawnSoloRig(); + if (autoConnectOrHost) { if (ClonesManager.IsClone()) @@ -56,6 +56,11 @@ public class GameManager : NetworkBehaviour } } + private PlayerComponent SpawnSoloRig() + { + return Instantiate(rigPrefab).GetComponent(); + } + public void JoinGame(string code) { networkManager.StartClient(); @@ -107,23 +112,25 @@ public class GameManager : NetworkBehaviour { yield return new WaitForEndOfFrame(); + var position = player.Position; + var rotation = player.Rotation; + player.DestroyDependencies(); + if (toSolo) { - soloRig.Toggle(toSolo); - soloRig.Teleport(multiplayerRig.Position, multiplayerRig.Rotation); - multiplayerRig.DestroyDependencies(); - multiplayerRig = null; + yield return new WaitForEndOfFrame(); + player = SpawnSoloRig(); } else { - soloRig.Toggle(toSolo); - + Destroy(player.gameObject); + yield return new WaitForEndOfFrame(); var playerObject = networkManager.LocalClient.PlayerObject; - multiplayerRig = playerObject.GetComponent(); - multiplayerRig.Teleport(soloRig.Position, soloRig.Rotation); - multiplayerRig.ToggleAudioListener(true); + player = playerObject.GetComponent(); } + + player.Teleport(position, rotation); } private void OnClientDisconnectCallback(ulong clientId) diff --git a/Assets/Scripts/UI/HandMenuUI.cs b/Assets/Scripts/UI/HandMenuUI.cs index ca824262..3711f68f 100644 --- a/Assets/Scripts/UI/HandMenuUI.cs +++ b/Assets/Scripts/UI/HandMenuUI.cs @@ -70,6 +70,8 @@ public class HandMenuUI : NetworkBehaviour private void Start() { + this.Inject(); + if (uiInput == null) return; canvas = GetComponent(); @@ -88,14 +90,6 @@ public class HandMenuUI : NetworkBehaviour settingsButton.onClick.AddListener(() => SettingsClicked()); } - public override void OnNetworkSpawn() - { - base.OnNetworkSpawn(); - - // Player components need to be injected manualy again, because NetworkManager doesn't inject them. - gameObject.Inject(); - } - private void Update() { CheckInput(); diff --git a/Assets/Scripts/Utils/Injector.cs b/Assets/Scripts/Utils/Injector.cs index a41fe7cc..23106732 100644 --- a/Assets/Scripts/Utils/Injector.cs +++ b/Assets/Scripts/Utils/Injector.cs @@ -43,4 +43,9 @@ public static class Injector { LookupContainer(go, container).InjectGameObject(go); } + + public static void Inject(this MonoBehaviour mb, ContainerSources container = ContainerSources.SceneContext) + { + LookupContainer(mb.gameObject, container).Inject(mb); + } }