Implement player network spawning and position synchronization

This commit is contained in:
2024-08-25 17:43:19 +02:00
parent 6e037b4d06
commit b05cab8288
30 changed files with 689 additions and 26 deletions

View File

@@ -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: []

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2c64692531864a248971845ac00bf403
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: f29b6a6a1cc1ff044a711de9b8658f91
guid: 924fc86774a1e664aae9d29e3726d59a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 2069c77fc626bc84581297241f675a5f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e8280dda5c459694abfafb8c0b53f20d
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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,

View File

@@ -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}

View File

@@ -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);
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 983bb31c4dab2d84b857006f5099d030
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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 { }

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e4a312837e470c54faa1f6a28f0a201e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -19,8 +19,9 @@ public class PlayerSpawner : MonoBehaviour
.ToArray();
}
public void Spawn(GameObject player)
public void Spawn(PlayerComponent player)
{
player.GetComponent<HVRTeleporter>().Teleport(spawns.First().position);
var spawn = spawns.First();
player.Teleport(spawn.position, spawn.eulerAngles);
}
}

View File

@@ -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<HVRPlayerController>()
.FromComponentInNewPrefab(playerPrefab)
Container.Bind<GameManager>()
.FromComponentInNewPrefab(gameManagerPrefab)
.AsSingle()
.OnInstantiated<HVRPlayerController>((ctx, obj) =>
.OnInstantiated<GameManager>((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<NetworkManager>()
.FromComponentInNewPrefab(networkManagerPrefab)
.AsSingle()
.OnInstantiated<NetworkManager>((ctx, obj) =>
{
obj.name = networkManagerPrefab.name;
})
.NonLazy();
Container.Bind<PlayerComponent>()
.FromComponentInNewPrefab(playerPrefab)
.AsSingle()
.OnInstantiated<PlayerComponent>((ctx, obj) =>
{
obj.name = playerPrefab.name;
})
.NonLazy();
}
}

View File

@@ -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<PlayerComponent>();
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)
{
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cb16de57aad3ebe42bb3df246dc58d5f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d357a0b6e2db94a4aadef95ef4fff758
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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)

View File

@@ -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);
}
}

View File

@@ -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);
}
}