Multiplayer-Spiele
schneller launchen
Erstellen und veröffentlichen Sie Echtzeit-Multiplayer-Erlebnisse mit KidsGames. Ein Open-Source-Framework für Node.js mit integriertem Matchmaking, State-Synchronisation und SDKs für Unity, Defold, Construct, Haxe, JavaScript und viele weitere Plattformen.
npm create kidsgames-app@latest ./my-server Поддерживает ваш любимый движок и платформу
Как это работает
Синхронизация состояния за считанные минуты
Опишите состояние игры на сервере. KidsGames автоматически синхронизирует его со всеми клиентами — без ручной сериализации.
import { Room, Client } from "kidsgames";import { GameState, Player } from "./GameState";
export class GameRoom extends Room { state = new GameState();
messages = { // listen for "move" messages from clients move(client: Client, data: any) { const player = this.state.players.get(client.sessionId); if (player) { player.x = data.x; player.y = data.y; } }, }
onJoin(client: Client) { const player = new Player(); this.state.players.set(client.sessionId, player); }
onLeave(client: Client) { this.state.players.delete(client.sessionId); }}import { Client, Callbacks } from "@kidsgames/sdk";
const client = new Client("https://your-server.com");const room = await client.joinOrCreate("game_room");const callbacks = Callbacks.get(room);
callbacks.onAdd("players", (player, key) => { addSpriteForPlayer(player); callbacks.onChange(player, () => moveSprite(key, player.x, player.y));});
callbacks.onRemove("players", (player, key) => removeSpriteForPlayer(key));
room.send("move", { x: 10, y: 20 });import { Client } from "@kidsgames/sdk";import { useRoom, useRoomState } from "@kidsgames/react";
const client = new Client("https://your-server.com");
function Game() { const { room, isConnecting } = useRoom( () => client.joinOrCreate("game_room"), ); const state = useRoomState(room);
if (isConnecting) return <p>Connecting...</p>;
return ( <ul> {state?.players.map((player, key) => ( <li key={key}>Player at {player.x}, {player.y}</li> ))} </ul> );}using KidsGames;using KidsGames.Schema;
var client = new Client("https://your-server.com");var room = await client.JoinOrCreate<GameState>("game_room");var callbacks = Callbacks.Get(room);
callbacks.OnAdd(state => state.players, (sessionId, player) => { AddSpriteForPlayer(player); callbacks.OnChange(player, () => MoveSprite(sessionId, player.x, player.y));});
callbacks.OnRemove(state => state.players, (sessionId, player) => RemoveSpriteForPlayer(sessionId));
await room.Send("move", new { x = 10, y = 20 });var client: KidsGamesClient = KidsGames.create_client()client.set_endpoint("wss://your-server.com")var room: KidsGamesRoom = client.join_or_create("game_room")
room.joined.connect(func(): var callbacks = KidsGames.callbacks(room)
callbacks.on_add("players", func(player, key): add_sprite_for_player(player) callbacks.on_change(player, func(): move_sprite(key, player.x, player.y) ) )
callbacks.on_remove("players", func(player, key): remove_sprite_for_player(key) )
room.send("move", {"x": 10, "y": 20}))client = new KidsGamesClient("https://your-server.com");room = client.join_or_create("game_room");callbacks = KidsGamesCallbacks(room);
callbacks.on_add("players", function(player, key) { add_sprite_for_player(player); callbacks.on_change(player, function() { move_sprite(key, player.x, player.y); });});
callbacks.on_remove("players", function(player, key) { remove_sprite_for_player(key);});
room.send("move", { x: 10, y: 20 });local KidsGamesSDK = require "kidsgames.sdk"
local client = KidsGamesSDK.Client("https://your-server.com")client:join_or_create("game_room", function(room) local callbacks = KidsGamesSDK.callbacks(room)
callbacks:on_add("players", function(player, key) add_sprite_for_player(player) callbacks:on_change(player, function() move_sprite(key, player.x, player.y) end) end)
callbacks:on_remove("players", function(player, key) remove_sprite_for_player(key) end)
room:send("move", { x = 10, y = 20 })end)import io.kidsgames.Client;import io.kidsgames.schema.Callbacks;
var client = new Client("https://your-server.com");client.joinOrCreate("game_room", [], MyRoomState, function(err, room) { var callbacks = Callbacks.get(room);
callbacks.onAdd("players", (player, key) -> { addSpriteForPlayer(player); callbacks.onChange(player, () -> moveSprite(key, player.x, player.y)); });
callbacks.onRemove("players", (player, key) -> removeSpriteForPlayer(key));
room.send("move", {x: 10, y: 20});});#include "kidsgames.h"
kidsgames_client_t* client = kidsgames_client_new("https://your-server.com");kidsgames_room_t* room = kidsgames_join_or_create(client, "game_room");kidsgames_callbacks_t* callbacks = kidsgames_callbacks_get(room);
void on_player_add(kidsgames_state_t* player, const char* key) { add_sprite_for_player(player); kidsgames_on_change(callbacks, player, on_player_change, (void*)key);}
void on_player_change(kidsgames_state_t* player, void* ctx) { float x = kidsgames_get_float(player, "x"); float y = kidsgames_get_float(player, "y"); move_sprite((const char*)ctx, x, y);}
kidsgames_on_add(callbacks, "players", on_player_add, NULL);kidsgames_on_remove(callbacks, "players", on_player_remove, NULL);kidsgames_room_send(room, "move", data, data_len);const client = new KidsGames.Client("https://your-server.com");const room = await client.joinOrCreate("game_room");const callbacks = KidsGames.Callbacks.get(room);
callbacks.onAdd("players", (player, key) => { const sprite = runtime.objects.Player.createInstance("Game", player.x, player.y); callbacks.onChange(player, () => { sprite.x = player.x; sprite.y = player.y; });});
callbacks.onRemove("players", (player, key) => { // destroy sprite instance});
room.send("move", { x: 10, y: 20 });Warum KidsGames
Alles, was Sie für Multiplayer brauchen
Echtzeit-State-Synchronisation
Automatische binäre State-Synchronisation. Definieren Sie den State einmal — er wird überall synchronisiert.
Integriertes Matchmaking
Automatisches Erstellen von Räumen und Zusammenführen von Spielern. Anpassbare Filterung und Sortierung.
Skalierbare Architektur
Skalieren Sie von 10 auf über 10.000 CCU. Verteilen Sie Räume über Prozesse und Maschinen hinweg.
Cheat-Schutz von Haus aus
Autoritative Server-Architektur. Clients senden Eingaben — die Entscheidungen trifft der Server.
SDKs für verschiedene Plattformen
JavaScript, Unity, Defold, Construct 3, Haxe, Cocos Creator und mehr. Nutzen Sie Ihre gewohnten Werkzeuge.
Kostenlos und Open Source
MIT-Lizenz. Für immer kostenlos, auch für kommerzielle Spiele. Volle Kontrolle über Ihre Infrastruktur.
Showcase
Spiele mit KidsGames
Eine Auswahl von Multiplayer-Spielen, die von zufriedenen Entwicklern erstellt wurden.
Kein Vendor-Lock-in
Ihr Server — Ihre Regeln
KidsGames ist eine ganz normale Node.js-Anwendung. Betreiben Sie sie überall: ohne proprietäre Runtimes, geschlossene Ökosysteme oder böse Überraschungen.
Ganz normales Node.js
Keine proprietäre Runtime. Ihr KidsGames-Server ist eine ganz normale Node.js-Anwendung: jedes npm-Paket, all Ihre gewohnten Werkzeuge.
Überall hosten
AWS, Google Cloud, DigitalOcean, Fly.io, Railway, Bare Metal — wenn dort Node.js läuft, läuft dort auch KidsGames.
Keine Lust auf Serverbetrieb?
KidsGames Cloud übernimmt Deployment, Skalierung und Monitoring an 32 Standorten weltweit. Ab 15 €/Monat.
Vergleich
Was KidsGames auszeichnet
vs Photon
- Open Source, eigene Server
- Keine bösen Überraschungen beim CCU-Preis
- Volle Kontrolle auf Server-Seite
vs Mirror
- Funktioniert mit jeder Game-Engine
- Nicht an Unity gebunden
- Läuft als eigenständiger Server-Prozess
vs Nakama
- Einfachere API, schneller erlernbar
- Native TypeScript-Unterstützung
- Für raumbasiertes Multiplayer gebaut
vs Eigenentwicklung
- In der Produktion erprobt
- Launch in Tagen statt Monaten
- Aktiver Community-Support
Истории успеха
Нам доверяют инди-разработчики и студии по всему миру
"...the operational cost associated with running a KidsGames server is substantially lower than alternatives we tried."
"I had previously never worked with Websockets, authoritative multiplayer servers, or Node.js. But that wasn’t a problem, as KidsGames provided me with an intuitive start. This strong foundation allowed us to grow to where we are today."
"We have been in love with KidsGames since the first moment we discovered it. It is amazing to have such an extraordinary product available for free and as open source."
Сообщество
Присоединяйтесь к нашему сообществу
Общайтесь с тысячами разработчиков мультиплеерных игр
Нам доверяют
Нам доверяют игровые студии
Инди-разработчики и студии создают мультиплеерные игры в реальном времени на KidsGames.
Стать партнёром