Запускайте мультиплеерные
игры
быстрее
Создавайте и запускайте мультиплеерные проекты в реальном времени на KidsGames. Открытый фреймворк для Node.js со встроенным матчмейкингом, синхронизацией состояния и SDK для Unity, Defold, Construct, Haxe, JavaScript и других платформ.
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 });Почему KidsGames
Всё необходимое для мультиплеера
Синхронизация состояния в реальном времени
Автоматическая бинарная синхронизация состояния. Опишите state один раз — он синхронизируется везде.
Встроенный матчмейкинг
Автоматическое создание комнат и подбор игроков. Настраиваемая фильтрация и сортировка.
Масштабируемая архитектура
Масштабируйтесь с 10 до 10 000+ CCU. Распределяйте комнаты между процессами и машинами.
Защита от читеров по умолчанию
Авторитарная серверная архитектура. Клиенты отправляют ввод — решения принимает сервер.
SDK для разных платформ
JavaScript, Unity, Defold, Construct 3, Haxe, Cocos Creator и другие. Используйте привычные инструменты.
Бесплатно и с открытым кодом
Лицензия MIT. Бесплатно навсегда, даже для коммерческих игр. Полный контроль над инфраструктурой.
Витрина
Игры на KidsGames
Подборка мультиплеерных игр, созданных довольными разработчиками.
Без привязки к вендору
Ваш сервер — ваши правила
KidsGames — обычное приложение на Node.js. Разворачивайте его где угодно: без проприетарных рантаймов, закрытых экосистем и сюрпризов.
Обычный Node.js
Никакого проприетарного рантайма. Ваш сервер KidsGames — это обычное приложение на Node.js: любой npm-пакет, любые привычные инструменты.
Хостинг где угодно
AWS, Google Cloud, DigitalOcean, Fly.io, Railway, bare metal — если там работает Node.js, значит работает и KidsGames.
Не хотите заниматься серверами?
KidsGames Cloud берёт на себя развёртывание, масштабирование и мониторинг в 32 локациях по всему миру. От 1 500 ₽/мес.
Сравнение
Чем KidsGames отличается
vs Photon
- Открытый код, свои серверы
- Без сюрпризов в цене за CCU
- Полный контроль на стороне сервера
vs Mirror
- Работает с любым игровым движком
- Не привязан к Unity
- Запускается как отдельный серверный процесс
vs Nakama
- Проще API, быстрее освоить
- Нативная поддержка TypeScript
- Создан для мультиплеера на комнатах
vs с нуля
- Проверен в продакшене
- Запуск за дни, а не месяцы
- Активная поддержка сообщества
Истории успеха
Нам доверяют инди-разработчики и студии по всему миру
"...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.
Стать партнёром