신규: Parsed Events Scan API를 사용해 보세요
게이밍: Solana가 게임의 판도를 바꾸는 방법
블로그/연구

게이밍: Solana가 게임의 판도를 바꾸는 방법

Developer Experience EngineerX의 0xIchigoLinkedIn의 0xIchigoGitHub의 0xIchigo
읽는 데 28분

이 글에서 다루는 내용

키가 없으면 암호화폐도 내 것이 아닙니다. 암호화폐의 핵심 철학을 담은 이 격언은 비디오 게임에도 그대로 적용됩니다. 게임 환경에 블록체인을 통합하는 것은 단순한 혁신을 넘어섭니다. 탈중앙화된 자산 소유권과 자율성을 구현하는 패러다임 전환입니다. 그 변화의 선두에 Solana가 있습니다. Solana는 Web3의 이점을 활용할 수 있는 가장 빠른 스마트 컨트랙트 플랫폼을 제공합니다. 개발자는 Solana의 빠른 속도, 낮고 예측 가능한 수수료, 짧은 지연 시간을 활용해 다른 곳에서는 불가능한 독창적인 게임 경험을 만들 수 있습니다.

이 글에서는 게임 분야에서 블록체인이 지닌 잠재력을 살펴봅니다. Web3 게이밍이 필요한 이유와 게임 개발자가 Solana를 선택해야 하는 이유를 알아봅니다. 또한 인기 프레임워크와 플랫폼을 설치하고 구성해 Solana 통합 게임을 만드는 방법도 설명합니다.

Web3 게이밍이 필요한 이유

게이머에게 주는 이점

수집품으로 Counter-Strike를 따라올 비디오 게임은 없습니다. 희귀도와 플로트 값에 따라 가장 희귀한 Counter Strike 2 스킨, 즉 게임 내 무기 장식 아이템은 수천 달러의 가치를 지닐 수 있습니다. Counter-Strike 커뮤니티의 유명 트레이더인 Neon은 10만 달러가 넘는 스킨 인벤토리를 보유하고 있었습니다. 2023년 10월 13일, AMD의 Anti-lag+ 기능을 활성화한 뒤 Valve의 Anti-Cheat(VAC) 시스템에 의해 부당하게 차단되었습니다. VAC 차단을 당하면 플레이어의 인벤토리를 거래할 수 없습니다. Neon의 10만 달러 상당 인벤토리가 계정에 영구 귀속된 것입니다. Valve는 이 문제에 공식 대응했고, 다행히 Neon의 차단은 해제되었습니다. 하지만 Counter-Strike 2에서는 여전히 잘못된 게임 차단 문제가 발생하고 있습니다.

Steam 같은 기존 게임 플랫폼에서는 구매한 게임이나 수집품에 대한 접근 권한을 잃을 위험이 항상 존재합니다. Valve가 사용자의 자산을 빼앗지 못하게 막을 방법은 없습니다. 평판이 심각하게 훼손되고 전체 플레이어 기반이 무너질 수 있으므로 실제로 그럴 가능성은 낮습니다. 하지만 희귀 아이템의 드롭률을 높여 가치를 떨어뜨릴 수는 있습니다. Team Fortress 2에서 실제로 이런 일이 발생했습니다. 가치와 관계없이 구매한 모든 게임과 수집한 모든 게임 내 아이템은 중앙화된 주체가 관리합니다. 게이머는 게임 기업의 결정에 좌우됩니다. 심지어 Ethereum도 World of Warcraft의 3.10 패치 때문에 탄생했습니다. Blizzard가 Vitalik Buterin 캐릭터의 생명력 흡수 주문을 약화해 수년간의 플레이를 망치자, 그는 “중앙화의 공포”에 관해 여러 차례 이야기했습니다. 게이머는 중앙화된 주체에 좌우되는 데 지쳤습니다. Web3 게이밍은 여기서 벗어날 방법을 제공합니다.

Web3 게이밍은 패러다임의 전환입니다. 블록체인 기술을 활용해 자산 소유권과 의사결정 과정을 탈중앙화합니다. 투명성과 보안을 보장하며, 플레이어가 여러 플랫폼에서 게임 내 자산을 실질적으로 소유하게 합니다. 그 결과 Counter-Strike의 스킨 시장과 같은 가상 경제에 투명성, 보안, 조합 가능성이 더해집니다. 또한 플레이로 현실 세계의 가치를 보상받는 Play-to-earn(P2E) 같은 새로운 사용자 중심 게임 모델을 구현할 수 있습니다.

이는 틈새 개념과 거리가 멉니다. 여러 게임이 성공과 영향력을 입증하면서 Web3 게이밍이 업계를 혁신할 잠재력도 분명해졌습니다. 예를 들어 Decentraland는 플레이어가 부동산을 NFT로 사고팔고 개발할 수 있는 가상 세계를 제공합니다. Tokens.com은 Decentraland 도심의 부동산을 200만 달러 넘게 주고 매입했습니다. 이는 Web3 생태계 안에서 가상 경제, 디지털 경험, 개인 공간이 지닌 가능성을 보여줍니다. 마찬가지로 Axie Infinity 같은 Play-to-earn 게임과 move-to-earn 플랫폼인 STEPN 같은 라이프스타일 앱은 플레이어가 게임을 통해 수익을 얻는 방법을 보여주며 전 세계의 관심을 끌었습니다. Solana에서도 Star Atlas와 Aurory 같은 게임이 비슷한 성공을 거뒀습니다. 이는 고립된 사례가 아닙니다. 게임이 엔터테인먼트를 넘어 현실의 경제 및 사회 시스템과 융합하는 더 큰 흐름의 일부입니다.

개발자에게 주는 이점

Web3 게이밍의 등장은 기존 게임 패러다임의 경계를 훨씬 뛰어넘는 새로운 기회를 게임 개발자에게 제공합니다.

  • 더 깊은 시장과 신뢰 보장: Web3 게이밍은 더 깊고 견고한 시장을 만듭니다. 게임 개발자는 참여자들이 더 높은 신뢰를 바탕으로 활동하는 글로벌 사용자층에 접근할 수 있습니다. 모든 게임 내 소유권과 트랜잭션은 검증 가능하며 변경할 수 없습니다. 블록체인 고유의 투명성과 보안 덕분입니다.
  • 기존 온체인 프로그램 활용: 개발자는 기존 프로그램과 관련 자산을 게임에 손쉽게 통합할 수 있습니다. 출시 시간을 단축하는 동시에 생태계 협업을 통해 창의성과 혁신에 집중할 수 있습니다.
  • 경제 및 게임플레이 혁신: 게임 개발자는 다른 온체인 애플리케이션이나 경험을 활용해 정교한 게임 및 경제 루프를 설계할 수 있습니다. 이러한 연결성은 한 게임의 행동이 다른 게임에도 파급 효과를 일으키는 풍부하고 역동적인 게임 세계를 구현합니다.
  • 모딩 장려: 블록체인의 개방성 덕분에 게임 개발자는 모딩을 장려하는 방식으로 게임을 만들 수 있습니다. 플레이어가 게임의 발전에 기여하는 커뮤니티 주도 혁신으로 이어질 수 있습니다. 폐쇄형 환경에서 협력적이고 커뮤니티 중심적인 개발 모델로 전환하는 것입니다.

블록체인은 단순한 게임 개발 플랫폼 그 이상입니다. 새로운 형태의 인터랙티브 디지털 경험을 개척하는 통로입니다. 블록체인은 더 역동적이고 참여적인 게임 생태계를 위한 길을 엽니다.

Solana에서 개발해야 하는 이유

낮고 예측 가능한 트랜잭션 수수료는 Web3 게이밍에 매우 중요합니다. 게이머는 게임을 플레이하기 위해 터무니없는 수수료를 내고 싶어 하지 않습니다. Solana의 트랜잭션 수수료는 낮으며 대개 미화 0.001달러 미만입니다. 비투표 트랜잭션의 평균 수수료는 약 0.000005~0.00007 SOL입니다. 로컬 수수료 시장 덕분에 예측도 가능합니다. 혼잡을 격리하므로 수요가 높은 상태 영역에 접근하려는 트랜잭션의 수수료만 높아집니다. 이는 Ethereum 같은 가스 기반 네트워크와 다릅니다. 이런 네트워크에서는 트랜잭션 수수료를 예측하기 어렵고, 혼잡이 심하면 간단한 트랜잭션에도 100달러가 넘는 비용이 들 수 있습니다.

Solana의 아키텍처는 독보적인 조합 가능성을 제공합니다. 플레이어는 하나의 지갑으로 간소화된 사용자 경험을 누릴 수 있습니다. 다른 플랫폼으로 브리징하는 복잡한 과정을 걱정할 필요가 없습니다. Solana 생태계 안에서 모든 요소에 접근할 수 있고 서로 연결되어 있습니다. 게임 개발자에게 조합 가능성은 풍부한 기회를 제공합니다. 기존 온체인 프로그램을 손쉽게 통합하고 활용할 수 있습니다. 예를 들어 The Remnants와 Magic Eden의 파트너십이 있습니다. 게임 자산의 유동성이 다른 L2나 샤드에 분산되지 않습니다. Solana는 조합 가능한 생태계를 조성해 네트워크상의 게임, 커뮤니티, 기타 애플리케이션이 원활하게 협업하도록 지원합니다.

빠른 속도와 짧은 지연 시간은 게임에 필수적입니다. 느린 트랜잭션은 게임 상태 업데이트를 방해하고, 견디기 어려운 지연과 긴 대기 시간을 유발할 수 있습니다. 기존 게임보다 나쁜 사용자 경험을 제공하게 됩니다. Solana는 높은 트랜잭션 처리량을 위해 설계되었습니다. 사용자가 생성하는 트랜잭션은 초당 평균 400건(TPS)이며, 수요가 많을 때는 2,000 TPS를 넘습니다. Firedancer 같은 혁신이 도입되면 Solana는 기존의 모든 소비자용 애플리케이션을 지원할 수 있는 규모로 확장될 잠재력이 있습니다. Solana의 목표 슬롯 시간, 즉 각 원장이 트랜잭션을 수집하고 블록을 생성하는 데 걸리는 시간은 400밀리초입니다. 네트워크 수요에 따라 500~600밀리초 사이로 달라질 수 있지만, 여전히 현재 사용 가능한 가장 빠른 블록체인입니다. 따라서 전략 게임, 턴제 게임, 도시 건설 게임, 방치형 게임 같은 장르에 완벽한 실시간 데이터베이스가 됩니다.

Forever Games는 완전한 온체인 게임입니다. 게임의 상태와 로직이 모두 블록체인에서 실행되는 가장 극단적인 블록체인 통합 사례입니다. 진입 장벽이 낮고 풍부한 프로토콜, dApp, 프로그램 시스템에 연결된 영속적인 게임을 구현할 수 있습니다. Solana의 사례는 다음과 같습니다.

게이머 입장에서 400밀리초의 응답 시간은 실시간 레이싱이나 슈팅 게임에 끔찍하게 느껴질 수 있습니다. 하지만 모든 요소를 온체인에 직접 올릴 필요는 없습니다. 예를 들어 NFT로 게임 내 아이템을 나타내거나, 토큰으로 인앱 구매를 처리하거나, 플레이어 지갑으로 인증하는 소규모 통합은 빠르게 구현할 수 있습니다. 지금 바로 Solana 통합을 시작할 수 있는 도구가 다양하게 준비되어 있습니다.

Solana 게임 개발 도구

이 글에서는 Solana 통합 게임을 개발하는 데 널리 쓰이는 여러 프레임워크와 플랫폼을 살펴봅니다. 간결하게 설명하기 위해 다루지 않은 도구도 있지만, 아래 추가 자료 섹션에 링크를 제공했습니다. Godot Solana SDK와 Phaser 3 TypeScript Starter Template 등이 포함됩니다. 이 글에서는 다음 도구를 설치하고 구성하고 사용하는 방법을 알아봅니다.

Anchor

Anchor 같은 프레임워크를 사용하면 온체인 게임을 훨씬 쉽게 개발할 수 있습니다. Anchor는 안전한 프로그램을 빠르게 구축하는 강력한 프레임워크입니다. 반복 코드를 줄이고, 다양한 보안 검사를 처리하고, 클라이언트 라이브러리 생성을 자동화하며, 종합적인 테스트 환경을 제공해 개발 과정을 간소화합니다. 완전한 온체인 게임을 개발하는 가장 쉬운 방법은 게임 로직과 상태를 Anchor 프로그램에 저장하는 것입니다. Anchor는 Solana의 저수준 프로그래밍 모델이 지닌 복잡성을 추상화합니다. 이제 개발자는 SVM과 씨름하는 대신 게임 개발에 더 집중할 수 있습니다.

설치

Anchor를 사용하려면 Rust가 필요합니다. 여기에서 설치하거나 다음 명령을 사용하세요.

코드
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Anchor는 Rust를 처음 접하는 사용자에게 Rust 책의 첫 9개 장을 읽을 것을 권장합니다. 대부분 Anchor 프로그램을 작성하는 데 고급 Rust 지식은 필요하지 않으므로 여기서 기본 사항을 익힐 수 있습니다.

Anchor에는 Solana Tool Suite도 필요합니다.

코드
# macOS and Linux
sh -c "$(curl -sSfL https://release.solana.com/v1.17.7/install)"

# Windows
cmd /c "curl https://release.solana.com/v1.17.7/solana-install-init-x86_64-pc-windows-msvc.exe --output C:\solana-install-tmp\solana-install-init.exe --create-dirs"

solana --version 명령을 실행해 원하는 버전의 solana가 설치되었는지 확인할 수 있습니다.

Yarn도 필요합니다. npm 패키지 관리자를 사용해 설치할 수 있습니다. npm install --global yarn.

Anchor 버전 관리자(avm)를 사용해 Anchor를 설치하는 방식을 권장합니다. cargo로 설치할 수 있습니다. cargo install --git <https://github.com/coral-xyz/anchor> avm --locked --force. 그런 다음 최신 버전을 설치하고 사용합니다.

코드
avm install latest
avm use latest

# Verify the installation
avm --version

Anchor 문서에서도 자세한 설치 가이드를 제공합니다.

사용법 및 예제

SolanaCiv는 Anchor를 사용해 완전한 온체인 방식으로 개발되었습니다. 자원 관리, 유닛 모집, 신기술 연구, 야만인과의 전투, 거래가 모두 온체인에서 이루어집니다. 오픈 소스이기도 합니다. 따라서 게임 로직과 상태를 분석하고 모든 요소가 온체인에 저장되는 방식을 확인하는 참고 자료로 활용할 수 있습니다.

Clockwork는 Solana를 위한 오픈 소스 자동화 엔진입니다. 트랜잭션 예약과 자동화된 이벤트 기반 프로그램 구축을 지원하므로 게임 개발에 특히 유용합니다. cargo install -f --locked clockwork-cli 명령으로 설치할 수 있으며 Anchor와도 원활하게 통합됩니다. Clockwork 사용 예제 목록은 여기에서 확인할 수 있습니다.

Solana Playground는 프로그램을 테스트하고 배포하는 브라우저 기반 코드 개발 환경입니다. 통합 개발 환경(IDE)을 제공하므로 Anchor를 처음 접하고 Solana 게임 개발을 배우려는 개발자에게 적합합니다. 온체인 게임과 관련된 여러 Anchor 튜토리얼도 제공합니다. 예를 들어 Tiny Adventure는 초보자를 위한 온체인 게임 튜토리얼입니다. Anchor를 사용해 게임 캐릭터를 좌우로 움직이는 방법과 Program Derived Address(PDA)를 사용해 게임 데이터를 저장하는 방법을 알려줍니다. Solana 지갑 어댑터를 사용해 Next.js에서 프런트엔드를 설정하는 방법도 보여줍니다. 완성된 코드는 여기에서 확인할 수 있습니다.

TypeScript 클라이언트가 포함된 Anchor 프로그램을 빠르게 만들려면 npx create-solana-game 명령 뒤에 게임 이름을 입력하세요. 이 명령은 새 프로젝트 구조를 만들고 Anchor 및 TypeScript 개발 과정을 간소화합니다. 이 도구는 Jonas Hahn과 Beeman이 개발했으며 solana-developers GitHub 저장소에서 확인할 수 있습니다.

Turbo

Turbo는 인디 개발자의 역량을 강화하도록 설계된 차세대 2D 게임 엔진이자 마켓플레이스입니다. 다음과 같은 혁신적인 기능을 제공합니다.

  • 코드, 셰이더 또는 스프라이트가 수정될 때마다 게임이 핫 리로드됩니다.
  • 게임이 헤드리스로 실행되므로 원격 서버에서 게임 상태를 검증할 수 있습니다.
  • 엔진이 WebAssembly와 WebGPU에서 실행되므로 모든 플랫폼에서 사용할 수 있습니다.
  • 엔진의 내장 API는 초보자도 쉽게 사용할 수 있습니다.

Turbo는 Jozanza가 Rust로 개발하고 있습니다. Rust로 구축되므로 개발자는 SDK나 플러그인 없이도 프로그램에서 Anchor 구조체를 쉽게 재사용할 수 있습니다. 이 프로젝트는 아직 초기 개발 단계입니다. 하지만 웹사이트에는 브라우저에서 실행할 수 있는 여러 예제가 있으며, Turbo의 강력한 성능과 직관적인 개발자 경험을 보여줍니다. “Hello, world!” 안내는 여기에서 확인할 수 있습니다.

설치

Turbo를 사용하려면 먼저 관련 Rust 종속성을 모두 설치해야 합니다.

코드
# Download and run the rust installer
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Add wasm targets
rustup target add wasm32-unknown-unknown wasm32-wasi

# Install cargo-watch
cargo install cargo-watch

그런 다음 Turbo 명령줄 인터페이스(CLI) 설치 프로그램을 다운로드하고 실행합니다.

코드
sh -c "$(curl -sSfL https://turbo.computer/install.sh)"

설치가 완료되면 turbo-cli -h 명령을 사용해 Turbo CLI가 올바르게 설치되었는지 확인할 수 있습니다. 이 명령을 실행하면 Turbo 사용법이 표시됩니다.

코드
Run Turbo games natively on desktop

Usage: turbo-cli

Commands:
  init  Initializes a new Turbo project in Rust
  run   Runs a Rust Turbo project
  help  Print this message or the help of the given subcommand(s)

Options:
  -v, --version  Print version
  -h, --help     Print help
  -V, --version  Print version

개발 과정

Turbo는 개발 과정을 간소화하는 여러 매크로를 제공합니다. 참고로 Rust 매크로는 코드 생성, 즉 다른 코드를 작성하는 코드를 위한 강력한 메타프로그래밍 도구입니다. 반복 코드를 줄이고 표현력이 뛰어난 코드 패턴을 구현하는 데 유용합니다.

println 매크로는 표준 println 매크로를 사용자 정의한 구현입니다. 문자열 형식을 지정한 다음 게임 엔진의 로깅 시스템으로 전달합니다.

코드
macro_rules! println {
    ($fmt:expr $(, $($arg:tt)*)?) => {
        $crate::sys::log(&format!($fmt, $($($arg)*)?))
    };
}

cfg 매크로는 구성에 사용됩니다. 구성 문자열을 가리키는 포인터와 문자열 길이를 결합한 64비트 정수를 반환하는 config 함수를 노출합니다. Rust에서 WebAssembly 같은 다른 환경으로 구성 데이터를 전달할 때 유용합니다.

코드
macro_rules! cfg {
    ($toml:expr) => {
        #[no_mangle]
        pub unsafe extern "C" fn config() -> u64 {
            let ptr = $toml.as_ptr() as u64;
            let len = $toml.len() as u64;
            (len << 32 | ptr)
        }
    };
}

init 매크로는 게임 상태 관리에 유용합니다. 구조체를 정의하고 상태를 불러오고 저장하는 메서드를 제공합니다. 상태 지속성을 위해 Borsh를 사용하며, 구조체에 load 및 save 메서드를 구현합니다.

코드
macro_rules! init {
    (struct $StructName:ident { $($fields:tt)* } = $default:expr) => {
        ...
    };
}

go 매크로는 게임의 기본 로직을 정의하는 데 사용됩니다. WebAssembly 같은 외부 환경에서 호출할 수 있는 함수로 코드 블록을 감쌉니다. 또한 게임 로직의 진입점과 상태 스냅샷을 사용해 게임을 실행하는 run_snapshot 함수를 정의합니다.

코드
macro_rules! go {
    ($($body:tt)*) => {
        use $crate::prelude::*;

        #[no_mangle]
        #[allow(overflowing_literals, non_upper_case_globals)]
        pub unsafe extern "C" fn run() {
            use std::f32::consts::PI;
            $($body)*
        }
        pub fn run_snapshot(snapshot_data: &[u8]) -> Vec {
            $crate::run_snapshot(snapshot_data, || unsafe { run() })
        }
    };
}

Turbo는 Rust의 구조체 정의 기능을 개선하기 위해 struckstruck crate의 strike 매크로도 사용합니다. 일반적으로 중첩 구조체는 별도로 정의해야 합니다. strike 매크로를 사용하면 중첩 구조체가 포함된 구조체를 인라인으로 정의할 수 있습니다. 이 기능은 코드를 간소화해 복잡한 데이터 구조를 더 읽기 쉽고 간결하게 만듭니다. 전체 구조에 Borsch 직렬화도 자동으로 적용합니다. 또한 최상위 구조체의 derive 매크로를 모든 중첩 구조체에 전파합니다.

따라서 Turbo 프로젝트의 전체 개발 워크플로는 다음과 같습니다.

코드
// Defne the game configuration using the turbo::cfg! macro
turbo::cfg! {r#"
    name = "Grand Theft Auto VI"
    version = "1.0.0"
    author = "Ichigo"
    description = "Vice City but pixelated"
    [settings]
    resolution = [256, 144]
    tile_size = [32, 32]
"#}

// Define the game state initialization using the turbo::init! macro
turbo::init! {
	...
}

// Implement the game loop using the turbo::go! macro
turbo::go! {
	// Load the game state
	let mut state = GameState::load();
	...
}

Solana 지원

Turbo는 Solana를 완전하게 지원한다는 점에서 다른 Rust 기반 게임 개발 엔진과 다릅니다. 예를 들어 단 두 줄의 코드로 RPC에서 계정 데이터를 가져와 디코딩할 수 있습니다. WebSockets를 통해 계정 업데이트를 자동 구독하므로 데이터가 항상 최신 상태로 유지됩니다.

코드
// Get the Solana account data
let response = solana::get_account("pubkey");

// Decode the account data
let decoded = response.decode_anchor::();

// And now we can work with on-chain data!
if let Ok(data) = decoded {
	...
}

Magicblock

Magicblock은 온체인 게임 구축을 위한 다목적 오픈 소스 프레임워크입니다. 누구나 Solana 또는 SVM에서 게임을 만들고 플레이할 수 있습니다. 개발자가 완전한 온체인 게임을 개발하거나 기존 게임에 Solana를 통합할 수 있도록 풍부한 도구 세트를 제공합니다. 다음 기능이 포함됩니다.

Magicblock은 이러한 기능으로 복잡성을 추상화해 개발자가 최상의 사용자 경험을 만드는 데 집중할 수 있도록 지원합니다. MIT 라이선스를 적용한 이 프레임워크는 Magicblock Labs, 즉 Andrea와 Peak이 관리합니다.

Solana Unity SDK

Solana Unity SDK는 게임 개발자가 Solana 기반 NFT, 토큰, 온체인 프로그램을 Unity 게임에 통합할 수 있도록 도구를 제공하는 오픈 소스 패키지입니다. SDK는 Solana를 .NET 생태계와 통합하는 .NET Standard 2.0 호환 프레임워크인 Solana Unity Core를 활용합니다. 전체 JSON RPC API 지원, 명령 디컴파일, Solana Mobile Stack 지원, 네이티브 DEX 작업 등 다양한 기능을 제공합니다.

Solana Unity SDK와 Unity로 만든 게임 예제 목록은 여기에서 확인할 수 있습니다.

설치, 구성 및 사용법

Unity로 개발하려면 여기에서 Unity Hub를 다운로드하세요. Unity Hub는 여러 버전의 Unity Editor 설치를 관리하므로 다양한 버전에서 프로젝트를 진행하고 새로 만들 수 있습니다. 계속하기 전에 시스템이 다음 요구 사항을 충족하는지 확인하세요.

  • OS: Windows 7 SP1+, 8, 10의 64비트 버전만 지원, Mac OS X 10.13+, Ubuntu 16.04, 18.04, CentOS 7
  • GPU: DX10(셰이더 모델 4.0)을 지원하는 그래픽 카드

Unity를 설치했으면 새 프로젝트를 만들고 엽니다.

새 프로젝트를 연 상태에서 Package Manager 창을 여세요. Unity 상단 메뉴에서 Window > Package Manager를 선택하면 됩니다.

창이 열리면 상태 표시줄에서 추가(+) 버튼을 클릭하세요. 패키지 추가 옵션이 나타납니다. 메뉴에서 “git URL에서 패키지 추가”를 선택하세요.

텍스트 상자에 https://github.com/magicblock-labs/Solana.Unity-SDK.git Git URL을 입력하고 “추가”를 클릭하세요. 특정 패키지 버전을 설치하려면 https://github.com/magicblock-labs/Solana.Unity-SDK.git#X.Y.Z를 입력하고 X.Y.Z를 원하는 버전으로 바꾸세요. 사용 가능한 모든 릴리스는 여기에서 확인할 수 있습니다.

Solana Unity SDK를 설치한 다음 Package Manager 인스펙터를 사용해 Samples를 가져오세요. Unity 프로젝트에 통합할 때 참조하거나 수정할 수 있는 샘플 장면이 포함되어 있습니다. 이 장면은 Scenes 폴더에 있으며, 지갑 인증과 Orca를 통한 토큰 스왑 예제로 구성됩니다. Scripts 폴더에는 Orca 스왑용 스크립트를 비롯한 다양한 스크립트 예제가 들어 있습니다. Web3.cs 스크립트는 프로젝트의 모든 오브젝트에 연결할 수 있습니다. 이 스크립트는 Solana Unity SDK의 기본 진입점입니다. Solana 연결을 관리하고 지갑 로그인과 트랜잭션 서명 등을 지원하는 싱글턴입니다. Prefabs 폴더에는 오브젝트 구성을 저장하는 템플릿이 있습니다. 프로젝트 전체에서 재사용할 수 있는 동일한 자산의 인스턴스를 만드는 데 사용할 수 있습니다.

Magicblock YouTube 채널에서는 Solana 지갑을 Unity에 연결하는 방법, 지갑의 공개 키와 잔액을 가져오는 방법, 게임 내 지갑으로 테스트하는 방법, 온체인 체스 엔진을 구축하는 방법에 관한 튜토리얼을 제공합니다.

Solana Unity SDK GitHub 저장소에도 명령 디코딩부터 트랜잭션 구축까지 다양한 예제 스크립트가 있습니다.

Jupiter 구현 예제

Solana Unity SDK는 Orca뿐만 아니라 Jupiter도 기본 지원합니다. SDK는 스왑 견적을 받고 스왑 트랜잭션을 구축하고 전송하는 데 유용한 메서드를 제공합니다.

스왑을 수행하려면 먼저 기본 계정을 제공해 IDexAggregator의 인스턴스를 만들어야 합니다. 이 인스턴스를 사용해 Jupiter와 상호작용합니다.

코드
IDexAggregator dex = new JupiterDexAg(Web3.Account);

그런 다음 스왑할 토큰을 정의합니다. 이 예제에서는 SOL을 BONK로 교환합니다.

코드
TokenData tokenA = await dex.GetTokenBySymbol("SOL");
TokenData tokenB = await dex.GetTokenBySymbol("BONK");

다음으로 스왑 견적을 가져옵니다. 1 SOL을 스왑하는 견적은 다음과 같습니다.

코드
SwapQuoteAg swapQuote = await dex.GetSwapQuote(
    tokenA.MintAddress,
    tokenB.MintAddress,
    DecimalUtil.ToUlong(1, tokenA.Decimals)
);

var quote = DecimalUtil.FromBigInteger(swapQuote.OutputAmount, tokenB.Decimals);

// Logs the expected amount of BONK
Debug.Log(quote);

투명성을 높이기 위해 스왑의 경로도 표시할 수 있습니다.

코드
Debug.Log(string.Join(" -> ", swapQuote.RoutePlan.Select(p => p.SwapInfo.Label)));

이제 스왑 트랜잭션을 생성하고 지갑으로 서명한 뒤 전송할 수 있습니다.

코드
Transaction tx = await dex.Swap(swapQuote);
await Web3.Wallet.SignAndSendTransaction(tx);

프로그램을 Unity로 포팅하기

개발자는 Solana Unity Anchor 패키지를 사용해 Anchor 프로그램을 Unity에 통합할 수 있습니다. 이 패키지에는 IDL-C# 변환기가 포함되어 있습니다. 변환기는 Anchor IDL, 즉 Solana 프로그램의 JSON 표현을 Unity 프로젝트용 C# 코드로 변환하는 과정을 간소화합니다. 통합 과정은 크게 두 단계로 이루어집니다.

  • 설치: dotnet tool install -g Solana.Unity.Anchor.Tool 명령을 사용해 Solana Unity Anchor Tool을 설치합니다. -g 플래그는 패키지를 전역으로 설치하므로 새 프로젝트를 만들 때마다 이 도구를 설치할 필요가 없습니다.
  • 코드 생성: dotnet anchorgen -i idl/file.json -o src/ProgramCode.cs 명령을 사용해 프로그램의 C# 표현을 생성합니다. 이 명령은 지정된 IDL을 Unity에서 바로 사용할 수 있는 C# 파일로 변환합니다.

개발자는 이 단계에 따라 Solana 프로그램을 Unity 환경으로 효율적으로 포팅할 수 있습니다. Jonas Hahn이 제작한 단계별 동영상 안내는 여기에서 확인할 수 있습니다.

SOAR

Solana On-Chain Achievement and Ranking (SOAR)은 Solana에서 리더보드, 업적, 플레이어 프로필, 자동 보상 분배를 원활하게 관리하도록 설계된 프로그램입니다. 다음을 비롯한 여러 기능을 지원합니다.

  • 리더보드 생성
  • 업적 관리
  • TypeScript 클라이언트 지원
  • Cross-Program Invocation(CPI) 호출을 통한 SOAR 프로그램 연동

현재 Solana Unity SDK 지원을 개발 중이며 곧 제공될 예정입니다.

몇 줄의 코드만으로 SOAR를 프로젝트에 쉽게 통합할 수 있습니다. 예시는 다음과 같습니다.

코드
import { SoarProgram, GameType, Genre } from "@magicblock-labs/soar-sdk";

const provider = anchor.AnchorProvider.env();
anchor.setProvider(provider);

const client = SoarProgram.get(provider);

let game = Keypair.generate();
let title = "Game1";
let description = "Description";
let genre = Genre.Action;
let gameType = GameType.Web;
let nftMeta = Keypair.generate().publicKey;
let _auths = auths.map((keypair) => keypair.publicKey);

// Retrieve the bundled transaction.
let { newGame, transaction } = await client.initializeNewGame(game.publicKey, title, description, genre, gameType, nftMeta, _auths);

// Send and confirm the transaction with the game keypair as signer.
await client.sendAndConfirmTransaction(transaction, [game]);

위 코드는 Magicblocks의 SOAR 문서에서 직접 가져왔습니다. 이 스니펫은 @magicblock-labs/soar-sdk에서 SoarProgram, GameType, Genre 등 필요한 모듈을 가져오는 것으로 시작합니다.

SoarProgram 클래스는 클라이언트가 온체인 SOAR 프로그램의 모든 명령에 접근할 수 있게 합니다. PDA 파생과 여러 계정 가져오기 기능도 포함합니다.

그런 다음 Anchor provider(anchor.AnchorProvider.env())를 초기화하고, 이후 작업을 위한 기본 provider로 설정합니다(anchor.setProvider(provider)). 이어서 앞서 설정한 provider로 SoarProgram 클라이언트를 생성합니다.

이 스니펫은 새 게임 초기화를 시작합니다. 새 게임 키페어를 생성하고 게임 제목, 설명, 장르(예: Genre.Action), 게임 유형(예: GameType.Web) 등 필수 정보를 정의합니다. 게임용 NFT 메타데이터 키페어도 생성합니다. 그런 다음 게임 내 접근 제어를 정의할 권한 목록(_auths)을 준비합니다.

SOAR 클라이언트에서 initializeNewGame 메서드를 호출하며 게임의 공개 키, 제목, 설명, 장르, 게임 유형, NFT 메타데이터, 권한을 전달합니다. 이 메서드는 newGame 객체를 반환하고 전송할 새 게임 트랜잭션을 준비합니다. SOAR 클라이언트에서 제공하는 sendAndConfirmTransaction 메서드로 트랜잭션을 전송하고 확인합니다. 게임 키페어는 트랜잭션 서명자로 사용되며, 이를 통해 게임 제작자가 트랜잭션을 승인했음을 보장합니다.

SOAR로 클라이언트를 초기화하고 새 온체인 게임을 설정하는 과정은 간단합니다. 이제 GameClient를 사용해 게임을 등록하고 리더보드를 생성하며 게임 상태에 접근할 수 있습니다. 가능성은 무궁무진합니다.

SOAR의 프로그램 주소는 SoarNNzwQHMwcfdkdLc6kvbkoMSxcHy89gTHrjhJYkk이며, TypeScript 문서는 여기에서 확인할 수 있습니다.

Solana Unreal SDK

Solana Unreal SDK는 개발자가 Unreal Engine 5를 사용해 Solana에서 블록체인 게임을 구축할 수 있도록 지원하는 플러그인 겸 툴킷입니다. 이 툴킷에는 게임 서버 템플릿을 비롯해 Solana가 통합된 대규모 다중 사용자 온라인(MMO) 게임용 시작 템플릿이 포함되어 있습니다. 다음 기능도 제공합니다.

  • C++ 및 Blueprint Visual Scripting에서 Solnet의 모든 기능 지원
  • 데이터 보호 및 암호화를 지원하는 게임 내 지갑 시스템
  • Metaplex NFT 민팅
  • 결제 처리

이 플러그인은 Solnet과 .NET 런타임의 성능을 활용하므로 개발자가 처음부터 전체 C++ 라이브러리를 만들지 않고도 Solana와 직접 통신할 수 있습니다. LinkStream은 TCP 서버와 클라이언트 프로토콜을 통해 게임의 트랜잭션 메시지를 Tranquility 같은 지갑으로 전송할 수 있습니다. 이 SDK는 처음에 Star Atlas 팀이 구축했으며, 최근 Bifrost가 코드를 포크하고 업데이트했습니다. 다음 설치 섹션에서는 Star Atlas 팀의 빌드를 기준으로 설명합니다. Bifrost에서도 과정은 동일합니다.

설치

Unreal Engine을 사용하려면 먼저 Epic Games Launcher를 설치해야 합니다. 그런 다음 Epic Games 계정을 생성하고 로그인합니다. 로그인한 후 Unreal Engine 탭으로 이동해 Install 버튼을 클릭하여 최신 버전을 다운로드합니다. 자세한 단계별 안내는 여기에서 확인할 수 있습니다. Unreal Engine 5의 권장 시스템 요구 사항은 다음과 같습니다.

  • Windows 10 64비트, 쿼드 코어 Intel 또는 AMD, 2.5GHz 이상, RAM 8GB
  • macOS Big Sur, 쿼드 코어 Intel, 2.5GHz 이상, RAM 8GB
  • Linux Ubuntu 18.04, 쿼드 코어 Intel 또는 AMD, 2.5GHz 이상, RAM 32GB

Epic Games Launcher를 열고 설치된 Unreal 버전을 실행합니다.

새 프로젝트를 만들고 프로젝트 템플릿으로 C++를 선택합니다.

이제 편집기를 닫고 프로젝트를 만들 때 지정한 Project Location 폴더를 엽니다. 그런 다음 루트 디렉터리에 새 Plugins 폴더를 만듭니다.

플러그인을 Plugins 디렉터리에 복사합니다. 루트 디렉터리의 .uproject 파일을 마우스 오른쪽 버튼으로 클릭하고 Generate Visual Studio project files를 선택합니다. .sln 파일을 두 번 클릭하고 C++ IDE로 프로젝트를 엽니다. 그런 다음 Source/<ProjectName>/<ProjectName>.build.cs 아래의 파일을 엽니다. PublicDependencyModuleNames에 플러그인 이름을 추가합니다. 여기서는 Foundation를 입력합니다.

.uproject 파일에 플러그인 이름을 추가합니다.

IDE를 닫고 프로젝트 파일을 다시 생성합니다. 그런 다음 프로젝트 솔루션, 즉 .sln 파일을 열면 설치가 완료됩니다.

사용법

플러그인과 관련된 모든 콘텐츠는 콘텐츠 브라우저의 Plugins > Solana SDK에서 찾을 수 있습니다. LinkStream 블루프린트는 Plugins > Solana SDK Content > Blueprints에 있습니다. 이 블루프린트를 사용하면 개발자가 Solnet과 통신할 수 있습니다. Maps 폴더의 샌드박스 맵은 Solana SDK를 올바르게 설정하는 방법을 보여주는 참고 자료로 활용할 수 있습니다. Solana Unreal SDK GitHub에서 일반적인 사용법, LinkStream 래퍼를 사용자 지정하는 방법, 서버 인증을 위해 REST API와 연동하는 방법을 자세히 확인할 수 있습니다. Unreal SDK로 Solana와 연동하는 방법에 관한 더 자세한 설명은 여기에서 확인할 수 있습니다.

Unreal은 3D 최적화와 후처리 효과에 중점을 두어 Unity 같은 다른 편집기보다 사실적인 게임을 제작할 수 있습니다. 이러한 극사실주의의 대표적인 사례가 Star Atlas입니다. Star Atlas는 깊은 우주를 탐험하는 몰입형 전략 게임입니다. 다양한 기회와 영토 정복, 정치적 음모로 가득합니다. Yaku Corp 같은 다른 게임도 Unreal Engine의 사실적인 그래픽을 활용해 몰입도 높은 MMORPG를 제작합니다.

Honeycomb

Honeycomb은 Web3 게임 개발 과정을 간소화하기 위해 Tumi Labs가 개발한 프로토콜입니다. Honeycomb은 게임 수명 주기의 핵심 기능을 처리하는 온체인 프로그램과 상태 압축 도구 모음입니다. 모든 프로그램은 상호 운용성과 모듈성을 갖추도록 설계되었습니다. 개발자의 개별 요구 사항에 맞게 사용자 지정할 수도 있습니다. 인프라 개발 툴킷은 다음 핵심 기능에 중점을 둡니다.

  • 비활성 플레이어 보상(스테이킹)
  • 퀘스트(임무)
  • 전리품 상자 또는 RNG 상품(추첨)
  • 길드 / 파티
  • 게임 토큰(수탁형 및 비수탁형)
  • 변경 가능한 디지털 자산
  • 디지털 자산 생성 및 관리
  • 플레이어 프로필
  • 수수료 구조

도구는 다음 범주로 나눌 수 있습니다.

  • Hive Control: Honeycomb 전반에서 프로그램 권한의 모든 허가와 위임을 관리하는 마스터 프로그램
  • Asset Hub: 게임 내 자산을 생성하고 관리하는 도구 모음
  • Nectar Utility: 비활성 토큰 보상(스테이킹), 퀘스트, 전리품 상자 등 NFT가 고유한 게임 기능을 제공하도록 설계된 유틸리티 도구 모음
  • Buzz Kit: 게임 내 길드를 지원하는 도구 모음. Tumi Labs는 이 도구 모음에 매치메이킹 및 게임 상태 관리 프로그램도 개발할 계획입니다

설치

개발자는 JavaScript SDK와 @solana/web3.js를 사용해 Honeycomb과 연동할 수 있습니다.

코드
# Using npm
npm install @solana/web3.js @honeycomb-protocol/hive-control

# Using yarn
yarn add @solana/web3.js @honeycomb-protocol/hive-control

사용 예시

설치가 완료되면 개발자는 Solana Connection 객체로 Honeycomb 객체를 초기화할 수 있습니다.

코드
import * as web3 from "@solana/web3.js";
import { Honeycomb } from "@honeycomb-protocol/hive-control";

const honeycomb = new Honeycomb(
  new web3.Connection("https://api.mainnet-beta.solana.com")
);

여기서부터 가능성은 무궁무진합니다. 예를 들어 개발자는 IdentityClient와 연동해 사용자 ID와 프로필을 관리할 수 있습니다. guestIdentity는 키페어나 지갑이 Honeycomb 인스턴스에 등록될 때까지 자리표시자로 사용하는 기본 ID입니다. 다음 명령으로 키페어를 ID에 연결할 수 있습니다. honeycomb.use(keypairIdentity(<keypair>);. 마찬가지로 Honeycomb 인스턴스에서 제공하는 walletIdentity 함수를 사용하면 지갑 객체(Solana Wallet Adapter)를 ID로 등록할 수 있습니다. ID는 메시지나 트랜잭션 서명 같은 인증 용도로 사용할 수 있습니다.

또 다른 흥미로운 예시는 HttpClient입니다. 이 모듈은 Axios 또는 Fetch를 사용한 HTTP 요청을 지원하고 HTTP 관련 기능을 제공합니다. 요청 헤더를 사용자 지정할 수 있으며 GET, POST, PUT, DELETE 요청을 만드는 메서드도 제공합니다.

코드
// Make a GET request
honeycomb
  .http()
  .get("/users", { authToken: "myAuthToken" })
  .then((response) => {
    console.log("GET Response:", response);
  })
  .catch((error) => {
    console.error("GET Error:", error);
  });

// Make a POST request
const userData = { name: "John Doe", email: "john@example.com" };
honeycomb
  .http()
  .post("/users", { data: userData })
  .then((response) => {
    console.log("POST Response:", response);
  })
  .catch((error) => {
    console.error("POST Error:", error);
  });

개발자가 Digital Asset Standard (DAS) API 같은 서드파티 API에 접근해 게임 외부의 다른 온체인 디지털 자산을 조회할 수 있다는 점에서 특히 유용합니다.

이 코드 스니펫은 Honeycomb Protocol 문서를 바탕으로 작성되었습니다. SDK 문서는 여기에서 확인할 수 있습니다.

GameShift

GameShift는 게임 개발자가 단일 API를 통해 Web3 요소를 쉽게 통합할 수 있도록 Solana Labs가 출시한 플랫폼입니다. Solana 게임의 이점을 활용하면서도 사용자 친화적인 Web2 경험을 손쉽게 만들 수 있도록 지원합니다. GameShift는 모든 가스비, 블록체인 연동, 지갑을 처리해 Web3 생태계에서 매끄러운 사용자 경험을 제공합니다. GameShift API는 네 가지 영역으로 구성됩니다.

  • 자산 생성: 구조화된 메타데이터를 사용한 게임 자산 민팅
  • 자산 거래: 브랜드 마켓플레이스에서 USD로 자산 매매. 곧 출시될 예정입니다
  • 결제: 170개 이상의 국가에서 지원되는 신용카드 결제 및 결제 처리 통합과 100% 지불 거절 보호
  • 지갑 자산 자체 수탁: 플레이어가 비수탁형 지갑에서 자산을 보유하고 거래할 수 있도록 지원합니다. 비밀번호나 시드 문구가 필요 없습니다!

개발자는 GameShift 콘솔에서 계정을 만들고 조직을 설정한 뒤, 조직에 개발자와 게임을 추가하고 개발자 API 키를 관리하여 GameShift를 시작할 수 있습니다. 전체 과정은 여기에 설명되어 있습니다.

법정화폐 트랜잭션에는 판매자 계정이 필요합니다. 계정은 두 단계로 만들 수 있습니다.

  • 기업 고객 확인(KYB): 자금 이체법을 준수하기 위해 개발자가 기업 정보를 제공해야 합니다. 현재 GameShift는 미국 소재 은행 계좌로의 법정화폐 정산만 지원합니다
  • 법정화폐 정산 계정 설정: 프로덕션에서 법정화폐 결제를 활성화할 준비가 되면 개발자가 GameShift에 연락해 판매자 온보딩 양식 링크를 받아야 합니다. 이 양식으로 KYB 정보를 설정합니다. 검증에는 몇 분이 걸릴 수 있으며, 경우에 따라 수동 검토가 필요할 수 있습니다

모든 GameShift 활동은 조직 내에서 구성됩니다.

사용자 온보딩

모든 설정이 끝나면 개발자는 REST API와 연동할 수 있습니다. 사용자를 등록하면 마켓플레이스 기능, 온체인 자산, 결제 흐름에 대한 접근 권한을 부여할 수 있습니다. API 키, 사용자 이메일 주소, referenceId(UUID 같은 고유 값)를 요청 본문에 담아 https://api.gameshift.dev/users로 POST HTTP 요청을 보내면 됩니다.

코드
curl --request POST \
     --url https://api.gameshift.dev/users \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-api-key: ' \
     --data '
{
  "referenceId": "exampleReferenceId",
  "email": "user@example.com"
}

사용자를 등록한 후에는 언제든 사용자 정보와 자산을 가져올 수 있습니다. 사용자 정보와 자산을 가져오려면 https://api.gameshift.dev/users/{the-user-id-you-used-to-register}/assets로 GET HTTP 요청을 보냅니다.

코드
curl --request GET \
     --url https://api.gameshift.dev/users/exampleReferenceId/assets \
     --header 'accept: application/json' \
     --header 'x-api-key:

성공하면 페이지로 나뉜 사용자 자산 목록이 반환됩니다.

코드
{
  "data": [
    {
      "id": "dcde5bc8-b30b-46b6-b4da-0763953b2484",
      "collectionId": "36c97125-04a5-4dc3-b92a-029d74a42287",
      "attributes": [],
      "name": "Example Asset",
      "description": "Example Description",
      "imageUrl": "https://solana.com/src/img/branding/solanaLogoMark.png",
      "status": "Committed",
      "owner": {
        "address": "",
        "referenceId": "exampleReferenceId"
      }
    }
  ],
  "meta": {
    "page": 1,
    "perPage": 50,
    "totalPages": 1
  }
}

온보딩 과정의 모든 코드 스니펫은 여기에서 확인할 수 있습니다.

자산 생성

예를 들어 개발자는 https://api.gameshift.dev/assets로 POST HTTP 요청을 보내 프로그래밍 방식으로 온체인 게임 자산을 생성할 수 있습니다.

코드
curl --request POST \
     --url https://api.gameshift.dev/assets \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-api-key: ' \
     --data '
{
  "details": {
    "description": "Example description",
    "imageUrl": "https://solana.com/src/img/branding/solanaLogoMark.png",
    "name": "Example Asset",
    "attributes": [
      {
        "displayType": "Formatted Attribute Name",
        "traitType": "attribute-name",
        "value": "attribute-value"
      }
    ]
  },
  "destinationUserReferenceId": "exampleUserId"
}
'

자산에는 다음 정보가 필요합니다.

  • description - 자산 정보를 제공하는 64자 문자열
  • name - 자산을 식별하는 32자 문자열
  • imageUrl - 자산을 나타내는 이미지의 직접 링크
  • displayType - 선택 사항인 형식화된 제목
  • traitType - 선택 사항인 특성 이름
  • value - 특성 값을 나타내는 선택 사항 필드

POST HTTP 요청에는 destinationUserReferenceId 필드에 제공된 사용자의 referenceId도 필요합니다. 게임 자산을 다루는 방법에 대한 자세한 설명은 여기에서 확인할 수 있습니다.

결론

특히 Solana를 통한 블록체인 기술과 게임의 통합은 디지털 세계를 인식하고 상호작용하는 방식을 크게 발전시킵니다. Anchor, Turbo, Magicblock, Solana Unity 및 Unreal SDK 같은 도구를 통해 개발자는 새로운 게임 방식을 만들 수 있습니다. 이제 게이머는 그 어느 때보다 쉽게 가상 경제를 개발하고, 완전히 투명하고 접근 가능한 방식으로 전례 없는 소셜 매트릭스에서 상호작용할 수 있습니다. Honeycomb과 GameShift 같은 플랫폼은 개발 과정을 간소화하고 플레이어 참여를 높여 Web3 게임의 잠재력을 더욱 잘 보여줍니다.

Solana는 이 게임 혁신의 최전선에 있습니다. 전용 해커톤이 열리고 새로운 게임이 등장하면서 Solana의 게임 커뮤니티는 꾸준히 성장하고 있습니다. Solana Labs와 Solana Foundation은 이 신생 커뮤니티의 성장을 돕기 위해 튜토리얼, 도구, 플랫폼을 만들며 여러 이니셔티브를 이끌고 있습니다. 현존하는 가장 빠른 블록체인 위에 구축한다면 게임의 가능성은 무궁무진합니다.

익명의 독자님, 여기까지 읽어주셔서 감사합니다! 아래에 이메일 주소를 입력하고 Solana의 새로운 소식을 빠짐없이 받아보세요. 더 깊이 알아볼 준비가 되셨나요? 지금 Discord에 참여해 최고 성능의 블록체인에서 게임의 미래를 구축해 보세요.

추가 자료 / 더 읽어보기

Helius 구독하기

최신 Solana 개발 소식을 확인하고 새 게시물 알림을 받아보세요

확대 이미지