using UnityEngine; namespace Unity.Netcode { /// /// Helper class for logging /// public static class NetworkLog { /// /// Gets the current log level. /// /// The current log level. public static LogLevel CurrentLogLevel => NetworkManager.Singleton == null ? LogLevel.Normal : NetworkManager.Singleton.LogLevel; // internal logging /// /// Locally logs a info log with Netcode prefixing. /// /// The message to log public static void LogInfo(string message) => Debug.Log($"[Netcode] {message}"); /// /// Locally logs a warning log with Netcode prefixing. /// /// The message to log public static void LogWarning(string message) => Debug.LogWarning($"[Netcode] {message}"); /// /// Locally logs a error log with Netcode prefixing. /// /// The message to log public static void LogError(string message) => Debug.LogError($"[Netcode] {message}"); /// /// Logs an info log locally and on the server if possible. /// /// The message to log public static void LogInfoServer(string message) => LogServer(message, LogType.Info); /// /// Logs a warning log locally and on the server if possible. /// /// The message to log public static void LogWarningServer(string message) => LogServer(message, LogType.Warning); /// /// Logs an error log locally and on the server if possible. /// /// The message to log public static void LogErrorServer(string message) => LogServer(message, LogType.Error); internal static NetworkManager NetworkManagerOverride; private static void LogServer(string message, LogType logType) { var networkManager = NetworkManagerOverride ??= NetworkManager.Singleton; // Get the sender of the local log ulong localId = networkManager?.LocalClientId ?? 0; bool isServer = networkManager?.IsServer ?? true; switch (logType) { case LogType.Info: if (isServer) { LogInfoServerLocal(message, localId); } else { LogInfo(message); } break; case LogType.Warning: if (isServer) { LogWarningServerLocal(message, localId); } else { LogWarning(message); } break; case LogType.Error: if (isServer) { LogErrorServerLocal(message, localId); } else { LogError(message); } break; } if (!isServer && networkManager.NetworkConfig.EnableNetworkLogs) { var networkMessage = new ServerLogMessage { LogType = logType, Message = message }; var size = networkManager.ConnectionManager.SendMessage(ref networkMessage, NetworkDelivery.ReliableFragmentedSequenced, NetworkManager.ServerClientId); networkManager.NetworkMetrics.TrackServerLogSent(NetworkManager.ServerClientId, (uint)logType, size); } } internal static void LogInfoServerLocal(string message, ulong sender) => Debug.Log($"[Netcode-Server Sender={sender}] {message}"); internal static void LogWarningServerLocal(string message, ulong sender) => Debug.LogWarning($"[Netcode-Server Sender={sender}] {message}"); internal static void LogErrorServerLocal(string message, ulong sender) => Debug.LogError($"[Netcode-Server Sender={sender}] {message}"); internal enum LogType : byte { Info, Warning, Error, None } } }