Skip to content

Commit fa8a9a7

Browse files
committed
Add networked player data and lobby UI integration
Introduces SessionPlayerData for networked player name synchronization and adds PlayerData prefab. Refactors GameBootstrap to manage network runner and player spawning, and updates MainMenuHUDController for login and lobby flows. Adds new lobby UI panel and login overlay, updates scene and camera setup, and improves UI styles for login and lobby panels.
1 parent cee1941 commit fa8a9a7

File tree

20 files changed

+804
-174
lines changed

20 files changed

+804
-174
lines changed

Red Strike/Assets/MainMenuSystem/MainMenu.cs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using UnityEngine;
44
using GameSettings;
55
using NetworkingSystem;
6+
using UserSystem;
67

78
namespace MainMenuSystem
89
{
@@ -16,6 +17,7 @@ public class MainMenu : MonoBehaviour
1617
public float planetRotationSpeed = 30f;
1718

1819
[Header("Cinemachine Cameras")]
20+
public CinemachineCamera cinemachineCamera_Login;
1921
public CinemachineCamera cinemachineCamera_Main;
2022
public CinemachineCamera cinemachineCamera_Options;
2123
public CinemachineCamera cinemachineCamera_Credits;
@@ -28,12 +30,6 @@ public class MainMenu : MonoBehaviour
2830

2931
[Header("System References")]
3032
public Settings settings;
31-
private GameBootstrap gameBootstrap;
32-
33-
private void Awake()
34-
{
35-
gameBootstrap = GetComponent<GameBootstrap>();
36-
}
3733

3834
private void Start()
3935
{
@@ -42,7 +38,7 @@ private void Start()
4238
spaceShip.transform.position = shipStartPosition;
4339
}
4440

45-
SwitchToCamera(CameraState.Main);
41+
if (GameBootstrap.Instance != null) GameBootstrap.Instance.LocalPlayerName = GetComponent<UserManager>()?.GetUserName();
4642
}
4743

4844
private void Update()
@@ -58,16 +54,20 @@ private void Update()
5854
}
5955
}
6056

61-
public enum CameraState { Main, Options, Credits }
57+
public enum CameraState { Login, Main, Options, Credits }
6258

6359
public void SwitchToCamera(CameraState state)
6460
{
61+
cinemachineCamera_Login.Priority = 0;
6562
cinemachineCamera_Main.Priority = 0;
6663
cinemachineCamera_Options.Priority = 0;
6764
cinemachineCamera_Credits.Priority = 0;
6865

6966
switch (state)
7067
{
68+
case CameraState.Login:
69+
cinemachineCamera_Login.Priority = 10;
70+
break;
7171
case CameraState.Main:
7272
cinemachineCamera_Main.Priority = 10;
7373
break;
@@ -80,16 +80,6 @@ public void SwitchToCamera(CameraState state)
8080
}
8181
}
8282

83-
public void StartGameAsHost()
84-
{
85-
StartCoroutine(LaunchSequence(() => gameBootstrap.StartHost()));
86-
}
87-
88-
public void StartGameAsClient()
89-
{
90-
StartCoroutine(LaunchSequence(() => gameBootstrap.StartClient()));
91-
}
92-
9383
private IEnumerator LaunchSequence(System.Action onComplete)
9484
{
9585
if (cinemachineCamera_Main != null && spaceShip != null)

Red Strike/Assets/NetworkingSystem/CommanderData.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,10 @@ public void RPC_SpawnVehicle(string vehicleName, Vector3 position)
111111

112112
[Rpc(RpcSources.InputAuthority, RpcTargets.StateAuthority)]
113113
public void RPC_SpawnAmmunition(
114-
string ammunitionName,
115-
Vector3 position,
116-
Quaternion rotation,
117-
NetworkObject ownerVehicleNetObj,
114+
string ammunitionName,
115+
Vector3 position,
116+
Quaternion rotation,
117+
NetworkObject ownerVehicleNetObj,
118118
NetworkId targetId = default)
119119
{
120120
if (Runner == null || !Runner.IsServer) return;
@@ -145,7 +145,7 @@ public void RPC_SpawnAmmunition(
145145
}
146146
}
147147

148-
[Rpc(RpcSources.StateAuthority, RpcTargets.All)]
148+
[Rpc(RpcSources.StateAuthority, RpcTargets.All)]
149149
public void RPC_SpawnExplosionEffect(Vector3 position)
150150
{
151151
if (InputController.InputController.Instance == null) return;
@@ -156,8 +156,8 @@ public void RPC_SpawnExplosionEffect(Vector3 position)
156156
if (explosionEffectPrefab != null)
157157
{
158158
GameObject effect = Instantiate(explosionEffectPrefab, position, Quaternion.identity);
159-
160-
Destroy(effect, 3f);
159+
160+
Destroy(effect, 3f);
161161
}
162162
}
163163

Lines changed: 63 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,86 @@
11
using UnityEngine;
22
using Fusion;
3-
using System.Threading.Tasks;
3+
using Fusion.Sockets;
4+
using System.Collections.Generic;
5+
using System;
46

57
namespace NetworkingSystem
68
{
7-
public class GameBootstrap : MonoBehaviour
9+
public class GameBootstrap : MonoBehaviour, INetworkRunnerCallbacks
810
{
9-
[Header("Fusion Ayarları")]
10-
[SerializeField] private NetworkRunner _networkRunnerPrefab;
11+
public static GameBootstrap Instance;
1112

12-
[SerializeField] private int _gameSceneIndex = 1;
13+
public string LocalPlayerName { get; set; } = "Unknown";
1314

14-
private async Task StartGame(GameMode mode)
15+
[Header("Ayarlar")]
16+
public NetworkRunner networkRunnerPrefab;
17+
public NetworkPrefabRef playerDataPrefab;
18+
public int gameSceneIndex = 1;
19+
20+
private NetworkRunner _runner;
21+
22+
private void Awake()
23+
{
24+
if (Instance == null)
25+
{
26+
Instance = this;
27+
DontDestroyOnLoad(gameObject);
28+
}
29+
else
30+
{
31+
Destroy(gameObject);
32+
}
33+
}
34+
35+
public async void StartGame(GameMode mode, string sessionName)
1536
{
16-
NetworkRunner runner = Instantiate(_networkRunnerPrefab);
37+
if (_runner != null) Destroy(_runner.gameObject);
1738

18-
runner.name = "NetworkRunner_Session";
19-
DontDestroyOnLoad(runner);
39+
_runner = Instantiate(networkRunnerPrefab);
40+
_runner.name = "FusionRunner";
41+
DontDestroyOnLoad(_runner);
42+
_runner.AddCallbacks(this);
2043

21-
var sceneManager = runner.GetComponent<NetworkSceneManagerDefault>();
44+
var sceneManager = _runner.GetComponent<NetworkSceneManagerDefault>();
45+
if (sceneManager == null) sceneManager = _runner.gameObject.AddComponent<NetworkSceneManagerDefault>();
2246

23-
await runner.StartGame(new StartGameArgs()
47+
await _runner.StartGame(new StartGameArgs()
2448
{
2549
GameMode = mode,
26-
SessionName = "UzaySavasiOda1",
27-
Scene = SceneRef.FromIndex(_gameSceneIndex),
50+
SessionName = sessionName,
51+
Scene = SceneRef.FromIndex(gameSceneIndex),
2852
SceneManager = sceneManager,
2953
PlayerCount = 2,
3054
});
3155
}
3256

33-
public async void StartHost()
57+
public void OnPlayerJoined(NetworkRunner runner, PlayerRef player)
3458
{
35-
await StartGame(GameMode.Host);
59+
if (runner.IsServer)
60+
{
61+
runner.Spawn(playerDataPrefab, Vector3.zero, Quaternion.identity, player);
62+
}
3663
}
3764

38-
public async void StartClient()
39-
{
40-
await StartGame(GameMode.Client);
41-
}
65+
public void OnPlayerLeft(NetworkRunner runner, PlayerRef player) { }
66+
public void OnInput(NetworkRunner runner, NetworkInput input) { }
67+
public void OnInputMissing(NetworkRunner runner, PlayerRef player, NetworkInput input) { }
68+
public void OnShutdown(NetworkRunner runner, ShutdownReason shutdownReason) { }
69+
public void OnConnectedToServer(NetworkRunner runner) { }
70+
public void OnConnectRequest(NetworkRunner runner, NetworkRunnerCallbackArgs.ConnectRequest request, byte[] token) { }
71+
public void OnConnectFailed(NetworkRunner runner, NetAddress remoteAddress, NetConnectFailedReason reason) { }
72+
public void OnUserSimulationMessage(NetworkRunner runner, SimulationMessagePtr message) { }
73+
public void OnSessionListUpdated(NetworkRunner runner, List<SessionInfo> sessionList) { }
74+
public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> data) { }
75+
public void OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) { }
76+
public void OnSceneLoadDone(NetworkRunner runner) { }
77+
public void OnSceneLoadStart(NetworkRunner runner) { }
78+
public void OnObjectExitAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) { }
79+
public void OnObjectEnterAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) { }
80+
#pragma warning disable UNT0006
81+
public void OnDisconnectedFromServer(NetworkRunner runner, NetDisconnectReason reason) { }
82+
#pragma warning restore UNT0006
83+
public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ReliableKey key, ArraySegment<byte> data) { }
84+
public void OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress) { }
4285
}
43-
}
86+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using Fusion;
2+
using UnityEngine;
3+
using UISystem;
4+
5+
namespace NetworkingSystem
6+
{
7+
public class SessionPlayerData : NetworkBehaviour
8+
{
9+
[Networked] public NetworkString<_32> SyncedName { get; set; }
10+
11+
private ChangeDetector _changes;
12+
13+
public override void Spawned()
14+
{
15+
_changes = GetChangeDetector(ChangeDetector.Source.SimulationState);
16+
17+
if (Object.HasInputAuthority)
18+
{
19+
if (GameBootstrap.Instance != null)
20+
{
21+
SyncedName = GameBootstrap.Instance.LocalPlayerName;
22+
}
23+
else
24+
{
25+
SyncedName = $"Commander {Object.InputAuthority.PlayerId}";
26+
}
27+
}
28+
29+
UpdateHUD();
30+
}
31+
32+
public override void Render()
33+
{
34+
foreach (var change in _changes.DetectChanges(this))
35+
{
36+
if (change == nameof(SyncedName))
37+
{
38+
UpdateHUD();
39+
}
40+
}
41+
}
42+
43+
private void UpdateHUD()
44+
{
45+
var hud = FindFirstObjectByType<DeploymentMonitorHUDController>();
46+
47+
if (hud != null)
48+
{
49+
int playerIndex = (Object.InputAuthority.PlayerId == 1) ? 1 : 2;
50+
hud.UpdatePlayerName(playerIndex, SyncedName.ToString());
51+
}
52+
}
53+
}
54+
}

Red Strike/Assets/NetworkingSystem/SessionPlayerData.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Red Strike/Assets/PlanetAtmosphereSystem/AtmosphereMaterial.mat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Material:
4747
- _GunesYonu: {r: -0.91, g: 0.4, b: 3.24, a: 0}
4848
- _RenkUzak: {r: 0, g: 0.10166844, b: 2.152374, a: 1}
4949
- _RenkYakin: {r: 0, g: 5.670685, b: 8, a: 1}
50-
- _SunDirection: {r: -0.05539332, g: -0.9330967, b: 0.35533378, a: 0}
50+
- _SunDirection: {r: -0.057937633, g: -0.926762, b: 0.37115443, a: 0}
5151
m_BuildTextureStacks: []
5252
m_AllowLocking: 1
5353
--- !u!114 &1522106816477559216

Red Strike/Assets/PlanetAtmosphereSystem/CloudMaterial.mat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Material:
4343
m_Colors:
4444
- _Color: {r: 0, g: 3.8274493, b: 5.992155, a: 1}
4545
- _GunesYonu: {r: -1, g: 0, b: 0, a: 0}
46-
- _SunDirection: {r: -0.05539332, g: -0.9330967, b: 0.35533378, a: 0}
46+
- _SunDirection: {r: -0.057937633, g: -0.926762, b: 0.37115443, a: 0}
4747
m_BuildTextureStacks: []
4848
m_AllowLocking: 1
4949
--- !u!114 &8499732345945835446

Red Strike/Assets/PlanetAtmosphereSystem/FogMaterial.mat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,6 @@ Material:
5454
- _QueueControl: 0
5555
- _QueueOffset: 0
5656
m_Colors:
57-
- _SunDirection: {r: -0.05539332, g: -0.9330967, b: 0.35533378, a: 0}
57+
- _SunDirection: {r: -0.057937633, g: -0.926762, b: 0.37115443, a: 0}
5858
m_BuildTextureStacks: []
5959
m_AllowLocking: 1
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!1 &6900432630177168104
4+
GameObject:
5+
m_ObjectHideFlags: 0
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInstance: {fileID: 0}
8+
m_PrefabAsset: {fileID: 0}
9+
serializedVersion: 6
10+
m_Component:
11+
- component: {fileID: 4681179705426267902}
12+
- component: {fileID: 1543219089720780147}
13+
- component: {fileID: 6396542536641275537}
14+
m_Layer: 0
15+
m_Name: PlayerData
16+
m_TagString: Untagged
17+
m_Icon: {fileID: 0}
18+
m_NavMeshLayer: 0
19+
m_StaticEditorFlags: 0
20+
m_IsActive: 1
21+
--- !u!4 &4681179705426267902
22+
Transform:
23+
m_ObjectHideFlags: 0
24+
m_CorrespondingSourceObject: {fileID: 0}
25+
m_PrefabInstance: {fileID: 0}
26+
m_PrefabAsset: {fileID: 0}
27+
m_GameObject: {fileID: 6900432630177168104}
28+
serializedVersion: 2
29+
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
30+
m_LocalPosition: {x: 0, y: 0, z: 0}
31+
m_LocalScale: {x: 1, y: 1, z: 1}
32+
m_ConstrainProportionsScale: 0
33+
m_Children: []
34+
m_Father: {fileID: 0}
35+
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
36+
--- !u!114 &1543219089720780147
37+
MonoBehaviour:
38+
m_ObjectHideFlags: 0
39+
m_CorrespondingSourceObject: {fileID: 0}
40+
m_PrefabInstance: {fileID: 0}
41+
m_PrefabAsset: {fileID: 0}
42+
m_GameObject: {fileID: 6900432630177168104}
43+
m_Enabled: 1
44+
m_EditorHideFlags: 0
45+
m_Script: {fileID: -1552182283, guid: e725a070cec140c4caffb81624c8c787, type: 3}
46+
m_Name:
47+
m_EditorClassIdentifier:
48+
SortKey: 3705471102
49+
ObjectInterest: 1
50+
Flags: 262145
51+
NestedObjects: []
52+
NetworkedBehaviours:
53+
- {fileID: 6396542536641275537}
54+
ForceRemoteRenderTimeframe: 0
55+
--- !u!114 &6396542536641275537
56+
MonoBehaviour:
57+
m_ObjectHideFlags: 0
58+
m_CorrespondingSourceObject: {fileID: 0}
59+
m_PrefabInstance: {fileID: 0}
60+
m_PrefabAsset: {fileID: 0}
61+
m_GameObject: {fileID: 6900432630177168104}
62+
m_Enabled: 1
63+
m_EditorHideFlags: 0
64+
m_Script: {fileID: 11500000, guid: 75a04b6013907df489c2f3e074b08d59, type: 3}
65+
m_Name:
66+
m_EditorClassIdentifier:
67+
_SyncedName:
68+
_length: 0
69+
_data:
70+
Data: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Red Strike/Assets/Resources/PlayerData.prefab.meta

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)