Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
分散オブジェクトで遊ぼう!〜dRubyで作るマルチプレイヤー迷路ゲーム〜 関西Ruby会議08
Search
yumu
June 27, 2025
1.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
分散オブジェクトで遊ぼう!〜dRubyで作るマルチプレイヤー迷路ゲーム〜 関西Ruby会議08
yumu
June 27, 2025
More Decks by yumu
See All by yumu
minneのショート動画基盤の設計と運用改善 カバーとGMOペパボが語る、クリエイターの創作・表現活動を支える技術
yumu
0
620
Railsアプリから何を切り出す?機能分離の判断基準 Kaigi on Rails 2025
yumu
2
6.9k
影響を広げる力研修 GMOペパボ2025新卒エンジニア研修
yumu
0
1.9k
Ruby×AWSで作る動画変換システム 東京Ruby会議12
yumu
2
3.9k
Google Cloudで作るニアリアルタイムアクセス解析基盤 GDG DevFest Tokyo 2024 LT
yumu
0
3.8k
アクセス解析基盤のデータストア選定奮闘記 CloudNative Days Winter 2024 船上LT会
yumu
0
230
minneのShoryuken活用 Kaigi on Rails 2024 スポンサーLT
yumu
3
2.6k
Rubyでも動画変換簡単にできるよ TokyuRuby会議15スポンサーLT
yumu
0
180
文系の私が新卒エンジニアになるまで
yumu
4
1.4k
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
580
Crafting Experiences
bethany
1
180
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
600
Making Projects Easy
brettharned
120
6.7k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
440
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
How to Talk to Developers About Accessibility
jct
2
230
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
450
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
190
Six Lessons from altMBA
skipperchong
29
4.3k
Transcript
yumu 分散オブジェクトで遊ぼう! dRubyで作るマルチプレイヤー迷路ゲーム
今日話すこと • ゲームの概要 • dRubyについて • ゲームのアーキテクチャ • バグ集 •
改善したい点
自己紹介 yumu(湯村 美吹香) • 新卒3年目 Webエンジニア • 最近はTerraform > k8s
manifest > Ruby • 好きな漫画:メイドインアビス • X:@myumura3
None
None
None
ゲームの概要
ゲームの概要 • https://github.com/myumura/druby-game • 通信にdRuby、WebSocketを使用 • 3D迷路環境 • マルチプレイヤー対戦 •
プレイヤーのロールによって異なる目標 • 5分間のタイムリミット 簡略化した地図
ゲームの概要 Hunter • Survivorを全員捕まえて 脱出を阻止する Survivor • 3つの鍵を集める • 脱出地点を見つけて
• 脱出する VS
Demo 音量注意! PCの場合は矢印キーで移動
dRubyについて
dRubyの基本概念 • 分散オブジェクトプログラミング のためのRuby標準ライブラリ • 異なるRubyプロセス間でオブジェクトを共有 し、メソッド呼び出しを可能にする プロセスA game.move(‘up’) プロキシ
オブジェクト プロセスB def move(direction) # 処理 end dRuby
dRubyで”Hello, World!” require 'drb' class HelloWorld def say_hello(name) "Hello,
#{name}!" end end # オブジェクトを公開 DRb.start_service('druby://localhost:8787', HelloWorld.new) DRb.thread.join サーバー側 require 'drb' # リモートオブジェクトへの接続 DRb.start_service hello = DRbObject.new_with_uri('druby://localhost: 8787') puts hello.say_hello("関西Ruby会議") # => "Hello, 関西Ruby会議!" クライアント側
Why dRuby? • シンプルな実装で分散処理を実現できる Rubyのメソッド呼び出しと同じ書き方でネットワーク越しの連携が可能 https://www.amazon.co.jp/dRubyワークショップのためのガイド-関将俊-ebook/dp/B0F4XT5L78
ゲームのアーキテクチャ
None
ruby.wasm…?
ruby.wasm…?
ゲーム全体のアーキテクチャ • 3D迷路の描画 (Three.js) • ユーザー入力の処理 ブラウザ JavaScript • WebSocketサーバー
(faye-websocket) • dRubyクライアント 中間サーバー Sinatra • • dRubyサーバー • ゲームロジックの • 集中管理 ゲームサーバー Ruby WebSocket dRuby
GameServerクラスの役割 • ゲーム状態の一元管理 プレイヤー・迷路・鍵・脱出ポイントなど • プレイヤーの参加・離脱処理 • プレイヤーの移動・衝突判定 • ゲームタイマーの管理
class GameServer def initialize @game_logic = GameLogic.new @timer_thread = start_timer end def move_player(name, position, rotation) # 移動処理 end def collect_key(name, key_id) # 鍵の収集 end # 省略 end
GameLogicクラスの役割 register_player move_player get_game_state collect_key escape def move_player(name, position, rotation)
player = @players[name] return false unless player return false unless player.can_move? # 障害物との衝突チェック return false if collision_with_obstacles?(position) player.position = position player.rotation = rotation # 鍵・脱出・捕獲チェック check_game_state true end
リアルタイムな操作の実現 1. キー入力 2. WebSocketで送信 3. ゲームサーバーで処 理 4. 全クライアントに配信
5. 画面更新
マルチスレッド • dRubyメインスレッド • WebSocket状態更新スレッド • タイマースレッド
Why Websocket? • dRubyだけだとブラウザと直接話せない ? ruby.wasm?
https://speakerdeck.com/lnit/kansairubykaigi08-wasm-websocket
バグ集
相手のアバターが見えない
画面がブルブルする
捕まったサバイバーが移動できる
他にも... • 壁に突き刺さる • 壁に挟まれて動けない • 鍵が鍵っぽい形にならない • タイマーが開始しない •
音が癇に障る ◦ Web Audio API(ブラウザ標準API)
改善したい点
改善したい点 • dRuby ◦ セキュアではない ◦ パフォーマンスの懸念 • ruby.wasmで動かしてみたい •
(細かいバグはいっぱいある😂)
まとめ
dRubyで作るということ • プロトコルを意識せず、Rubyのメソッド呼び出しとして書ける • 簡単に使える!!! プロセスA game.move(‘up’) プロキシ オブジェクト プロセスB
def move(direction) # 処理 end dRuby
Vibe Coding
最初はここから ...
昨日(今日?)の深夜やったこと • VPSで公開! • 効果音の修正! • モバイルブラウザ対応!
Kaigi Effect最高!🥳
Thank You!