using System.Collections; using System.Collections.Generic; using Unity.Collections; using Unity.Networking.Transport; using Unity.Networking.Transport.Utilities; using UnityEngine; namespace GameCore.Network { [CreateAssetMenu(menuName = "GameCore/Network/" + nameof(NetworkDriverAsset), fileName = nameof(NetworkDriverAsset))] public class NetworkDriverAsset : ScriptableObject { public uint port = 7777; [Header("Simulator Settings")] public bool useSimulator; public int packetDelayMs = 500; public int packetJitterMs = 300; public int packetDropPercentage = 10; private NetworkDriver CreateDriver() { var settings = new NetworkSettings(Allocator.Temp); settings.WithNetworkConfigParameters(disconnectTimeoutMS: 5000); settings.WithReliableStageParameters(32); settings.WithSimulatorStageParameters(32, NetworkParameterConstants.MaxConnectAttempts, packetDelayMs: packetDelayMs, packetJitterMs: packetJitterMs, packetDropPercentage: packetDropPercentage); var driver = NetworkDriver.Create(settings); if (useSimulator) { driver.CreatePipeline(typeof(SimulatorPipelineStageInSend)); driver.CreatePipeline(typeof(ReliableSequencedPipelineStage), typeof(SimulatorPipelineStageInSend)); } else { driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); } return driver; } public NetworkDriver CreateServerDriver(string address) { var driver = CreateDriver(); var ok = false; try { if (!NetworkEndPoint.TryParse(address, (ushort)port, out var endpoint)) { return default; } if (driver.Bind(endpoint) != 0) { Debug.Log("Failed to bind to " + endpoint); return default; } ok = true; driver.Listen(); return driver; } finally { if (!ok) driver.Dispose(); } } public NetworkDriver CreateClientDriver(string address, out NetworkConnection connection) { var driver = CreateDriver(); if (!NetworkEndPoint.TryParse(address, (ushort)port, out var endpoint)) { connection = default; driver.Dispose(); return default; } connection = driver.Connect(endpoint); return driver; } } }