From b05cab8288573010baf184aa50a91dc2f1407aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C5=A0vec?= Date: Sun, 25 Aug 2024 17:43:19 +0200 Subject: [PATCH] Implement player network spawning and position synchronization --- Assets/Data/CharactersPrefabsList.asset | 16 +++ Assets/Data/CharactersPrefabsList.asset.meta | 8 ++ Assets/DefaultNetworkPrefabs.asset | 6 + Assets/DefaultNetworkPrefabs.asset.meta | 2 +- .../Scripts/Core/Grabbers/HVRForceGrabber.cs | 2 +- .../Scripts/Core/Grabbers/HVRHandGrabber.cs | 2 +- Assets/Prefabs/FPSCanvas.prefab | 2 +- .../Prefabs/GlobalBoostrap/GameManager.prefab | 48 +++++++ .../GlobalBoostrap/GameManager.prefab.meta | 7 + .../GlobalBoostrap/NetworkManager.prefab | 115 ++++++++++++++++ .../GlobalBoostrap/NetworkManager.prefab.meta | 7 + Assets/Prefabs/{Player.prefab => Rig.prefab} | 126 +++++++++++++++++- .../{Player.prefab.meta => Rig.prefab.meta} | 0 Assets/Resources/ProjectContext.prefab | 8 +- Assets/Scripts/Components/PlayerComponent.cs | 112 ++++++++++++++++ .../Components/PlayerComponent.cs.meta | 11 ++ .../Editor/OdinNetworkBehaviourEditor.cs | 9 ++ .../Editor/OdinNetworkBehaviourEditor.cs.meta | 11 ++ Assets/Scripts/Features/PlayerSpawner.cs | 5 +- Assets/Scripts/Installers/GlobalInstaller.cs | 39 ++++-- Assets/Scripts/Managers/ConnectionManager.cs | 54 ++++++++ .../Managers/ConnectionManager.cs.meta | 11 ++ Assets/Scripts/Managers/GameManager.cs | 27 ++++ Assets/Scripts/Managers/GameManager.cs.meta | 11 ++ Assets/Scripts/Managers/LevelManager.cs | 5 +- Assets/Scripts/Managers/LobbyManager.cs | 8 +- Assets/Scripts/Managers/SceneManager.cs | 6 +- Packages/manifest.json | 1 + Packages/packages-lock.json | 56 +++++++- .../com.unity.services.core/Settings.json | 0 30 files changed, 689 insertions(+), 26 deletions(-) create mode 100644 Assets/Data/CharactersPrefabsList.asset create mode 100644 Assets/Data/CharactersPrefabsList.asset.meta create mode 100644 Assets/Prefabs/GlobalBoostrap/GameManager.prefab create mode 100644 Assets/Prefabs/GlobalBoostrap/GameManager.prefab.meta create mode 100644 Assets/Prefabs/GlobalBoostrap/NetworkManager.prefab create mode 100644 Assets/Prefabs/GlobalBoostrap/NetworkManager.prefab.meta rename Assets/Prefabs/{Player.prefab => Rig.prefab} (85%) rename Assets/Prefabs/{Player.prefab.meta => Rig.prefab.meta} (100%) create mode 100644 Assets/Scripts/Components/PlayerComponent.cs create mode 100644 Assets/Scripts/Components/PlayerComponent.cs.meta create mode 100644 Assets/Scripts/Editor/OdinNetworkBehaviourEditor.cs create mode 100644 Assets/Scripts/Editor/OdinNetworkBehaviourEditor.cs.meta create mode 100644 Assets/Scripts/Managers/ConnectionManager.cs create mode 100644 Assets/Scripts/Managers/ConnectionManager.cs.meta create mode 100644 Assets/Scripts/Managers/GameManager.cs create mode 100644 Assets/Scripts/Managers/GameManager.cs.meta create mode 100644 ProjectSettings/Packages/com.unity.services.core/Settings.json diff --git a/Assets/Data/CharactersPrefabsList.asset b/Assets/Data/CharactersPrefabsList.asset new file mode 100644 index 00000000..1f5ff4c7 --- /dev/null +++ b/Assets/Data/CharactersPrefabsList.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e651dbb3fbac04af2b8f5abf007ddc23, type: 3} + m_Name: CharactersPrefabsList + m_EditorClassIdentifier: + IsDefault: 0 + List: [] diff --git a/Assets/Data/CharactersPrefabsList.asset.meta b/Assets/Data/CharactersPrefabsList.asset.meta new file mode 100644 index 00000000..b6c8a936 --- /dev/null +++ b/Assets/Data/CharactersPrefabsList.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2c64692531864a248971845ac00bf403 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/DefaultNetworkPrefabs.asset b/Assets/DefaultNetworkPrefabs.asset index 9a542039..21f77b7e 100644 --- a/Assets/DefaultNetworkPrefabs.asset +++ b/Assets/DefaultNetworkPrefabs.asset @@ -44,3 +44,9 @@ MonoBehaviour: SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 8466719420925814164, guid: d2f34b93e15cc634590f037ba4513d1a, + type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} diff --git a/Assets/DefaultNetworkPrefabs.asset.meta b/Assets/DefaultNetworkPrefabs.asset.meta index ee33216c..31efe8e3 100644 --- a/Assets/DefaultNetworkPrefabs.asset.meta +++ b/Assets/DefaultNetworkPrefabs.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f29b6a6a1cc1ff044a711de9b8658f91 +guid: 924fc86774a1e664aae9d29e3726d59a NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Assets/HurricaneVR/Framework/Scripts/Core/Grabbers/HVRForceGrabber.cs b/Assets/HurricaneVR/Framework/Scripts/Core/Grabbers/HVRForceGrabber.cs index 185af80d..350ecb56 100644 --- a/Assets/HurricaneVR/Framework/Scripts/Core/Grabbers/HVRForceGrabber.cs +++ b/Assets/HurricaneVR/Framework/Scripts/Core/Grabbers/HVRForceGrabber.cs @@ -103,7 +103,7 @@ namespace HurricaneVR.Framework.Core.Grabbers private bool _canQuickStart; private Coroutine _additionalGrabRoutine; private HVRGrabbableHoverBase _grabIndicator; - private Transform _anchor; + public Transform _anchor; private Rigidbody _forceRB; public float VelocityMagnitude => HandGrabber.HVRTrackedController.VelocityMagnitude; diff --git a/Assets/HurricaneVR/Framework/Scripts/Core/Grabbers/HVRHandGrabber.cs b/Assets/HurricaneVR/Framework/Scripts/Core/Grabbers/HVRHandGrabber.cs index f927c7c2..ff08dcd4 100644 --- a/Assets/HurricaneVR/Framework/Scripts/Core/Grabbers/HVRHandGrabber.cs +++ b/Assets/HurricaneVR/Framework/Scripts/Core/Grabbers/HVRHandGrabber.cs @@ -407,7 +407,7 @@ namespace HurricaneVR.Framework.Core.Grabbers private Vector3 _pusherSize; private bool _pushing; - private GameObject _anchor; + public GameObject _anchor; private Rigidbody _forceRB; private bool _swappingGrabPoint; diff --git a/Assets/Prefabs/FPSCanvas.prefab b/Assets/Prefabs/FPSCanvas.prefab index 872ce3ef..dd4d440a 100644 --- a/Assets/Prefabs/FPSCanvas.prefab +++ b/Assets/Prefabs/FPSCanvas.prefab @@ -236,7 +236,7 @@ MonoBehaviour: m_BlockingObjects: 0 m_BlockingMask: serializedVersion: 2 - m_Bits: 4294967295 + m_Bits: 3147575 --- !u!114 &7696685524349165684 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/GlobalBoostrap/GameManager.prefab b/Assets/Prefabs/GlobalBoostrap/GameManager.prefab new file mode 100644 index 00000000..badd2ff0 --- /dev/null +++ b/Assets/Prefabs/GlobalBoostrap/GameManager.prefab @@ -0,0 +1,48 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &9196927478923670377 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 983229580524670056} + - component: {fileID: 8718694886647119811} + m_Layer: 0 + m_Name: GameManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &983229580524670056 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9196927478923670377} + 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!114 &8718694886647119811 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9196927478923670377} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d357a0b6e2db94a4aadef95ef4fff758, type: 3} + m_Name: + m_EditorClassIdentifier: + playerPrefab: {fileID: 75161255762383020, guid: 1ef3259331ddc1f4d94b628323ec45f3, + type: 3} diff --git a/Assets/Prefabs/GlobalBoostrap/GameManager.prefab.meta b/Assets/Prefabs/GlobalBoostrap/GameManager.prefab.meta new file mode 100644 index 00000000..d614d3e2 --- /dev/null +++ b/Assets/Prefabs/GlobalBoostrap/GameManager.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2069c77fc626bc84581297241f675a5f +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/GlobalBoostrap/NetworkManager.prefab b/Assets/Prefabs/GlobalBoostrap/NetworkManager.prefab new file mode 100644 index 00000000..ea8b2f0e --- /dev/null +++ b/Assets/Prefabs/GlobalBoostrap/NetworkManager.prefab @@ -0,0 +1,115 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8643863892294462044 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3572856719409378894} + - component: {fileID: 8614138672144993884} + - component: {fileID: 1446823875350840172} + - component: {fileID: 4889055508275984978} + m_Layer: 0 + m_Name: NetworkManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3572856719409378894 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8643863892294462044} + 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!114 &8614138672144993884 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8643863892294462044} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 593a2fe42fa9d37498c96f9a383b6521, type: 3} + m_Name: + m_EditorClassIdentifier: + NetworkConfig: + ProtocolVersion: 0 + NetworkTransport: {fileID: 1446823875350840172} + PlayerPrefab: {fileID: 75161255762383020, guid: 1ef3259331ddc1f4d94b628323ec45f3, + type: 3} + Prefabs: + NetworkPrefabsLists: + - {fileID: 11400000, guid: 924fc86774a1e664aae9d29e3726d59a, type: 2} + - {fileID: 11400000, guid: 2c64692531864a248971845ac00bf403, type: 2} + TickRate: 30 + ClientConnectionBufferTimeout: 10 + ConnectionApproval: 0 + ConnectionData: + EnableTimeResync: 0 + TimeResyncInterval: 30 + EnsureNetworkVariableLengthSafety: 0 + EnableSceneManagement: 1 + ForceSamePrefabs: 1 + RecycleNetworkIds: 1 + NetworkIdRecycleDelay: 120 + RpcHashSize: 0 + LoadSceneTimeOut: 120 + SpawnTimeout: 10 + EnableNetworkLogs: 1 + OldPrefabList: [] + RunInBackground: 1 + LogLevel: 1 +--- !u!114 &1446823875350840172 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8643863892294462044} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6960e84d07fb87f47956e7a81d71c4e6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ProtocolType: 0 + m_MaxPacketQueueSize: 128 + m_MaxPayloadSize: 6144 + m_HeartbeatTimeoutMS: 500 + m_ConnectTimeoutMS: 1000 + m_MaxConnectAttempts: 60 + m_DisconnectTimeoutMS: 30000 + ConnectionData: + Address: 127.0.0.1 + Port: 7777 + ServerListenAddress: 127.0.0.1 + DebugSimulator: + PacketDelayMS: 0 + PacketJitterMS: 0 + PacketDropRate: 0 +--- !u!114 &4889055508275984978 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8643863892294462044} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cb16de57aad3ebe42bb3df246dc58d5f, type: 3} + m_Name: + m_EditorClassIdentifier: + networkManager: {fileID: 8614138672144993884} diff --git a/Assets/Prefabs/GlobalBoostrap/NetworkManager.prefab.meta b/Assets/Prefabs/GlobalBoostrap/NetworkManager.prefab.meta new file mode 100644 index 00000000..97a5c857 --- /dev/null +++ b/Assets/Prefabs/GlobalBoostrap/NetworkManager.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e8280dda5c459694abfafb8c0b53f20d +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Rig.prefab similarity index 85% rename from Assets/Prefabs/Player.prefab rename to Assets/Prefabs/Rig.prefab index 46f0d528..7b2d2d63 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Rig.prefab @@ -26,7 +26,7 @@ PrefabInstance: - target: {fileID: 3924027509722682562, guid: 6974999791dc8804fafee05e319aa932, type: 3} propertyPath: m_Name - value: Player + value: Rig objectReference: {fileID: 0} - target: {fileID: 3924027509722682573, guid: 6974999791dc8804fafee05e319aa932, type: 3} @@ -261,6 +261,18 @@ PrefabInstance: insertIndex: 0 addedObject: {fileID: 6067009970240072242} m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 3924027509722682562, guid: 6974999791dc8804fafee05e319aa932, + type: 3} + insertIndex: -1 + addedObject: {fileID: 8161488319454453882} + - targetCorrespondingSourceObject: {fileID: 3924027509722682562, guid: 6974999791dc8804fafee05e319aa932, + type: 3} + insertIndex: -1 + addedObject: {fileID: -510423355628046216} + - targetCorrespondingSourceObject: {fileID: 3924027509007222379, guid: 6974999791dc8804fafee05e319aa932, + type: 3} + insertIndex: -1 + addedObject: {fileID: 919562643048463062} - targetCorrespondingSourceObject: {fileID: 3924027509387932073, guid: 6974999791dc8804fafee05e319aa932, type: 3} insertIndex: -1 @@ -280,6 +292,106 @@ Transform: type: 3} m_PrefabInstance: {fileID: 3999184345544213614} m_PrefabAsset: {fileID: 0} +--- !u!1 &75161255762383020 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3924027509722682562, guid: 6974999791dc8804fafee05e319aa932, + type: 3} + m_PrefabInstance: {fileID: 3999184345544213614} + m_PrefabAsset: {fileID: 0} +--- !u!114 &8161488319454453882 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75161255762383020} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3394388680 + InScenePlacedSourceGlobalObjectIdHash: 0 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &-510423355628046216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75161255762383020} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 983bb31c4dab2d84b857006f5099d030, type: 3} + m_Name: + m_EditorClassIdentifier: + networkObject: {fileID: 8161488319454453882} + teleporter: {fileID: 1079194777950654091} + controller: {fileID: 75161257133195801} + characterController: {fileID: 75161257133195802} + fadeDuration: 2 + gameManager: {fileID: 0} +--- !u!1 &75161257133195781 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3924027509007222379, guid: 6974999791dc8804fafee05e319aa932, + type: 3} + m_PrefabInstance: {fileID: 3999184345544213614} + m_PrefabAsset: {fileID: 0} +--- !u!114 &919562643048463062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75161257133195781} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 405ed07ae7c26a141bac0d303d0a347a, type: 3} + m_Name: + m_EditorClassIdentifier: + UseUnreliableDeltas: 0 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 0 + SyncScaleY: 0 + SyncScaleZ: 0 + PositionThreshold: 0.001 + RotAngleThreshold: 0.01 + ScaleThreshold: 0.01 + UseQuaternionSynchronization: 0 + UseQuaternionCompression: 0 + UseHalfFloatPrecision: 0 + InLocalSpace: 0 + Interpolate: 1 + SlerpPosition: 0 +--- !u!114 &75161257133195801 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 3924027509007222391, guid: 6974999791dc8804fafee05e319aa932, + type: 3} + m_PrefabInstance: {fileID: 3999184345544213614} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75161257133195781} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df32767e580c4d24a3d3c9ed3026afd0, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!143 &75161257133195802 stripped +CharacterController: + m_CorrespondingSourceObject: {fileID: 3924027509007222388, guid: 6974999791dc8804fafee05e319aa932, + type: 3} + m_PrefabInstance: {fileID: 3999184345544213614} + m_PrefabAsset: {fileID: 0} --- !u!1 &75161257574593991 stripped GameObject: m_CorrespondingSourceObject: {fileID: 3924027509387932073, guid: 6974999791dc8804fafee05e319aa932, @@ -342,6 +454,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6953a3149e8e4d1468962577608f0002, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!114 &1079194777950654091 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4144970921230453477, guid: 6974999791dc8804fafee05e319aa932, + type: 3} + m_PrefabInstance: {fileID: 3999184345544213614} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75161257133195781} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ddcc26ecb5c24116a2b1c03eaeeef771, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!4 &1237592639017424508 stripped Transform: m_CorrespondingSourceObject: {fileID: 2761615919136559634, guid: 6974999791dc8804fafee05e319aa932, diff --git a/Assets/Prefabs/Player.prefab.meta b/Assets/Prefabs/Rig.prefab.meta similarity index 100% rename from Assets/Prefabs/Player.prefab.meta rename to Assets/Prefabs/Rig.prefab.meta diff --git a/Assets/Resources/ProjectContext.prefab b/Assets/Resources/ProjectContext.prefab index b96e9518..65ac85ca 100644 --- a/Assets/Resources/ProjectContext.prefab +++ b/Assets/Resources/ProjectContext.prefab @@ -78,7 +78,11 @@ MonoBehaviour: type: 3} hvrGlobalPrefab: {fileID: 4013254746517429689, guid: a03ed519be01d1440a8ec63d2ac101f7, type: 3} - playerPrefab: {fileID: 75161255762383020, guid: 1ef3259331ddc1f4d94b628323ec45f3, - type: 3} sceneManagerPrefab: {fileID: 9083120132262756458, guid: 195c448c3b94b5f47a2aa13187a0bc99, type: 3} + networkManagerPrefab: {fileID: 8643863892294462044, guid: e8280dda5c459694abfafb8c0b53f20d, + type: 3} + gameManagerPrefab: {fileID: 9196927478923670377, guid: 2069c77fc626bc84581297241f675a5f, + type: 3} + playerPrefab: {fileID: 75161255762383020, guid: 1ef3259331ddc1f4d94b628323ec45f3, + type: 3} diff --git a/Assets/Scripts/Components/PlayerComponent.cs b/Assets/Scripts/Components/PlayerComponent.cs new file mode 100644 index 00000000..25e973b8 --- /dev/null +++ b/Assets/Scripts/Components/PlayerComponent.cs @@ -0,0 +1,112 @@ +using HurricaneVR.Framework.Components; +using HurricaneVR.Framework.Core.Player; +using Meta.XR.MultiplayerBlocks.NGO; +using Sirenix.OdinInspector; +using System.Collections; +using System.Collections.Generic; +using Unity.Netcode; +using Unity.Netcode.Components; +using Unity.VisualScripting; +using UnityEngine; +using UnityEngine.Rendering.Universal; +using Zenject; +using static Unity.Burst.Intrinsics.X86.Avx; + +public class PlayerComponent : NetworkBehaviour +{ + [SerializeField] + private NetworkObject networkObject; + + [SerializeField] + private HVRTeleporter teleporter; + + [SerializeField] + private HVRPlayerController controller; + + [SerializeField] + private CharacterController characterController; + + [ReadOnly] + [SerializeField] + private float fadeDuration = 2f; + + [SerializeField] + public GameManager gameManager; + + public Vector3 Position + { + get { return controller.transform.position; } + } + + public Vector3 Rotation + { + get { return controller.transform.eulerAngles; } + } + + public override void OnNetworkSpawn() + { + base.OnNetworkSpawn(); + + name = $"Player - {networkObject.OwnerClientId}" + + (networkObject.IsLocalPlayer ? " (local)" : ""); + + if (!networkObject.IsOwner) + { + StartCoroutine(DestroyMultiplayerComponents()); + } + } + + private IEnumerator DestroyMultiplayerComponents() + { + yield return new WaitForEndOfFrame(); + + DestroyDependencies(); + + foreach (var t in new[] + { + typeof(UniversalAdditionalCameraData), + }) + { + foreach (var component in GetComponentsInChildren(t)) + { + Destroy(component); + } + } + + controller.RemoveMultiplayerComponents(); + } + + public void DestroyDependencies() + { + Destroy(controller.RightHand.ForceGrabber._anchor.gameObject); + Destroy(controller.LeftHand.ForceGrabber._anchor.gameObject); + Destroy(controller.LeftHand._anchor); + Destroy(controller.RightHand._anchor); + } + + public void DestroyWithDependencies() + { + DestroyDependencies(); + Destroy(gameObject); + } + + public void Teleport(Vector3 position, Vector3 direction) + { + teleporter.Teleport(position, direction); + } + + public void FadeScreen(float to, float duration) + { + controller.ScreenFader.Fade(to, duration); + } + + public void FadeIn() + { + controller.ScreenFader.Fade(1, fadeDuration); + } + + public void FadeOut() + { + controller.ScreenFader.Fade(0, fadeDuration); + } +} diff --git a/Assets/Scripts/Components/PlayerComponent.cs.meta b/Assets/Scripts/Components/PlayerComponent.cs.meta new file mode 100644 index 00000000..1b20d233 --- /dev/null +++ b/Assets/Scripts/Components/PlayerComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 983bb31c4dab2d84b857006f5099d030 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/OdinNetworkBehaviourEditor.cs b/Assets/Scripts/Editor/OdinNetworkBehaviourEditor.cs new file mode 100644 index 00000000..606b81a8 --- /dev/null +++ b/Assets/Scripts/Editor/OdinNetworkBehaviourEditor.cs @@ -0,0 +1,9 @@ +using Sirenix.OdinInspector.Editor; +using System.Collections; +using System.Collections.Generic; +using Unity.Netcode; +using UnityEditor; +using UnityEngine; + +[CustomEditor(typeof(NetworkBehaviour), true)] +public class OdinNetworkBehaviourEditor : OdinEditor { } diff --git a/Assets/Scripts/Editor/OdinNetworkBehaviourEditor.cs.meta b/Assets/Scripts/Editor/OdinNetworkBehaviourEditor.cs.meta new file mode 100644 index 00000000..a0315bfc --- /dev/null +++ b/Assets/Scripts/Editor/OdinNetworkBehaviourEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e4a312837e470c54faa1f6a28f0a201e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Features/PlayerSpawner.cs b/Assets/Scripts/Features/PlayerSpawner.cs index f099b893..87bfcd7e 100644 --- a/Assets/Scripts/Features/PlayerSpawner.cs +++ b/Assets/Scripts/Features/PlayerSpawner.cs @@ -19,8 +19,9 @@ public class PlayerSpawner : MonoBehaviour .ToArray(); } - public void Spawn(GameObject player) + public void Spawn(PlayerComponent player) { - player.GetComponent().Teleport(spawns.First().position); + var spawn = spawns.First(); + player.Teleport(spawn.position, spawn.eulerAngles); } } diff --git a/Assets/Scripts/Installers/GlobalInstaller.cs b/Assets/Scripts/Installers/GlobalInstaller.cs index ccf54fcf..4813d782 100644 --- a/Assets/Scripts/Installers/GlobalInstaller.cs +++ b/Assets/Scripts/Installers/GlobalInstaller.cs @@ -1,13 +1,12 @@ using HurricaneVR.Framework.Core; using HurricaneVR.Framework.Core.Player; using HurricaneVR.Framework.Core.Utils; +using Unity.Netcode; using UnityEngine; using Zenject; public class GlobalInstaller : MonoInstaller { - - [SerializeField] private GameObject musicPlayerPrefab; @@ -15,10 +14,16 @@ public class GlobalInstaller : MonoInstaller private GameObject hvrGlobalPrefab; [SerializeField] - private GameObject playerPrefab; + private GameObject sceneManagerPrefab; [SerializeField] - private GameObject sceneManagerPrefab; + private GameObject networkManagerPrefab; + + [SerializeField] + private GameObject gameManagerPrefab; + + [SerializeField] + private GameObject playerPrefab; public override void Start() { @@ -46,12 +51,12 @@ public class GlobalInstaller : MonoInstaller }) .NonLazy(); - Container.Bind() - .FromComponentInNewPrefab(playerPrefab) + Container.Bind() + .FromComponentInNewPrefab(gameManagerPrefab) .AsSingle() - .OnInstantiated((ctx, obj) => + .OnInstantiated((ctx, obj) => { - obj.transform.parent.name = playerPrefab.name; + obj.name = gameManagerPrefab.name; }) .NonLazy(); @@ -63,5 +68,23 @@ public class GlobalInstaller : MonoInstaller obj.name = sceneManagerPrefab.name; }) .NonLazy(); + + Container.Bind() + .FromComponentInNewPrefab(networkManagerPrefab) + .AsSingle() + .OnInstantiated((ctx, obj) => + { + obj.name = networkManagerPrefab.name; + }) + .NonLazy(); + + Container.Bind() + .FromComponentInNewPrefab(playerPrefab) + .AsSingle() + .OnInstantiated((ctx, obj) => + { + obj.name = playerPrefab.name; + }) + .NonLazy(); } } \ No newline at end of file diff --git a/Assets/Scripts/Managers/ConnectionManager.cs b/Assets/Scripts/Managers/ConnectionManager.cs new file mode 100644 index 00000000..bb975621 --- /dev/null +++ b/Assets/Scripts/Managers/ConnectionManager.cs @@ -0,0 +1,54 @@ +using Sirenix.OdinInspector; +using System.Collections; +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; +using Zenject; + +public class ConnectionManager : NetworkBehaviour +{ + [SerializeField] + private NetworkManager networkManager; + + [Inject] + [SerializeField] + [ReadOnly] + private GameManager gameManager; + + private void Start() + { + networkManager.OnClientConnectedCallback += OnClientConnectedCallback; + networkManager.OnClientDisconnectCallback += OnClientDisconnectCallback; + } + + private void OnClientConnectedCallback(ulong clientId) + { + Debug.Log($"Client-{clientId} is connected and can spawn {nameof(NetworkObject)}s."); + + if (networkManager.LocalClientId == clientId) + { + StartCoroutine(SpawnLocalPlayer()); + } + } + + private IEnumerator SpawnLocalPlayer() + { + yield return new WaitForEndOfFrame(); + + var playerObject = networkManager.LocalClient.PlayerObject; + var player = playerObject.GetComponent(); + player.gameManager = gameManager; + gameManager.PlayerSpawnedOnNetwork(player); + yield return null; + } + + private void OnClientDisconnectCallback(ulong clientId) + { + Debug.Log($"Client-{clientId} is disconnected and can spawn {nameof(NetworkObject)}s."); + + if (networkManager.LocalClientId == clientId) + { + + } + } +} diff --git a/Assets/Scripts/Managers/ConnectionManager.cs.meta b/Assets/Scripts/Managers/ConnectionManager.cs.meta new file mode 100644 index 00000000..142e7aa3 --- /dev/null +++ b/Assets/Scripts/Managers/ConnectionManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb16de57aad3ebe42bb3df246dc58d5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Managers/GameManager.cs b/Assets/Scripts/Managers/GameManager.cs new file mode 100644 index 00000000..c6e64ed8 --- /dev/null +++ b/Assets/Scripts/Managers/GameManager.cs @@ -0,0 +1,27 @@ +using Sirenix.OdinInspector; +using System.Collections; +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; +using Zenject; + +public class GameManager : NetworkBehaviour +{ + [SerializeField] + [ReadOnly] + [Inject] + private PlayerComponent localPlayer; + public PlayerComponent LocalPlayer { + get { return localPlayer; } + } + + public void PlayerSpawnedOnNetwork(PlayerComponent player) + { + if (player.IsLocalPlayer) + { + player.Teleport(localPlayer.Position, localPlayer.Rotation); + localPlayer.DestroyWithDependencies(); + localPlayer = player; + } + } +} diff --git a/Assets/Scripts/Managers/GameManager.cs.meta b/Assets/Scripts/Managers/GameManager.cs.meta new file mode 100644 index 00000000..8f3de9ba --- /dev/null +++ b/Assets/Scripts/Managers/GameManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d357a0b6e2db94a4aadef95ef4fff758 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Managers/LevelManager.cs b/Assets/Scripts/Managers/LevelManager.cs index 9b787f32..2a36fde5 100644 --- a/Assets/Scripts/Managers/LevelManager.cs +++ b/Assets/Scripts/Managers/LevelManager.cs @@ -33,7 +33,7 @@ public class LevelManager : MonoBehaviour [Inject] [SerializeField] [ReadOnly] - private HVRPlayerController playerController; + private GameManager gameManager; private void Start() { @@ -44,7 +44,8 @@ public class LevelManager : MonoBehaviour musicManager.Play(level.pauseClip); } - playerSpawner.Spawn(playerController.gameObject); + var player = gameManager.LocalPlayer; + playerSpawner.Spawn(player); } public void OnEnemyReachedFinish(EnemyComponent enemy) diff --git a/Assets/Scripts/Managers/LobbyManager.cs b/Assets/Scripts/Managers/LobbyManager.cs index 86b89d1b..83ac111a 100644 --- a/Assets/Scripts/Managers/LobbyManager.cs +++ b/Assets/Scripts/Managers/LobbyManager.cs @@ -2,10 +2,11 @@ using HurricaneVR.Framework.Core.Player; using Sirenix.OdinInspector; using System.Collections; using System.Collections.Generic; +using Unity.Netcode; using UnityEngine; using Zenject; -public class LobbyManager : MonoBehaviour +public class LobbyManager : NetworkBehaviour { [Inject] [SerializeField] @@ -20,7 +21,7 @@ public class LobbyManager : MonoBehaviour [Inject] [SerializeField] [ReadOnly] - private HVRPlayerController playerController; + private GameManager gameManager; [SerializeField] private AudioClip backgroundMusicClip; @@ -29,6 +30,7 @@ public class LobbyManager : MonoBehaviour { musicManager.Play(backgroundMusicClip); - playerSpawner.Spawn(playerController.gameObject); + var player = gameManager.LocalPlayer; + playerSpawner.Spawn(player); } } diff --git a/Assets/Scripts/Managers/SceneManager.cs b/Assets/Scripts/Managers/SceneManager.cs index 6674f9eb..9274385b 100644 --- a/Assets/Scripts/Managers/SceneManager.cs +++ b/Assets/Scripts/Managers/SceneManager.cs @@ -18,7 +18,7 @@ public class SceneManager : MonoBehaviour [Inject] [ReadOnly] [SerializeField] - private HVRPlayerController playerController; + private GameManager gameManager; [ReadOnly] [SerializeField] @@ -36,7 +36,7 @@ public class SceneManager : MonoBehaviour private IEnumerator SwitchToScene(Scene scene) { - playerController.ScreenFader.Fade(1, fadeDuration); + gameManager.LocalPlayer.FadeScreen(1, fadeDuration); var operation = UnityEngine.SceneManagement.SceneManager .LoadSceneAsync((int)scene); @@ -55,6 +55,6 @@ public class SceneManager : MonoBehaviour this.scene = scene; - playerController.ScreenFader.Fade(0, fadeDuration); + gameManager.LocalPlayer.FadeScreen(0, fadeDuration); } } diff --git a/Packages/manifest.json b/Packages/manifest.json index 2de57e83..2388a162 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -8,6 +8,7 @@ "com.unity.inputsystem": "1.7.0", "com.unity.netcode.gameobjects": "1.10.0", "com.unity.render-pipelines.universal": "14.0.11", + "com.unity.services.relay": "1.1.1", "com.unity.test-framework": "1.1.33", "com.unity.textmeshpro": "3.0.6", "com.unity.timeline": "1.7.6", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index f3342bff..2fa2fde6 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -198,7 +198,7 @@ }, "com.unity.nuget.newtonsoft-json": { "version": "3.2.1", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -241,6 +241,60 @@ "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.services.authentication": { + "version": "2.7.4", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.nuget.newtonsoft-json": "3.2.1", + "com.unity.services.core": "1.12.5", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.services.core": { + "version": "1.12.5", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.nuget.newtonsoft-json": "3.2.1", + "com.unity.modules.androidjni": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.services.qos": { + "version": "1.3.2", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.services.core": "1.12.5", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.nuget.newtonsoft-json": "3.0.2", + "com.unity.services.authentication": "2.7.4", + "com.unity.collections": "1.2.4" + }, + "url": "https://packages.unity.com" + }, + "com.unity.services.relay": { + "version": "1.1.1", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.services.core": "1.12.5", + "com.unity.services.authentication": "2.7.4", + "com.unity.services.qos": "1.3.2", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.nuget.newtonsoft-json": "3.0.2", + "com.unity.transport": "1.3.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.shadergraph": { "version": "14.0.11", "depth": 1, diff --git a/ProjectSettings/Packages/com.unity.services.core/Settings.json b/ProjectSettings/Packages/com.unity.services.core/Settings.json new file mode 100644 index 00000000..e69de29b