Интеграция с Decentraland SDK
Decentraland — браузерная метавселенная на базе Ethereum, где land-участки (LAND) являются NFT. SDK 7 (текущая версия) даёт возможность создавать интерактивные сцены с 3D-объектами, игровой логикой и Web3-интеграцией.
Структура проекта Decentraland
npx @dcl/sdk-commands init my-scene --skip-install
cd my-scene && npm install
Структура:
my-scene/
├── src/
│ ├── index.ts # точка входа сцены
│ └── systems/ # игровые системы
├── assets/ # 3D модели, текстуры
└── scene.json # метаданные (координаты парцели, title)
Создание интерактивной сцены
import { engine, Entity, Transform, GltfContainer,
PointerEvents, InputAction, inputSystem } from '@dcl/sdk/ecs'
import { Vector3, Quaternion } from '@dcl/sdk/math'
export function main() {
// Создаём интерактивный объект
const nftDisplay = engine.addEntity()
Transform.create(nftDisplay, {
position: Vector3.create(8, 1, 8),
scale: Vector3.create(1, 1, 1),
rotation: Quaternion.fromEulerDegrees(0, 0, 0),
})
GltfContainer.create(nftDisplay, {
src: 'assets/nft_frame.glb',
})
// Обработчик клика
PointerEvents.create(nftDisplay, {
pointerEvents: [{ eventType: PointerEventType.PET_DOWN,
info: { button: InputAction.IA_POINTER, hoverText: 'Inspect NFT' } }],
})
// Система обновления
engine.addSystem(() => {
if (inputSystem.isTriggered(InputAction.IA_POINTER, PointerEventType.PET_DOWN, nftDisplay)) {
openNFTDetails()
}
})
}
Web3 интеграция
Decentraland SDK 7 поддерживает взаимодействие с кошельком пользователя через @dcl/sdk/ethereum-provider:
import { createEthereumProvider } from '@dcl/sdk/ethereum-provider'
import { ethers } from 'ethers'
async function checkNFTOwnership(tokenId: number): Promise<boolean> {
const provider = createEthereumProvider()
const ethProvider = new ethers.BrowserProvider(provider)
const signer = await ethProvider.getSigner()
const userAddress = await signer.getAddress()
const nftContract = new ethers.Contract(NFT_CONTRACT_ADDRESS, ERC721_ABI, ethProvider)
const owner = await nftContract.ownerOf(tokenId)
return owner.toLowerCase() === userAddress.toLowerCase()
}
// Показываем эксклюзивный контент только владельцам NFT
async function unlockExclusiveArea() {
const hasAccess = await checkNFTOwnership(MEMBERSHIP_TOKEN_ID)
if (hasAccess) {
showExclusiveContent()
} else {
showPurchasePrompt()
}
}
Серверная логика через Scene Runtime
Для сложной логики (мультиплеер, игровые механики) используется Decentraland Scene Server на базе TypeScript:
// server/index.ts
import { WebSocketServer } from 'ws'
const wss = new WebSocketServer({ port: 8080 })
const players = new Map<string, PlayerState>()
wss.on('connection', (ws, req) => {
const playerId = getPlayerIdFromRequest(req)
ws.on('message', (data) => {
const event = JSON.parse(data.toString())
switch(event.type) {
case 'MOVE':
players.set(playerId, event.position)
broadcastToAll({ type: 'PLAYER_MOVED', playerId, position: event.position })
break
case 'INTERACT':
handleInteraction(playerId, event.objectId)
break
}
})
})
Деплой сцены: npx @dcl/sdk-commands deploy — загружает контент на Decentraland Content Server. Приватные сцены деплоятся на своей инфраструктуре через catalyst node.
Разработка простой интерактивной Decentraland сцены с Web3 интеграцией: 3–5 недель. Сложная сцена с мультиплеером и игровыми механиками — 2–3 месяца.







