FishRumble!!

https://github.com/guriguri00451/alounity

Next.js

GitHub

TypeScript

Unity

Node.js

漕いで!釣って!戦って!!

t.そーま

RiTa

chebuo

アリス

推しアイデア

釣った魚を相手にぶつける!三身一体で相手を倒せ!!

作った背景

Unity使いまくりて〜&スマホ使った遊びにしたい〜

推し技術

Unityの変な技術たくさん使ってます! Socket.IOで双方向リアルタイム通信!

プロジェクト詳細

FishRumble!!

概要

スマホをコントローラーとして使用するマルチプレイヤーカヤックゲーム。

3人1チームの釣りバトル(物理)! スマホを振って操作しよう!

ゲームプレイ

  1. QRコードでスマホをUnityクライアントに接続
  2. 釣りで魚を釣る
  3. 釣った魚を振り回して相手チームにぶつける
  4. 相手チームのHPを0にしたら勝ち

チーム構成と役割

image

ゲームモード

  • single: 1チーム3人
  • versus: 2チーム3vs3

背景

Unityゲームを作るために集まったチームなのでゴリゴリUnity技術を用いています。 また、スマホをコントローラーにしてみんなで遊べるゲームを作りたかったのでこのようなゲームになりました。

技術スタック

デプロイ先:Render(コントローラーアプリ+中継サーバー) image image ちゃんとCIを回しながら開発!

アーキテクチャ

image

  • 通信方式: Socket.IOによる双方向リアルタイム通信
  • リアルタイム通信: Socket.IO 4.8.3
  • ルーム管理: サーバーがインメモリで管理、ホスト切断時に自動削除

通信フロー

image

推し技術・推しポイント

Next.js カスタムサーバー構成

Next.jsのデフォルトサーバーではWebSocketが使えないため、http.Server + Socket.IOを統合したカスタムサーバーを構築しました。 これによりサーバー1つだけでUI配信 + リアルタイム通信を実現!

Socket.IOが便利だった

  • WebSocket + HTTPロングポーリングの自動フォールバック (WebSocketが通らない環境では、自動的にHTTPロングポーリングに切り替わってくれる)
  • 再接続機能 — ネットワークが不安定な環境でも自動リトライ(最大10回、1秒〜5秒間隔)
  • ルーム機能 — io.to("room:xxx").emit() で同一ルームのみに配信

インメモリ(ルーム・プレイヤー管理)

推しポイント: データベース不要。Mapで軽量に管理。

データベースを使わず、サーバーメモリ上の Map<string, RoomState> , Map<string, PlayerData>,だけで管理しているため、読み書きが爆速! ルームが消えればプレイヤー情報も自動消滅するので、ゴミデータが残らない!

interface RoomState { roomId: string; // 6文字英数字(I/O/0/1除外) hostId: string; // Unityのsocket.id gameMode: "single" | "versus"; players: Map<string, PlayerData>; // socket.id → { role, team } }
  • 自動クリーンアップ — ホスト切断時にルーム自動削除
  • 役割占有管理 — チーム内で同じ役割は1デバイスのみ
  • 切断時の自動解放 — プレイヤーがブラウザを閉じるだけで役割が空き、別の人がすぐに取れる
  • リアルタイム同期 — スマホ側で「誰が何の役割を取っているか」が常に最新に保たれる。

UniTask

実際の仕事現場でも使われている非同期処理のライブラリ

Active Ragdoll

アニメーションをキーフレームではなく物理挙動で行う機能。 毎回違うアニメーションが再生される。

Shader Graph

ドキュメント

アーキテクチャやシーケンス、仕様書など今回の開発でまとめたドキュメント達!詳しい設計や仕様はこちらを参照ください。 開発初期段階の企画書や実装計画についてまとめたドキュメントなども置いています。

0コミット伝説

ハッカソン1日目終了時点で0コミット チームメンバーなのになぜかリポジトリのContributorsに含まれていない幻の男、アリス。

WANTED

この男を見つけ次第、身柄を当チームに引き渡すこと。生死は問わない。 image

t.そーま

@soma