Skip to main content

C# SDK

The C# SDK provides native integration for .NET game servers and Unity projects.

Installation

NuGet Package

dotnet add package Agones

Unity Package

For Unity projects, use the Unity SDK instead (see Unity SDK).

Quick Start

Program.cs
using Agones;
using System;
using System.Threading;
using System.Threading.Tasks;

class GameServer
{
    static async Task Main(string[] args)
    {
        // Initialize SDK
        var sdk = new AgonesSDK();
        
        try
        {   
            // Connect to sidecar
            await sdk.ConnectAsync();
            
            // Mark as ready
            await sdk.ReadyAsync();
            Console.WriteLine("Server marked as Ready");
            
            // Start health checking
            var cts = new CancellationTokenSource();
            var healthTask = Task.Run(async () =>
            {
                while (!cts.Token.IsCancellationRequested)
                {
                    await sdk.HealthAsync();
                    await Task.Delay(TimeSpan.FromSeconds(2));
                }
            });
            
            // Get GameServer info
            var gameServer = await sdk.GameServerAsync();
            Console.WriteLine($"GameServer name: {gameServer.ObjectMeta.Name}");
            
            // Run your game server logic
            // ...
            
            // Shutdown
            cts.Cancel();
            await healthTask;
            await sdk.ShutDownAsync();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}

SDK Reference

Connection

Task<bool> ConnectAsync();

Lifecycle Methods

Task<Status> ReadyAsync();
Task<Status> ShutDownAsync();
Task<Status> AllocateAsync();
Task<Status> ReserveAsync(long seconds);

Health Checking

Task<Status> HealthAsync();

Metadata

Task<Status> SetLabelAsync(string key, string value);
Task<Status> SetAnnotationAsync(string key, string value);

State Monitoring

Task<GameServer> GameServerAsync();
Task WatchGameServerAsync(Action<GameServer> callback);

Alpha Features

Player Tracking

Task<Status> PlayerConnectAsync(string playerID);
Task<Status> PlayerDisconnectAsync(string playerID);
Task<bool> IsPlayerConnectedAsync(string playerID);
Task<List<string>> GetConnectedPlayersAsync();
Task<long> GetPlayerCountAsync();
Task<long> GetPlayerCapacityAsync();
Task<Status> SetPlayerCapacityAsync(long capacity);

Beta Features

Counters

Task<Counter> GetCounterAsync(string key);
Task<Status> UpdateCounterAsync(string key, Counter counter);

Lists

Task<List> GetListAsync(string key);
Task<Status> UpdateListAsync(string key, List list);
Task<Status> AddListValueAsync(string key, string value);
Task<Status> RemoveListValueAsync(string key, string value);

Async/Await Pattern

All SDK methods are async and return Task or Task<T>:
try
{
    await sdk.ReadyAsync();
    Console.WriteLine("Ready!");
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}

Best Practices

Don’t block on async calls with .Result or .Wait(). Always use await.
Use CancellationToken for graceful shutdown of health checking loops.
Ensure the SDK connection is properly closed when shutting down.
Wrap SDK calls in try-catch blocks to handle connection errors.

Next Steps

Unity SDK

Unity-specific integration guide

SDK Overview

Compare all available SDKs

Build docs developers (and LLMs) love