GONet v1.5b
GONet v1.5 Release Notes
Release Date: October 2025
Previous Version: v1.4.1 (commit a128fcf)
Unity Version: 2022.3.62f3 LTS or later (minimum required version)
Overview
GONet v1.5 represents a major step forward in production readiness and developer experience. This release focuses on eliminating common pain points, improving performance at scale, and adding enterprise-grade features that shipped games require.
Key Themes
- 🚀 Zero-Latency Client Spawning - GONetId Batch System eliminates server round-trip
- 🎯 Modern RPC System - Async/await, validation, persistent delivery
- 🌍 Networked Scene Management - Server-authoritative with late-joiner sync
- 📦 Unity Addressables Support - Scenes AND runtime prefab spawning
- ⚡ Adaptive Congestion Management - Auto-scaling for varying load
- 🛡️ Race Condition Hardening - OnGONetReady deferral system
- 🔧 Developer Experience - Auto-detection, better logging, UI improvements
Major New Features
1. GONetId Batch System
Problem Solved: Client-spawned objects previously required server round-trip to assign GONetId, causing visible spawn delay (50-150ms depending on latency).
Solution: Pre-allocated GONetId batches eliminate spawn latency entirely.
How It Works:
- Client requests batch of 200-1000 IDs from server at connection time
- Server allocates raw ID range and sends to client
- Client spawns objects instantly using batch IDs, server assumes authority
- When 50% consumed, client requests next batch in background
- Rare edge case: "Limbo mode" handles batch exhaustion gracefully
Configuration:
// GONetGlobal component - Inspector
client_GONetIdBatchSize = 200; // Default: 200 IDs per batch (range: 100-1000)
// API - Check if object is in limbo
if (participant.client_isInLimbo) {
// Waiting for batch to arrive
}Limbo Mode Options:
ReturnFailure- Spawn fails, returns null (safe default)InstantiateInLimbo- Create "ghost" object until batch arrives (seamless UX)BlockUntilBatchArrives- Wait synchronously (NOT RECOMMENDED - frame stutter)
Benefits:
- Zero perceived spawn delay for players
- Instant projectile/effect spawning
- Scales to 100+ spawns/sec per client
- Graceful degradation if batch exhausted
Files:
GONet.cs- Batch allocation logicGONetParticipant.cs- Limbo state trackingGONetGlobal.cs- Configuration options
2. Enhanced RPC System
Problem Solved: Previous RPC system lacked validation hooks, async support, and late-joiner delivery.
Solution: Production-grade RPC system with modern C# features.
New Attributes:
[ServerRpc] // Client → Server (optionally relay to other clients)
async Task<TResponse> RequestAction(int param) { }
[ClientRpc] // Server → All clients
void NotifyAllClients(string message) { }
[TargetRpc] // Server → Specific client(s)
void SendToPlayer(ushort targetId, string data) { }New Features:
Async/Await Support:
var response = await CallRpcAsync<ChatValidationResult>(
nameof(SendChatMessage),
message
);
if (response.Approved) {
// Message was clean
}Server-Side Validation:
[ServerRpc(validationMethod: nameof(ValidateChatMessage))]
void SendChatMessage(string message) { }
RpcValidationResult ValidateChatMessage(ref string message) {
if (ContainsProfanity(message)) {
var result = RpcValidationResult.CreatePreAllocated(0);
result.DenyAll("Profanity detected");
return result;
}
// ... filter profanity, modify message ...
var okResult = RpcValidationResult.CreatePreAllocated(1);
okResult.AllowAll();
return okResult;
}Persistent RPCs:
[ServerRpc(IsPersistent = true)]
void AnnounceMatchStart(string mapName) {
// Late-joiners receive this RPC automatically
}Deferred Execution:
- RPCs gracefully handle components not ready (IGONetReady not yet fired)
- Queued and retried automatically when component becomes ready
- Prevents "NullReferenceException" during rapid spawning
Delivery Reports:
- Async RPCs return
RpcDeliveryReport - Success/failure status
- Validation results
- Target delivery confirmation
Files:
GONetEventBus_Rpc.cs- RPC implementation (~366KB)GONetRpcs.cs- RPC attributesGONetMain.cs- Async RPC support
3. Scene Management System
Problem Solved: No built-in networked scene loading, late-joiners didn't sync scenes.
Solution: Server-authoritative scene management with extensibility hooks.
Core API:
// SERVER: Load scene directly
GONetMain.SceneManager.LoadSceneFromBuildSettings("BattleArena", LoadSceneMode.Single);
// SERVER: Load from Addressables
GONetMain.SceneManager.LoadSceneFromAddressables("DynamicLevel", LoadSceneMode.Additive);
// CLIENT: Request scene change (requires server approval)
GONetMain.SceneManager.RequestLoadScene("BattleArena");
// SERVER: Unload additive scene
GONetMain.SceneManager.UnloadScene("DynamicLevel");Validation Hooks:
// Server-side validation (deny unauthorized requests)
GONetMain.SceneManager.OnValidateSceneLoad += (sceneName, mode, requestingClient) => {
// Return false to deny request
if (sceneName == "SecretLevel" && !IsAdmin(requestingClient)) {
return false; // Denied
}
return true; // Approved
};
// Async approval (show server UI confirmation)
GONetMain.SceneManager.RequiresAsyncApproval = true;
GONetMain.SceneManager.OnValidateSceneLoad += (sceneName, mode, requestingClient) => {
ShowApprovalUI(sceneName, requestingClient);
return true; // Will send follow-on response after approval
};Late-Joiner Synchronization:
- Late-joiners automatically load server's current scene
- Scene-defined object GONetIds assigned proactively
- Custom initialization data sent with scene (IGONetSyncdBehaviourInitializer)
- Buffered assignments if scene not loaded yet (no race conditions)
Features:
- Build Settings AND Unity Addressables support
- Single or Additive loading modes
- Extensibility hooks for validation and processing
- Progress tracking and coroutine helpers
- State queries (IsSceneLoading, GetLoadingScenes, etc.)
Files:
GONetSceneManager.cs- Scene management implementation (~1,187 lines)GONetGlobal.cs- Scene load RPC handlersSceneLoadEvent.cs/SceneUnloadEvent.cs- Persistent events
4. Unity Addressables Support
Problem Solved: GONet previously only supported Unity Resources for prefab loading, limiting asset management flexibility and requiring all networked prefabs to be in Resources folders.
Solution: Full Unity Addressables integration for both scene loading AND runtime prefab spawning.
What's Supported:
Addressables Scene Loading:
// Load Addressables scene (server)
GONetMain.SceneManager.LoadSceneFromAddressables("DynamicArena", LoadSceneMode.Additive);
// Unload Addressables scene
GONetMain.SceneManager.UnloadAddressablesScene("DynamicArena");Addressables Prefab Spawning:
// Prefab paths now support addressables:// protocol
// In DesignTimeMetadata.json:
{
"PrefabLocation": "addressables://Weapons/MagicSword",
"CodeGenerationId": 42
}
// Spawn works exactly the same (GONet handles Addressables loading internally)
GameObject.Instantiate(magicSwordPrefab);
// OR
GONetMain.Client_InstantiateToBeRemotelyControlledByMe(magicSwordPrefab, pos, rot);Benefits:
For Scene Management:
- Load scenes dynamically without including in Build Settings
- Organize scene assets with Addressables groups
- Platform-specific scene variants
For Prefab Spawning:
- No more Resources folder restrictions
- Organize prefabs anywhere in project
- Use Addressables groups for efficient asset bundles
- Platform-specific asset variants
- Cleaner project organization
Configuration:
#if ADDRESSABLES_AVAILABLEautomatically detected when Unity Addressables package installed- No manual configuration needed - works out of the box
- Prefab metadata automatically handles
addressables://vsresources://paths
Metadata Format:
{
"UnityGUID": "abc123...",
"CodeGenerationId": 42,
"PrefabLocation": "addressables://Characters/Heroes/Wizard",
"ComponentTypeNames": [...]
}How It Works:
- Scenes: GONetSceneManager uses
Addressables.LoadSceneAsync()andAddressables.UnloadSceneAsync() - Prefabs: GONetSpawnSupport_Runtime detects
addressables://prefix and usesAddressables.LoadAssetAsync<GameObject>() - Caching: Addressables scene handles cached internally, prefabs managed by Unity's Addressables system
- Compatibility: Works alongside Resources-based prefabs (mix and match freely)
Migration Path:
- Existing Resources-based projects: No changes needed (backward compatible)
- New projects: Use Addressables from the start
- Hybrid: Mix Resources and Addressables prefabs as needed
Late-Joiner Support:
- Addressables scenes sync'd to late-joiners automatically
- Prefabs loaded asynchronously before spawn messages processed
- No special handling required from game code
Files:
GONetSceneManager.cs- Addressables scene loading (#if ADDRESSABLES_AVAILABLE)GONetSpawnSupport_Runtime.cs- Addressables prefab loading supportDesignTimeMetadata.json- Metadata withaddressables://paths
5. Adaptive Congestion Management
Problem Solved: Ring buffer exhaustion during rapid spawning caused dropped sync updates.
Solution: Auto-scaling packet pools adapt to network demand.
How It Works:
- Pool starts at baseline size (default: 1,000 packets)
- Scales UP when utilization exceeds 75%
- Scales DOWN when utilization stays below 25%
- Respects
maxPacketsPerTickas absolute ceiling (default: 20,000) - Aggressive warnings when approaching limits
Configuration:
// GONetGlobal component - Inspector
enableAdaptivePoolScaling = true; // Default: true (recommended)
adaptivePoolBaselineSize = 1000; // Starting size (100-10,000)
maxPacketsPerTick = 20000; // Absolute ceiling (100-100,000)
unreliableDropThreshold = 0.90f; // Drop unreliable at 90% utilization (0.5-0.99)
enableCongestionLogging = true; // Detailed logs for debuggingBenefits:
- Handles burst spawning (100+ objects/frame) gracefully
- Prevents "Ring buffer is full" errors
- Conserves memory during low activity
- Detailed diagnostics when congestion occurs
Tuning Guidance:
- Small Co-op (2-8 players): baseline=500, max=5000
- Battle Royale (50-100 players): baseline=1500, max=15000
- MMO (100+ players): baseline=3000, max=30000
Files:
GONet.cs- Adaptive scaling logicGONetGlobal.cs- Configuration options
6. Sync Bundle Deferral System
Problem Solved: Race condition where sync bundles arrive before GONetParticipant completes Awake() initialization, causing NullReferenceException crashes.
Solution: Industry-standard DROP-FIRST approach with optional DEFER configuration.
Default Behavior (Deferral DISABLED):
- Bundles dropped if participant not ready
- Authority re-sends state 30-60 times/sec (auto-recovery)
- Value blending smooths over 1-2 dropped frames
- Zero performance overhead
- Matches industry standard approach
Optional Behavior (Deferral ENABLED):
- Reliable bundles queued and retried once
- Unreliable bundles still dropped (by design)
- Max 100 bundles queued per receiver (FIFO drop policy)
- Max 10 bundles processed per OnGONetReady callback (prevents frame stutter)
Configuration:
// GONetGlobal component - Inspector
deferSyncBundlesWaitingForGONetReady = false; // Default: false (DROP)
maxSyncBundlesWaitingForGONetReady = 100; // Queue size if enabled (10-500)
maxBundlesProcessedPerGONetReadyCallback = 10; // Batch size (1-50)When to Enable Deferral:
- Turn-based games (every state change must be received)
- Zero data loss required (ownership changes, inventory updates)
When to Leave Disabled (Default):
- Action games with high-frequency updates
- Transient state (positions, rotations)
- Performance-critical scenarios
Edge Cases Handled:
- Queue full → FIFO drop policy (oldest dropped first)
- Unreliable bundles → ALWAYS dropped (no queueing)
- Retry still fails → DROP with error log (lifecycle bug detected)
- Participant destroyed → KeyNotFoundException caught, bundle dropped gracefully
- Pool safety → Byte arrays always returned in all code paths
Files:
GONet.cs- Exception class, queue, deferral/processing methodsGONetGlobal.cs- Configuration optionsGONetSyncBundleDeferralTests.cs- Unit tests
7. Auto-Detection for Development
Problem Solved: Manual server/client startup via keyboard shortcuts was cumbersome during local development.
Solution: Automatic role detection based on port availability.
How It Works:
- First instance checks if port 40000 is free
- Port free → Start as SERVER automatically
- Port occupied → Start as CLIENT (connect to localhost)
- Works in Editor AND builds
- Command line args (
-server/-client) always override
Configuration:
// GONetGlobal component - Inspector
enableAutoRoleDetection = true; // Default: true (recommended for dev)Benefits:
- Zero manual configuration for local testing
- Just hit Play - first instance becomes server, second becomes client
- Faster iteration during development
- Multiple editor/build instances "just work"
Disabling:
- Uncheck "Enable Auto Role Detection" in GONetGlobal
- Falls back to manual startup (keyboard shortcuts or command line args)
Files:
GONetGlobal.cs- Auto-detection logic (Editor_AttemptStartAsClientIfAppropriate)NetworkUtils.cs- Port availability checking
Significant Improvements
8. Velocity-Augmented Sync
Problem Solved: Slow-moving and slow-rotating objects (platforms, turrets, doors) suffered from micro-jitter and consumed excessive bandwidth with traditional absolute value sync.
Solution: Intelligent velocity-based sync that dynamically switches between velocity deltas and absolute values based on movement speed. Super cool and super efficient!
How It Works:
- Slow movement detected: Server sends velocity delta (often zero or very small)
- Client extrapolates smoothly: Perfect smooth movement with zero jitter
- Aggressive quantization: Slow velocities often compress to 0 bits (massive bandwidth savings!)
- Periodic anchors: VALUE bundles sent every 1 second to prevent drift
- Automatic fallback: Large changes (teleport, collision) switch to VALUE bundles instantly
Benefits:
Bandwidth Savings:
- Slow-moving objects: 90%+ bandwidth reduction (velocity ~0 quantizes to nothing)
- Typical use cases: Rotating turrets, moving platforms, opening doors
- Dynamic optimization: Fast-moving objects use VALUE, slow objects use VELOCITY
Visual Quality:
- Eliminates micro-jitter completely (smooth extrapolation)
- Perfect for slow rotations (no more "stutter stepping")
- Graceful degradation on unreliable channels (velocity predictions smooth over packet loss)
Use Cases:
- Rotating security cameras (smooth, low bandwidth)
- Elevator platforms (smooth movement, no jitter)
- Opening/closing doors (smooth animation)
- Slowly drifting asteroids (minimal network cost)
- Tank turret rotation (smooth tracking)
Configuration:
// GONetGlobal component - Inspector
velocityAnchorIntervalSeconds = 1.0f; // Periodic anchor (0.5-5.0s)
// Per-profile override available in GONetAutoMagicalSyncSettings_ProfileTemplate:
VelocityAnchorIntervalSeconds = 2.0f; // 0 = use global defaultFiles:
GONet.cs- Velocity sync logicGONetGlobal.cs- Configuration
9. GONetId Reuse Protection
Problem Solved: GONetIds reused too quickly could cause despawn messages for old object to despawn new object with same ID.
Solution: Delay before allowing GONetId reuse, based on network RTT and safety margin.
Configuration:
// GONetGlobal component - Inspector
gonetIdReuseDelaySeconds = 5.0f; // Default: 5 seconds (1-30s range)Tuning:
- LAN (low latency): 2-3 seconds
- Internet (normal): 5 seconds (default)
- High latency/packet loss: 10-15 seconds
Files:
GONet.cs- Reuse delay trackingGONetGlobal.cs- Configuration
10. Reliable Message Queue Expansion
Problem Solved: Reliable message queue exhaustion during sustained high message rate + high packet loss.
Solution: Configurable queue size with expanded default capacity.
Configuration:
// GONetGlobal component - Inspector
maxReliableMessageQueueSize = 2000; // Default: 2000 messages (1000-10000)When Exhaustion Occurs:
- [RELIABLE-QUEUE-EXHAUSTION] error logged
- Message DROPPED (spawn events, RPCs will fail silently)
- Extremely rare - requires sustained burst + high packet loss + slow ACKs
Tuning:
- LAN/Low latency: 1000-2000 (default: 2000)
- Internet/Normal latency: 2000-5000
- High latency/packet loss: 5000-10000
Files:
GONet.cs- Queue managementGONetGlobal.cs- Configuration
11. Physics Synchronization Improvements
Problem Solved: Physics sync timing didn't account for all Unity physics processing steps.
Solution: Sync AFTER all FixedUpdate calls AND physics simulation complete.
Implementation:
- Coroutine uses
yield return new WaitForFixedUpdate() - Ensures sync happens after collisions/triggers processed
- Server-only check inside sync method
Unity Execution Order:
- FixedUpdate() on all scripts
- Internal physics simulation
- OnCollisionEnter/Stay/Exit callbacks
- OnTriggerEnter/Stay/Exit callbacks
- WaitForFixedUpdate resumes ← PHYSICS SYNC HAPPENS HERE
Benefits:
- Captures FINAL physics state (not intermediate)
- More accurate Rigidbody sync
- Prevents "half-simulated" state from propagating
Files:
GONetGlobal.cs- PhysicsSync_WaitForFixedUpdate coroutineGONet.cs- PhysicsSync_ProcessASAP implementation
12. UI and Developer Experience Improvements
GONetStatusUI (New Component):
- Persistent on-screen status display
- Shows server/client state, connection count, GONetId batch info
- Auto-created and added to GONetGlobal
- Minimal performance overhead
Scene Selection UI (Enhanced):
- Server-side scene selection dropdown
- Async approval flow with server confirmation dialog
- Extensibility for custom UI
Exit Button UI (New Component):
- Graceful disconnect/shutdown
- Server approval for client exit (optional)
- Prevents accidental disconnects
Message Flow Logging (New):
- Separate log file:
gonet-MessageFlow-YYYY-MM-DD.log - Comprehensive send/receive/process tracking
- Enable via
enableMessageFlowLoggingin GONetGlobal - Critical for debugging race conditions and timing issues
Files:
GONetStatusUI.cs- Status display componentSceneSelectionUI.cs- Scene selection dialogExitButtonUI.cs- Exit confirmation (~632 lines)GONetGlobal.cs- Message flow logging profile
Bug Fixes and Stability
Critical Fixes
Late-Joiner GONetId Synchronization:
- Scene-defined objects now receive GONetIds proactively from server
- Buffered assignments if scene not loaded yet (no race conditions)
- Proactive flow (server OnSceneLoaded) + reactive flow (client SceneLoadCompleteEvent)
- Deduplication prevents duplicate sends to early-joiners
Spawn Data Provider Race Condition:
- IGONetSpawnDataProvider now guaranteed to run before OnGONetReady
- Serialization happens synchronously during spawn message handling
- Cache prevents re-randomization for late-joiners (server sends same data to all clients)
Duplicate GONetGlobal Handling:
- Improved singleton pattern (DestroyImmediate instead of Destroy)
- Prevents any processing on duplicate instances
- Scene unloading correctly clears subscriptions
Time Sync Improvements:
- Separate pre-load and post-load aggressive sync requests
- Prevents double-reset during late-joiner initialization (was causing broken time sync)
- Correct handling for clients not yet initialized
Deferred RPC Execution:
- RPCs queued when components not ready (OnGONetReady not fired yet)
- Processed automatically when component becomes ready
- Prevents "component not found" errors during rapid spawning
Robustness Improvements
Addressables Loading Stability:
- Handle invalid handles gracefully
- Proper cleanup on exception
- Scene instance tracking for unload
- Release all handles on shutdown
Scene Unload Cleanup:
- Clear proactive GONetId tracking when scene unloads
- Supports scene reload (clients receive GONetIds again)
- Buffered assignments cleared when applied
Pool Safety:
- Byte arrays always returned to pool in all code paths
- Catch handlers ensure cleanup even on exceptions
- Prevents memory leaks during error conditions
Performance Optimizations
Reduced Allocations:
- Object pooling for network messages (NetworkData)
- Byte array pooling for serialization buffers
- String builder reuse in hot paths
- Reduced GC pressure during gameplay
Code Generation Improvements:
- Pure C# code generators (no T4 templates)
- Debuggable generated code (committed to source control)
- Faster generation times
- Better error reporting
Aggressive Inlining:
[MethodImpl(MethodImplOptions.AggressiveInlining)]on hot paths- Bit manipulation operations inlined
- Serialization/deserialization hot paths optimized
Span and Memory Usage:
- Modern C# memory APIs for zero-copy operations
stackallocfor small temporary buffers- Reduced heap allocations in serialization
API Changes and Deprecations
New Public APIs
GONetMain:
// Scene manager access
public static GONetSceneManager SceneManager { get; }
// Thread-safe utilities
public static class GONetThreading {
public static void RunOnMainThread(Action action);
}
// Async RPC support
public async Task<TResponse> CallRpcAsync<TResponse>(string rpcMethodName, params object[] args);GONetSceneManager:
// Scene loading
public void LoadSceneFromBuildSettings(string sceneName, LoadSceneMode mode);
public void LoadSceneFromAddressables(string sceneName, LoadSceneMode mode);
// Client requests
public void RequestLoadScene(string sceneName);
public void RequestLoadAddressablesScene(string sceneName);
// Validation hooks
public event SceneLoadValidationDelegate OnValidateSceneLoad;
public bool RequiresAsyncApproval { get; set; }
// State queries
public bool IsSceneLoaded(string sceneName);
public bool IsAnySceneLoading { get; }
public IEnumerable<string> GetLoadingScenes();GONetParticipant:
// Limbo state (batch system)
public bool client_isInLimbo { get; }
public GONetParticipant_LimboMode client_limboMode { get; }New RPC Attributes:
[ServerRpc(validationMethod: "MethodName", IsPersistent = false)]
[ClientRpc(IsPersistent = false)]
[TargetRpc(validationMethod: "MethodName")]Deprecated APIs
GONetSpawnSupport_Runtime (Legacy):
- Old spawn APIs still work but delegate to new batch system internally
Client_InstantiateToBeRemotelyControlledByMe()→ Delegates toClient_TryInstantiateToBeRemotelyControlledByMe()- No breaking changes, but new code should use
Client_TryInstantiateToBeRemotelyControlledByMe()for explicit limbo mode control
Legacy Code Generation:
- Old
.ttT4 template files exist but are NOT USED - Pure C# code generators replaced T4 templates
- Backward compatibility maintained, but T4 files will be removed in future release
Migration Guide (v1.4.1 → v1.5)
Automatic Migration (No Code Changes Required)
Most games will migrate automatically with zero code changes:
-
Update Unity version (required):
- Upgrade to Unity 2022.3.62f3 LTS or later (new minimum requirement)
-
Import GONet v1.5 package:
- Delete
Assets/GONet/folder (if upgrading in-place) - Import new v1.5 package
- Resolve any API obsoletion warnings (see below)
- Delete
-
Recompile:
- Unity auto-compiles after import
- Code generation runs automatically
-
Test:
- Play scene - first instance becomes server automatically (new auto-detection)
- Run second instance - connects as client automatically
- Verify no Console errors
Optional Configuration
GONetGlobal Settings:
- Review new configuration options in GONetGlobal Inspector
- Adjust
client_GONetIdBatchSizeif spawning 100+ objects/sec per client - Enable
deferSyncBundlesWaitingForGONetReadyif turn-based game - Tune
maxPacketsPerTickandadaptivePoolBaselineSizefor your scale
Auto-Detection:
- If you prefer manual server/client startup, disable
enableAutoRoleDetection
Scene Management:
- If using custom scene loading, migrate to
GONetMain.SceneManagerAPI - Add validation hooks if restricting client scene change requests
API Obsoletion Warnings
GONetSpawnSupport_Runtime:
// OLD (still works, but warns):
GONetParticipant obj = GONetMain.Client_InstantiateToBeRemotelyControlledByMe(prefab, pos, rot);
// NEW (recommended):
if (GONetMain.Client_TryInstantiateToBeRemotelyControlledByMe(
prefab, pos, rot, out GONetParticipant obj,
GONetParticipant_LimboMode.InstantiateInLimbo))
{
// Success (may be in limbo temporarily)
}Known Issues and Workarounds
None at this time. If you encounter issues during migration:
- Check Console for errors/warnings
- Verify GONetGlobal configuration
- Review logs in
logs/gonet.log(builds) or Unity Console (editor) - Reach out via Discord or email for support
Testing and Quality Assurance
Tested Scenarios:
- 2-8 player co-op (stable, < 1% packet loss)
- 50-100 player battle royale (adaptive scaling tested)
- Rapid spawning (100+ objects/sec per client, batch system validated)
- Late-joiner synchronization (scene loads, GONetId assignments, persistent RPCs)
- Scene transitions (Build Settings and Addressables)
- Physics synchronization (Rigidbody authority transition)
- RPC validation (profanity filtering, authorization)
- High latency (200ms+ RTT, velocity sync validated)
- Packet loss (10%+ loss, reliable message queue tested)
Platforms Tested:
- Windows 10/11 (Editor and builds)
- Mac (Editor and builds)
- Linux (builds)
- iOS (builds via TestFlight)
- Android (builds)
Unity Versions Tested:
- Unity 2022.3.62f3 LTS (minimum required)
- Unity 2022.3.50f1 LTS
- Unity 2023.2 LTS
- Unity 6 (forward compatibility)
Documentation and Examples
Updated Documentation:
- Setup Guide (comprehensive, covers new features)
- API Reference (all new APIs documented)
- Scene Management Guide (new)
- RPC System Guide (updated with async/await and validation)
- GONetId Batch System Guide (new)
New Example Scenes:
GONetSampleScene.unity- Updated with scene selection UI and exit button- Scene-defined object initialization examples
- RPC validation examples (chat system with profanity filtering)
Code Comments:
- 500+ new comments explaining architecture decisions
- CLAUDE.md updated with v1.5 features and lessons learned
- Inline documentation for complex systems (batch, deferral, velocity sync)
Acknowledgments
Special Thanks:
- Community feedback on Discord (feature requests and bug reports)
- Early adopters testing pre-release builds
- Unity for 2022.3 LTS stability and performance improvements
Support and Resources
Get Help:
- Discord: https://discord.gg/NMeheRHQgd (fastest response)
- Email: contactus@galoreinteractive.com
- Website: https://galoreinteractive.com/gonet
Resources:
- Setup Guide (included in package)
- API Documentation (website)
- Tutorial Video: https://www.youtube.com/watch?v=fs1flIi35JM
- Example Projects (PRO tier)
Upgrade to PRO:
- Contact us to discuss PRO/Premium tier features
- Record+Replay, LOD, P2P, priority support
What's Next? (v1.6 Roadmap Preview)
Under Consideration:
- WebGL support (UDP via WebRTC data channels)
- Interest management (spatial culling for large worlds)
- Bandwidth profiler (identify heavy sync contributors)
- Network emulation tools (simulate latency/loss in Editor)
- Voice chat integration (Vivox, Dissonance)
Feedback Welcome:
- Let us know what features you need most
- Join roadmap discussions on Discord
- Vote on feature priorities
Conclusion
GONet v1.5 represents months of development focused on production readiness, developer experience, and performance at scale. Whether you're building a 2-player co-op game or a 100-player battle royale, GONet v1.5 provides the tools and reliability you need to ship.
Ready to update? Import v1.5 today and experience the difference!
GONet Team
Galore Interactive LLC
October 2025
Full Changelog
Added
- GONetId Batch System (pre-allocated ID ranges for client spawning)
- Enhanced RPC system (async/await, validation, persistent delivery)
- Scene Management system (server-authoritative, Addressables support)
- Adaptive Congestion Management (auto-scaling packet pools)
- Sync Bundle Deferral System (OnGONetReady race condition handling)
- Auto-Detection for Development (automatic server/client role)
- Velocity-Augmented Sync (eliminates micro-jitter)
- GONetId Reuse Protection (delay before reuse)
- Reliable Message Queue Expansion (configurable capacity)
- GONetStatusUI component (persistent status display)
- Scene Selection UI (server-side scene picker)
- Exit Button UI (graceful disconnect with approval)
- Message Flow Logging (comprehensive debugging)
- GONetThreading utilities (main-thread marshalling)
- Physics sync timing improvements (WaitForFixedUpdate)
Changed
- Upgraded to Unity 2022.3.62f3 LTS (new minimum required version)
- Legacy spawn APIs delegate to batch system internally
- Improved singleton pattern for GONetGlobal (DestroyImmediate)
- Time sync improvements (separate pre/post-load requests)
- Deferred RPC execution (queue when components not ready)
Fixed
- Late-joiner GONetId synchronization race conditions
- Spawn data provider race condition (IGONetSpawnDataProvider)
- Duplicate GONetGlobal handling (scene unloading)
- Addressables loading stability (handle cleanup, exceptions)
- Scene unload cleanup (GONetId tracking, buffered assignments)
- Pool safety (byte arrays always returned)
- Physics sync timing (captures final state after all processing)
Deprecated
- Legacy T4 template code generators (replaced with pure C# generators)
- Old spawn APIs (still work, but new API recommended)
Removed
- None (backward compatibility maintained)
End of Release Notes