feat: beginning to implement an online lobby in the main menu with fishnet

This commit is contained in:
Jakob Feldmann 2024-05-05 17:54:15 +02:00
parent 94863a7eb5
commit 0b14b754b4
16 changed files with 4693 additions and 0 deletions

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f2e5203152d671b4b9decf6d5ecf4a8f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,208 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &7443408887813606051
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7443408887813606049}
- component: {fileID: 7443408887813606050}
- component: {fileID: 934570884}
- component: {fileID: 7443408887813606060}
m_Layer: 0
m_Name: NetworkManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7443408887813606049
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7443408887813606051}
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_Children:
- {fileID: 4393252310584637084}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &7443408887813606050
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7443408887813606051}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d2c95dfde7d73b54dbbdc23155d35d36, type: 3}
m_Name:
m_EditorClassIdentifier:
_logging: {fileID: 0}
_spawnablePrefabs: {fileID: 11400000, guid: ec64eb18c93ab344892891f33edbf82a, type: 2}
_refreshDefaultPrefabs: 0
_runInBackground: 1
_dontDestroyOnLoad: 1
_persistence: 0
--- !u!114 &934570884
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7443408887813606051}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7d331f979d46e8e4a9fc90070c596d44, type: 3}
m_Name:
m_EditorClassIdentifier:
_defaultConditions:
- {fileID: 11400000, guid: 2033f54fd2794464bae08fa5a55c8996, type: 2}
--- !u!114 &7443408887813606060
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7443408887813606051}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 211a9f6ec51ddc14f908f5acc0cd0423, type: 3}
m_Name:
m_EditorClassIdentifier:
_playerPrefab: {fileID: 0}
_addToDefaultScene: 1
Spawns: []
--- !u!1001 &2130063410
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 7443408887813606049}
m_Modifications:
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_Pivot.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_RootOrder
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4393252310969058995, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
propertyPath: m_Name
value: NetworkHudCanvas
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 0570b6f7f713dc44a90463654bbcd8d0, type: 3}
--- !u!224 &4393252310584637084 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 4393252310969058990, guid: 0570b6f7f713dc44a90463654bbcd8d0,
type: 3}
m_PrefabInstance: {fileID: 2130063410}
m_PrefabAsset: {fileID: 0}

View File

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

View File

@ -0,0 +1,104 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1637189641542276332
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 922071417191856395}
- component: {fileID: 6527384552577148640}
- component: {fileID: 1367685490385930048}
- component: {fileID: -5295043410836352606}
m_Layer: 0
m_Name: SSOLobby
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &922071417191856395
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1637189641542276332}
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 &6527384552577148640
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1637189641542276332}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 26b716c41e9b56b4baafaf13a523ba2e, type: 3}
m_Name:
m_EditorClassIdentifier:
<IsNested>k__BackingField: 0
<ComponentIndex>k__BackingField: 0
<PredictedSpawn>k__BackingField: {fileID: 0}
_networkBehaviours: []
<SerializedRootNetworkBehaviour>k__BackingField: {fileID: 0}
<NestedRootNetworkBehaviours>k__BackingField: []
SerializedTransformProperties:
Position: {x: -9.091714, y: -0.83495903, z: 37.68543}
Rotation: {x: 0, y: 0, z: 0, w: 1}
LocalScale: {x: 1, y: 1, z: 1}
_isNetworked: 1
_isSpawnable: 1
_isGlobal: 0
_initializeOrder: 0
_defaultDespawnType: 0
NetworkObserver: {fileID: 0}
_enablePrediction: 0
_predictionType: 0
_graphicalObject: {fileID: 0}
_enableStateForwarding: 1
_networkTransform: {fileID: 0}
_ownerInterpolation: 1
_enableTeleport: 0
_teleportThreshold: 1
<PrefabId>k__BackingField: 11
<SpawnableCollectionId>k__BackingField: 0
_scenePathHash: 1455445497
<SceneId>k__BackingField: 0
<AssetPathHash>k__BackingField: 16185758033927324700
--- !u!114 &1367685490385930048
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1637189641542276332}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c71fd7f855ec523429999fc4e14a1928, type: 3}
m_Name:
m_EditorClassIdentifier:
_overrideType: 3
_updateHostVisibility: 1
_observerConditions: []
--- !u!114 &-5295043410836352606
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1637189641542276332}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5aee3998d0d63994e944a61ed8c59784, type: 3}
m_Name:
m_EditorClassIdentifier:

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4442b78d089cca44193d1597cc1b8f4d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,21 @@
using UnityEngine;
public class LobbyManager : MonoBehaviour
{
#region Fields
private SSOLobby lobby;
#endregion
#region Init
private void Awake()
{
Locator.RegisterService<LobbyManager>(this);
}
public void InitClient(SSOLobby lobby)
{
this.lobby = lobby;
}
#endregion
}

View File

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

View File

@ -0,0 +1,35 @@
using System.Collections.Generic;
using System;
using log4net;
using System.Reflection;
public static class Locator
{
private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static readonly Dictionary<Type, object> services = new();
public static void RegisterService<T>(T service)
{
Type serviceType = typeof(T);
if (!services.ContainsKey(serviceType))
{
services.Add(serviceType, service);
}
else
{
Log.Warn($"Service of type {serviceType} is alreade registered.");
}
}
public static T GetService<T>()
{
Type serviceType = typeof(T);
if (services.TryGetValue(serviceType, out var service))
{
return (T)service;
}
else
{
Log.Error($"Service of type {serviceType} not registered.using System.Collections");
throw new KeyNotFoundException($"Service of type {serviceType} not registered.using System.Collections");
}
}
}

View File

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

View File

@ -0,0 +1,66 @@
using System;
using FishNet;
using FishNet.Connection;
using FishNet.Managing.Scened;
using FishNet.Object;
using FishNet.Transporting;
using UnityEngine;
public class SSOLobby : NetworkBehaviour
{
#region Init & Update
void Start()
{
Locator.RegisterService<SSOLobby>(this);
// Register connection state events
InstanceFinder.ServerManager.OnServerConnectionState += OnServerStateChanged;
InstanceFinder.ServerManager.OnRemoteConnectionState += OnClienStateChanged;
InstanceFinder.ClientManager.OnClientConnectionState += OnLocalClientStateChanged;
base.NetworkManager.SceneManager.OnLoadEnd += OnClientLoadedScene;
base.NetworkManager.SceneManager.OnClientPresenceChangeEnd += OnClientSceneState;
}
public override void OnStartClient()
{
Locator.GetService<LobbyManager>().InitClient(this);
}
public override void OnStopServer()
{
base.OnStopServer();
base.NetworkManager.SceneManager.OnLoadEnd -= OnClientLoadedScene;
base.NetworkManager.SceneManager.OnClientPresenceChangeEnd -= OnClientSceneState;
}
#endregion
#region Events
private void OnClientSceneState(ClientPresenceChangeEventArgs args)
{
throw new NotImplementedException();
}
private void OnClientLoadedScene(SceneLoadEndEventArgs args)
{
throw new NotImplementedException();
}
private void OnLocalClientStateChanged(ClientConnectionStateArgs args)
{
throw new NotImplementedException();
}
private void OnClienStateChanged(NetworkConnection connection, RemoteConnectionStateArgs args)
{
throw new NotImplementedException();
}
private void OnServerStateChanged(ServerConnectionStateArgs args)
{
throw new NotImplementedException();
}
#endregion
}

View File

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

View File

@ -0,0 +1,57 @@
using System;
using System.Reflection;
using FishNet.Managing;
using FishNet.Object;
using FishNet.Transporting;
using FishNet.Transporting.Multipass;
using FishNet.Transporting.Tugboat;
using log4net;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.SceneManagement;
public class StartUp : MonoBehaviour
{
#region Fields
private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
[SerializeField] private NetworkObject lobbyNetworkPrefab;
private NetworkManager networkManager;
#endregion
private void Start()
{
networkManager = GetComponent<NetworkManager>();
Multipass mp = GetComponent<Multipass>();
#if UNITY_WEBGL && !UNITY_EDITOR
mp.SetClientTransport<Bayou>();
#else
mp.SetClientTransport<Tugboat>();
#endif
networkManager.ServerManager.OnServerConnectionState += ServerStateChanged;
}
#region Events
private void ServerStateChanged(ServerConnectionStateArgs args)
{
if (args.ConnectionState != LocalConnectionState.Started)
{
Log.Debug("Server not yet started.");
return;
}
if (!networkManager.ServerManager.OneServerStarted())
{
Log.Info("More than one server available.");
return;
}
Log.Debug("Instantiating networked lobby.");
NetworkObject nob = Instantiate(lobbyNetworkPrefab);
// TODO: Might not be necessary
Scene scene = SceneManager.GetSceneByName("OnlineLobby");
SceneManager.MoveGameObjectToScene(nob.gameObject, scene);
networkManager.ServerManager.Spawn(nob.gameObject);
}
#endregion
}

View File

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