Started adding multiplayer

This commit is contained in:
2026-05-19 19:14:03 +01:00
parent f826689bdd
commit e8e6c710df
36 changed files with 892 additions and 17 deletions

View File

@@ -13,4 +13,9 @@ MonoBehaviour:
m_Name: DefaultNetworkPrefabs m_Name: DefaultNetworkPrefabs
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkPrefabsList m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkPrefabsList
IsDefault: 1 IsDefault: 1
List: [] List:
- Override: 0
Prefab: {fileID: 401049662134316001, guid: 90d7552110f715f4d8c56436b0621b94, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}

8
Assets/Prefabs.meta Normal file
View File

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

View File

@@ -0,0 +1,59 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &401049662134316001
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5018670842438043798}
- component: {fileID: 4338096495283207142}
m_Layer: 0
m_Name: Client
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5018670842438043798
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 401049662134316001}
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 &4338096495283207142
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 401049662134316001}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject
GlobalObjectIdHash: 0
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
SyncOwnerTransformWhenParented: 1
AllowOwnerToParent: 0

View File

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

View File

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

View File

@@ -0,0 +1,109 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &6715254673078816961
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 177879224478324551}
- component: {fileID: 4030877536017024502}
- component: {fileID: 798290496798916117}
m_Layer: 0
m_Name: Localhost
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &177879224478324551
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6715254673078816961}
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 &4030877536017024502
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6715254673078816961}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 593a2fe42fa9d37498c96f9a383b6521, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkManager
NetworkManagerExpanded: 0
NetworkConfig:
ProtocolVersion: 0
NetworkTransport: {fileID: 798290496798916117}
PlayerPrefab: {fileID: 0}
Prefabs:
NetworkPrefabsLists:
- {fileID: 11400000, guid: 7b4919f232aabc04b9891b736d8945bb, 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
NetworkTopology: 0
UseCMBService: 0
AutoSpawnPlayerPrefabClientSide: 1
NetworkMessageMetrics: 1
NetworkProfilingMetrics: 1
OldPrefabList: []
RunInBackground: 1
LogLevel: 1
--- !u!114 &798290496798916117
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6715254673078816961}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6960e84d07fb87f47956e7a81d71c4e6, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Transports.UTP.UnityTransport
m_ProtocolType: 0
m_UseWebSockets: 0
m_UseEncryption: 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
WebSocketPath: /
ServerListenAddress: 127.0.0.1
ClientBindPort: 0
DebugSimulator:
PacketDelayMS: 0
PacketJitterMS: 0
PacketDropRate: 0

View File

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

View File

@@ -119,7 +119,102 @@ NavMeshSettings:
debug: debug:
m_Flags: 0 m_Flags: 0
m_NavMeshData: {fileID: 0} m_NavMeshData: {fileID: 0}
--- !u!1 &380762915
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 380762917}
- component: {fileID: 380762916}
m_Layer: 0
m_Name: ConnectionManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &380762916
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 380762915}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ed9f8d66fd664fd68f1901f0120a0daf, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::PashaBibko.PenguinChase.Core.Network.ConnectionManager
PrefabForEachClient: {fileID: 401049662134316001, guid: 90d7552110f715f4d8c56436b0621b94, type: 3}
--- !u!4 &380762917
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 380762915}
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 &1684958312
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1684958313}
- component: {fileID: 1684958314}
m_Layer: 0
m_Name: Network
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1684958313
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1684958312}
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 &1684958314
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1684958312}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f490d6c8b73d447fbe47c95efede54d0, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::PashaBibko.PenguinChase.Core.Network.Network
LocalHostTransport: {fileID: 6715254673078816961, guid: 054af26d74325fb4e9aaec18704fb248, type: 3}
UnityRelayTransport: {fileID: 0}
InternalCurrentTransport: 2
GameJoinCode:
--- !u!1660057539 &9223372036854775807 --- !u!1660057539 &9223372036854775807
SceneRoots: SceneRoots:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_Roots: [] m_Roots:
- {fileID: 1684958313}
- {fileID: 380762917}

View File

@@ -1,11 +0,0 @@
using UnityEngine.SceneManagement;
using UnityEngine;
namespace PashaBibko.PenguinChase.Bootstrap
{
public static class BootstrapLoader
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
private static void LoadBoostrapScene() => SceneManager.LoadScene("Bootstrap", LoadSceneMode.Additive);
}
}

View File

@@ -0,0 +1,22 @@
using UnityEngine.SceneManagement;
using UnityEngine;
namespace PashaBibko.PenguinChase.Core
{
public static class BootstrapLoader
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void LoadBoostrapScene()
{
#if UNITY_EDITOR
// Stops loading in on the bootstrap scene
if (SceneManager.GetActiveScene().name == "Bootstrap")
{
SceneManager.LoadScene("MainMenu", LoadSceneMode.Single);
}
#endif // UNITY_EDITOR
SceneManager.LoadScene("Bootstrap", LoadSceneMode.Additive);
}
}
}

View File

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

View File

@@ -0,0 +1,26 @@
using Unity.Services.Authentication;
using Unity.Services.Core;
using System.Collections;
namespace PashaBibko.PenguinChase.Core.Network
{
public static class Authenticator
{
public static bool IsAuthenticated { get; private set; }
public static IEnumerator Authenticate()
{
if (IsAuthenticated)
{
// User is already authenticated
yield break;
}
// TODO: Sign in via current platform
yield return UnityServices.InitializeAsync();
yield return AuthenticationService.Instance.SignInAnonymouslyAsync();
IsAuthenticated = true;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8ed9598a0f71474ea90df6a62ba55723
timeCreated: 1779203851

View File

@@ -0,0 +1,46 @@
using PashaBibko.PenguinChase.Extensions;
using Unity.Netcode;
using UnityEngine;
namespace PashaBibko.PenguinChase.Core.Network
{
public class ConnectionManager : MonoBehaviour
{
private static ConnectionManager sInstance;
[SerializeField] private GameObject PrefabForEachClient;
public static GameObject ClientPrefab => sInstance?.PrefabForEachClient;
private void Start()
{
// Stops overlapping instances
if (sInstance is not null)
{
Debug.LogError($"Multiple of [{nameof(ConnectionManager)}] cannot exist.");
Destroy(gameObject);
return;
}
sInstance = this;
}
public static void CreateNetworkConnectionManager()
{
NetworkManager.Singleton.OnClientConnectedCallback += OnClientJoin;
OnClientJoin(0); // Has to be manually called for local client
}
public static void DestroyNetworkConnectionManager()
{
NetworkManager.Singleton.OnClientConnectedCallback -= OnClientJoin;
sInstance.DestroyAllChildren();
}
private static void OnClientJoin(ulong id)
{
GameObject client = Instantiate(ClientPrefab);
NetworkObject networkObject = client.GetComponent<NetworkObject>();
networkObject.SpawnAsPlayerObject(id);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ed9f8d66fd664fd68f1901f0120a0daf
timeCreated: 1779208828

View File

@@ -0,0 +1,146 @@
using PashaBibko.Pacore.Attributes;
using Unity.Netcode.Transports.UTP;
using System.Collections;
using Unity.Netcode;
using UnityEngine;
using System;
using JetBrains.Annotations;
using UnityEngine.SceneManagement;
namespace PashaBibko.PenguinChase.Core.Network
{
public enum TransportType
{
UnityRelay,
Localhost,
None
}
public interface INetworkTransport
{
public IEnumerator Join(string code);
public IEnumerator Host();
}
public class Network : MonoBehaviour
{
private static Network sInstance;
[Header("Transports")] [SerializeField]
private GameObject LocalHostTransport;
[SerializeField] private GameObject UnityRelayTransport;
[Header("View only")] [SerializeField, InspectorReadOnly]
private TransportType InternalCurrentTransport = TransportType.None;
public static TransportType CurrentTransport
{
get => sInstance?.InternalCurrentTransport ?? TransportType.None;
set => sInstance?.StartCoroutine(sInstance.ChangeTransport(value));
}
#if UNITY_EDITOR
[Header("Editor Only")]
[SerializeField] private string GameJoinCode;
#endif // UNITY_EDITOR
private static INetworkTransport sConnectionManager;
private GameObject mCurrentChildTransport;
public static UnityTransport CurrentTransportComponent
{
get
{
UnityTransport component = null;
sInstance?.mCurrentChildTransport?.TryGetComponent(out component);
return component;
}
}
private void Start()
{
// Stops overlapping instances
if (sInstance is not null)
{
Debug.LogError($"Multiple of [{nameof(Network)}] cannot exist.");
Destroy(gameObject);
return;
}
sInstance = this;
}
[UsedImplicitly, InspectorCallable("Choose Local Host Transport")]
private void ChooseLocalHostTransport() => CurrentTransport = TransportType.Localhost;
[UsedImplicitly, InspectorCallable("Host")]
public void Host()
{
if (sConnectionManager is null)
{
throw new InvalidOperationException("No connection manager has been set.");
}
StartCoroutine(sConnectionManager.Host());
}
[UsedImplicitly, InspectorCallable("Join")]
public void Join()
{
if (sConnectionManager is null)
{
throw new InvalidOperationException("No connection manager has been set.");
}
StartCoroutine(sConnectionManager.Join(GameJoinCode));
}
private IEnumerator ChangeTransport(TransportType transport)
{
// Stops network from being restarted when unneeded
if (transport == InternalCurrentTransport)
{
yield break;
}
InternalCurrentTransport = transport;
// Shutdown existing network manager (if there is one) to stop multiple at once
if (NetworkManager.Singleton is not null)
{
NetworkManager.Singleton.Shutdown();
while (NetworkManager.Singleton.ShutdownInProgress)
{
yield return null; // Waits for next frame
}
Destroy(mCurrentChildTransport);
}
// Loads the new transport controller and lets it setup
switch (InternalCurrentTransport)
{
case TransportType.UnityRelay:
mCurrentChildTransport = Instantiate(UnityRelayTransport);
sConnectionManager = new UnityRelayTransport();
break;
case TransportType.Localhost:
mCurrentChildTransport = Instantiate(LocalHostTransport);
sConnectionManager = new LocalhostTransport();
break;
case TransportType.None:
// Nothing needs to be done here as there is no network controller
mCurrentChildTransport = null;
yield break;
default:
throw new ArgumentOutOfRangeException();
}
DontDestroyOnLoad(mCurrentChildTransport);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f490d6c8b73d447fbe47c95efede54d0
timeCreated: 1779196408

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d478eb44fa9f45258a97c4a57e2e97e9
timeCreated: 1779205011

View File

@@ -0,0 +1,23 @@
using System.Collections;
using Unity.Netcode;
namespace PashaBibko.PenguinChase.Core.Network
{
public class LocalhostTransport : INetworkTransport
{
// TODO: Allow connection to different devices on local network
public IEnumerator Join(string _)
{
NetworkManager.Singleton.StartClient();
yield break;
}
public IEnumerator Host()
{
NetworkManager.Singleton.StartHost();
ConnectionManager.CreateNetworkConnectionManager();
yield break;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 54594dc099644958a5f437811cc47a5e
timeCreated: 1779205047

View File

@@ -0,0 +1,61 @@
using PashaBibko.PenguinChase.Extensions;
using Unity.Services.Relay.Models;
using Unity.Services.Relay;
using System.Collections;
using Unity.Netcode;
using UnityEngine;
namespace PashaBibko.PenguinChase.Core.Network
{
public class UnityRelayTransport : INetworkTransport
{
private const uint MAX_CONNECTIONS = 7;
public IEnumerator Join(string code)
{
yield return Authenticator.Authenticate();
JoinAllocation allocation;
{
Result<JoinAllocation> result = new();
yield return RelayService.Instance
.JoinAllocationAsync(code)
.Await(result);
allocation = result.Value;
}
Network.CurrentTransportComponent.SetRelayServerData(allocation);
NetworkManager.Singleton.StartClient();
}
public IEnumerator Host()
{
yield return Authenticator.Authenticate();
Allocation allocation;
{
Result<Allocation> result = new();
yield return RelayService.Instance
.CreateAllocationAsync(7)
.Await(result);
allocation = result.Value;
}
string joinCode = null;
{
Result<string> result = new();
yield return RelayService.Instance
.GetJoinCodeAsync(allocation.AllocationId)
.Await(result);
joinCode = result.Value;
}
Network.CurrentTransportComponent.SetHostRelayData(allocation);
NetworkManager.Singleton.StartHost();
ConnectionManager.CreateNetworkConnectionManager();
Debug.Log($"Started server with code: [{joinCode}]");
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 873c14eb9ab94868b0572ae86759b2a7
timeCreated: 1779205549

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f0270fb2159f4bbfbad1b8d165ef6454
timeCreated: 1779206080

View File

@@ -0,0 +1,15 @@
using UnityEngine;
namespace PashaBibko.PenguinChase.Extensions
{
public static class MonoBehaviourExtensions
{
public static void DestroyAllChildren(this MonoBehaviour go)
{
foreach (Transform child in go.transform)
{
Object.Destroy(child.gameObject);
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4b9109919a0b4b969424d31ac875d6bf
timeCreated: 1779211792

View File

@@ -0,0 +1,26 @@
using System.Threading.Tasks;
using System.Collections;
namespace PashaBibko.PenguinChase.Extensions
{
public sealed class Result<T>
{
public T Value { get; set; }
}
public static class TaskExtensions
{
public static IEnumerator Await<T>(this Task<T> task, Result<T> result)
where T : class
{
// Waits until the task is completed
while (!task.IsCompleted)
{
yield return null;
}
// Has to return the value like this because of the wonders of C#
result.Value = task.Result;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: cf8f135562fd4650924729e686a5a815
timeCreated: 1779206087

View File

@@ -0,0 +1,33 @@
using Unity.Netcode.Transports.UTP;
using Unity.Services.Relay.Models;
namespace PashaBibko.PenguinChase.Extensions
{
public static class UnityTransportExtensions
{
public static void SetHostRelayData(this UnityTransport transport, Allocation allocation)
{
transport.SetHostRelayData
(
allocation.RelayServer.IpV4,
(ushort)allocation.RelayServer.Port,
allocation.AllocationIdBytes,
allocation.Key,
allocation.ConnectionData
);
}
public static void SetRelayServerData(this UnityTransport transport, JoinAllocation allocation)
{
transport.SetRelayServerData
(
allocation.RelayServer.IpV4,
(ushort)allocation.RelayServer.Port,
allocation.AllocationIdBytes,
allocation.Key,
allocation.ConnectionData,
allocation.HostConnectionData
);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c69f8839a8834857b6dc5df1627045df
timeCreated: 1779207616

View File

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

View File

@@ -6,8 +6,12 @@
"com.unity.ide.visualstudio": "2.0.26", "com.unity.ide.visualstudio": "2.0.26",
"com.unity.inputsystem": "1.19.0", "com.unity.inputsystem": "1.19.0",
"com.unity.multiplayer.center": "1.0.1", "com.unity.multiplayer.center": "1.0.1",
"com.unity.multiplayer.playmode": "2.0.2",
"com.unity.multiplayer.tools": "2.2.8",
"com.unity.netcode.gameobjects": "2.11.2", "com.unity.netcode.gameobjects": "2.11.2",
"com.unity.render-pipelines.universal": "17.3.0", "com.unity.render-pipelines.universal": "17.3.0",
"com.unity.services.authentication": "3.6.1",
"com.unity.services.multiplayer": "2.2.2",
"com.unity.test-framework": "1.6.0", "com.unity.test-framework": "1.6.0",
"com.unity.timeline": "1.8.11", "com.unity.timeline": "1.8.11",
"com.unity.ugui": "2.0.0", "com.unity.ugui": "2.0.0",

View File

@@ -11,7 +11,7 @@
}, },
"com.unity.burst": { "com.unity.burst": {
"version": "1.8.28", "version": "1.8.28",
"depth": 2, "depth": 1,
"source": "registry", "source": "registry",
"dependencies": { "dependencies": {
"com.unity.mathematics": "1.2.1", "com.unity.mathematics": "1.2.1",
@@ -28,7 +28,7 @@
}, },
"com.unity.collections": { "com.unity.collections": {
"version": "2.6.5", "version": "2.6.5",
"depth": 2, "depth": 1,
"source": "registry", "source": "registry",
"dependencies": { "dependencies": {
"com.unity.burst": "1.8.27", "com.unity.burst": "1.8.27",
@@ -74,7 +74,7 @@
}, },
"com.unity.mathematics": { "com.unity.mathematics": {
"version": "1.3.3", "version": "1.3.3",
"depth": 2, "depth": 1,
"source": "registry", "source": "registry",
"dependencies": {}, "dependencies": {},
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
@@ -87,6 +87,30 @@
"com.unity.modules.uielements": "1.0.0" "com.unity.modules.uielements": "1.0.0"
} }
}, },
"com.unity.multiplayer.playmode": {
"version": "2.0.2",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.nuget.newtonsoft-json": "2.0.2"
},
"url": "https://packages.unity.com"
},
"com.unity.multiplayer.tools": {
"version": "2.2.8",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.burst": "1.8.18",
"com.unity.collections": "2.5.1",
"com.unity.mathematics": "1.3.2",
"com.unity.profiling.core": "1.0.2",
"com.unity.nuget.mono-cecil": "1.11.4",
"com.unity.modules.uielements": "1.0.0",
"com.unity.nuget.newtonsoft-json": "3.2.1"
},
"url": "https://packages.unity.com"
},
"com.unity.netcode.gameobjects": { "com.unity.netcode.gameobjects": {
"version": "2.11.2", "version": "2.11.2",
"depth": 0, "depth": 0,
@@ -104,6 +128,20 @@
"dependencies": {}, "dependencies": {},
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
}, },
"com.unity.nuget.newtonsoft-json": {
"version": "3.2.2",
"depth": 1,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.com"
},
"com.unity.profiling.core": {
"version": "1.0.3",
"depth": 1,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.com"
},
"com.unity.render-pipelines.core": { "com.unity.render-pipelines.core": {
"version": "17.3.0", "version": "17.3.0",
"depth": 1, "depth": 1,
@@ -143,6 +181,87 @@
"dependencies": {}, "dependencies": {},
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
}, },
"com.unity.services.authentication": {
"version": "3.6.1",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.ugui": "1.0.0",
"com.unity.services.core": "1.15.1",
"com.unity.nuget.newtonsoft-json": "3.2.1",
"com.unity.modules.unitywebrequest": "1.0.0"
},
"url": "https://packages.unity.com"
},
"com.unity.services.core": {
"version": "1.16.0",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.modules.androidjni": "1.0.0",
"com.unity.nuget.newtonsoft-json": "3.2.1",
"com.unity.modules.unitywebrequest": "1.0.0"
},
"url": "https://packages.unity.com"
},
"com.unity.services.deployment": {
"version": "1.7.1",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.services.core": "1.15.1",
"com.unity.services.deployment.api": "1.1.2"
},
"url": "https://packages.unity.com"
},
"com.unity.services.deployment.api": {
"version": "1.1.3",
"depth": 2,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.com"
},
"com.unity.services.multiplayer": {
"version": "2.2.2",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.transport": "2.6.0",
"com.unity.collections": "2.2.1",
"com.unity.services.qos": "1.4.1",
"com.unity.services.core": "1.16.0",
"com.unity.services.wire": "1.4.3",
"com.unity.services.deployment": "1.7.1",
"com.unity.nuget.newtonsoft-json": "3.2.2",
"com.unity.modules.unitywebrequest": "1.0.0",
"com.unity.services.authentication": "3.6.0"
},
"url": "https://packages.unity.com"
},
"com.unity.services.qos": {
"version": "1.4.1",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.collections": "1.2.4",
"com.unity.services.core": "1.12.5",
"com.unity.nuget.newtonsoft-json": "3.0.2",
"com.unity.modules.unitywebrequest": "1.0.0",
"com.unity.services.authentication": "3.5.2"
},
"url": "https://packages.unity.com"
},
"com.unity.services.wire": {
"version": "1.4.3",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.services.core": "1.12.5",
"com.unity.nuget.newtonsoft-json": "3.2.1",
"com.unity.services.authentication": "2.7.4"
},
"url": "https://packages.unity.com"
},
"com.unity.shadergraph": { "com.unity.shadergraph": {
"version": "17.3.0", "version": "17.3.0",
"depth": 1, "depth": 1,
@@ -164,7 +283,7 @@
}, },
"com.unity.test-framework.performance": { "com.unity.test-framework.performance": {
"version": "3.2.0", "version": "3.2.0",
"depth": 3, "depth": 2,
"source": "registry", "source": "registry",
"dependencies": { "dependencies": {
"com.unity.test-framework": "1.1.33", "com.unity.test-framework": "1.1.33",

View File

@@ -0,0 +1,17 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &1
MonoBehaviour:
m_ObjectHideFlags: 53
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: 6762c37d3236e2a4382cd018dcdf221e, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Multiplayer.Tools.Common::Unity.Multiplayer.Tools.Common.Visualization.CustomColorSettings
colors:
m_Keys:
m_Values: []

View File

@@ -0,0 +1,4 @@
{
"PlayerTags": [],
"version": "6000.3.12f1"
}