Интеграция игры с блокчейн-кошельком — Web3 и Unity

Представьте: игрок в хардкорный экшен должен в разгар битвы открыть MetaMask и подтвердить транзакцию на покупку зелья. В 80% случаев он либо провалит миссию, либо разочаруется в процессе. Наша задача — убрать этот разрыв, сделав криптотранзакции невидимыми для геймплея. Мы интегрировали блокчейн-ко

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

Представьте: игрок в хардкорный экшен должен в разгар битвы открыть MetaMask и подтвердить транзакцию на покупку зелья. В 80% случаев он либо провалит миссию, либо разочаруется в процессе. Наша задача — убрать этот разрыв, сделав криптотранзакции невидимыми для геймплея. Мы интегрировали блокчейн-кошельки в более чем 50 игровых проектов — от инди до AAA, с 6-летним опытом в GameFi. Пользователи приходят играть, а не разбираться с gas, approve и seed phrases. Разберём конкретные паттерны для разных типов игр: от WebGL на Unity до мобильных билдов с WalletConnect.

Как выбрать метод интеграции блокчейн-кошелька?

Внешние кошельки (MetaMask, Phantom)

Стандарт для аудитории, уже знакомой с криптой. Через Wagmi (React) или WalletConnect AppKit подключение выглядит так:

import { useConnect, useAccount } from "wagmi"; import { injected, walletConnect } from "wagmi/connectors"; function WalletConnect() { const { connect, connectors } = useConnect(); const { address, isConnected } = useAccount(); if (isConnected) return <GameLobby address={address} />; return ( <div> <button onClick={() => connect({ connector: injected() })}>MetaMask</button> <button onClick={() => connect({ connector: walletConnect({ projectId: WC_PROJECT_ID }) })}>WalletConnect</button> </div> ); } 

Embedded wallets — для массовой аудитории

Для casual игр — пользователи не хотят устанавливать расширения. Embedded wallet создаётся автоматически при регистрации через Google/Apple, используя SDK вроде Web3Auth или Privy. Игра получает готовый адрес без установки кошелька. Это снижает конверсию потери на 40% по сравнению с требованием установки расширения.

Session keys: взаимодействие без подписи каждый раз

Главная UX-проблема GameFi — каждое действие требует подписи в MetaMask. Session keys решают это: пользователь один раз авторизует сессионный ключ, игра использует его для транзакций автоматически. На практике мы реализовали это через ZeroDev SDK для пошаговой RPG — количество подписей на игрока снизилось с 10 до 1 за сессию (в 10 раз быстрее).

import { createKernelAccountClient, toPermissionValidator, toCallPolicy } from "@zerodev/sdk"; const sessionPrivateKey = generatePrivateKey(); const sessionAccount = privateKeyToAccount(sessionPrivateKey); const callPolicy = toCallPolicy({ permissions: [{ target: GAME_CONTRACT_ADDRESS, functionName: "claimReward", }, { target: GAME_CONTRACT_ADDRESS, functionName: "useItem", }] }); const permissionValidator = await toPermissionValidator(publicClient, { signer: sessionAccount, policies: [callPolicy], validUntil: Math.floor(Date.now() / 1000) + 3600, }); const kernelClient = await createKernelAccountClient({ account: kernelAccount }); 

Unity интеграция: WebGL и Mobile

WebGL: JSLib bridge

В Unity WebGL нет прямого доступа к MetaMask — нужен JavaScript bridge. Мы используем готовую обёртку для вызова ethereum API:

// Plugins/WebGL/wallet.jslib mergeInto(LibraryManager.library, { ConnectWallet: async function() { if (typeof window.ethereum === 'undefined') alert('MetaMask not installed'); const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' }); unityInstance.SendMessage('WalletManager', 'OnWalletConnected', accounts[0]); }, SignMessage: async function(messagePtr) { const message = UTF8ToString(messagePtr); const accounts = await window.ethereum.request({ method: 'eth_accounts' }); const signature = await window.ethereum.request({ method: 'personal_sign', params: [message, accounts[0]] }); unityInstance.SendMessage('WalletManager', 'OnMessageSigned', signature); } }); 

На стороне C# достаточно обернуть это в MonoBehaviour:

using System.Runtime.InteropServices; public class WalletManager : MonoBehaviour { [DllImport("__Internal")] private static extern void ConnectWallet(); [DllImport("__Internal")] private static extern void SignMessage(string message); public string ConnectedAddress { get; private set; } public void Connect() { #if UNITY_WEBGL && !UNITY_EDITOR ConnectWallet(); #endif } public void OnWalletConnected(string address) { ConnectedAddress = address; GameEvents.WalletConnected?.Invoke(address); } } 

Mobile: WalletConnect deep links

На мобильном Unity используем WalletConnect Sharp для открытия приложения кошелька через deep link. Это протестировано на iOS и Android — пользователь переходит в MetaMask или Trust Wallet и возвращается в игру после подписи.

Почему важна обработка транзакций в игровом контексте?

Optimistic UI updates

Ждать finality транзакции (10–30 секунд на L2, минуты на mainnet) в игре неприемлемо. Мы применяем optimistic updates: показываем результат немедленно, откатываем если транзакция фейлится. Это стандарт в нашей практике — ни один игрок не должен видеть "Pending..." дольше 2 секунд.

Account Abstraction бьёт батчингом

Account Abstraction позволяет отправить несколько операций в одной транзакции. Вместо approve + buy (2 подписи) — один multicall. Средняя экономия на gas составляет 30-50%:

const txHash = await smartAccountClient.sendUserOperation({ calls: [ { to: TOKEN_ADDRESS, abi: erc20Abi, functionName: "approve", args: [MARKETPLACE_ADDRESS, price] }, { to: MARKETPLACE_ADDRESS, abi: marketplaceAbi, functionName: "buyItem", args: [itemId] }, ], }); 

Сравнение: session keys vs стандартные подписи

Параметр Стандартная подпись Session keys
Количество кликов на операцию 2-3 (popup + confirm) 0 (автоматически)
UX в быстрой игре Катастрофа (отвлекает) Плавный
Безопасность Полный доступ Ограниченный (scope)
Время настройки Минуты Часы (конфигурация политик)

Session keys — выбор для Action/RPG с высокой частотой транзакций. Для кэжуал (одна транзакция в час) достаточно embedded wallet.

Что такое session keys и как они работают?

Session keys — это механизм, при котором пользователь подписывает сессионный ключ с ограниченными правами (например, только на функции claimReward и useItem). Ключ хранится в игре и используется для автоматической отправки транзакций в течение заданного времени. В нашем кейсе с RPG время настройки политик заняло 2 дня, но результат — 10-кратное ускорение взаимодействия.

Как мы это делаем: процесс интеграции за 4 шага

  1. Анализ архитектуры — выбираем метод подключения под платформу (WebGL, mobile, desktop) с учётом целевой аудитории.
  2. Реализация подключения — интеграция Wagmi/WalletConnect или embedded SDK.
  3. Настройка session keys — если требуется частая отправка транзакций, конфигурируем политики и срок действия ключей.
  4. UI/UX для транзакций — optimistic updates, pending-индикаторы, recovery после ошибок. Тестируем все кейсы: отказ, network switch, gas failure.

Что входит в интеграцию

  • Разработка API-обёрток для взаимодействия с кошельками
  • Документация по интеграции SDK и конфигурации
  • Обучение команды заказчика (2-3 рабочих дня)
  • Тестовая среда с mock транзакциями
  • Поддержка в течение 2 недель после релиза

Сроки — от 2 недель (базовая интеграция) до 2 месяцев (полный цикл с session keys и account abstraction). Стоимость рассчитывается индивидуально. Свяжитесь с нами для предварительной оценки вашего проекта. Закажите интеграцию — получите игру, где криптотранзакции стали невидимыми.

Мы сталкивались с типичными проблемами: закрытие MetaMask popup, ошибки gas estimation, несоответствие сети и отклонение транзакции. Для каждой есть решение: очередь транзакций, статические лимиты газа с fallback RPC, автоматическое переключение сети через wallet_switchEthereumChain и корректная обработка отмены. Ключевой принцип: блокчейн асинхронен, игра — синхронна. Мы проектируем UI так, чтобы pending состояние было явным, а failure — recoverable. Получите консультацию по вашей игре — сделаем ваш GameFi проект дружелюбным для миллионов игроков.