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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
Amusing Abliteration
ianozsvald
1
210
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
160
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
30 Presentation Tips
portentint
PRO
1
330
Visualization
eitanlees
152
17k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Designing Powerful Visuals for Engaging Learning
tmiket
1
420
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
340
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
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!