推しアイデア
釣った魚を相手にぶつける!三身一体で相手を倒せ!!
釣った魚を相手にぶつける!三身一体で相手を倒せ!!
Unity使いまくりて〜&スマホ使った遊びにしたい〜
Unityの変な技術たくさん使ってます! Socket.IOで双方向リアルタイム通信!
スマホをコントローラーとして使用するマルチプレイヤーカヤックゲーム。
3人1チームの釣りバトル(物理)! スマホを振って操作しよう!

Unityゲームを作るために集まったチームなのでゴリゴリUnity技術を用いています。 また、スマホをコントローラーにしてみんなで遊べるゲームを作りたかったのでこのようなゲームになりました。
デプロイ先:Render(コントローラーアプリ+中継サーバー)
ちゃんとCIを回しながら開発!


Next.jsのデフォルトサーバーではWebSocketが使えないため、http.Server + Socket.IOを統合したカスタムサーバーを構築しました。 これによりサーバー1つだけでUI配信 + リアルタイム通信を実現!
データベースを使わず、サーバーメモリ上の 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 } }
Unity上で文字列→QRコードのTexture2Dを生成 ルームID入力不要でUX向上!スマホでQRコードをスキャンするだけでルーム参加が可能!
実際の現場でも使われている非同期処理のライブラリ
アニメーションをキーフレームではなく物理挙動で行う機能。
毎回違うアニメーションが再生される。
一つ一つのボーンに当たり判定とRigidBodyを追加する手法です。
荒ぶったり、かな〜り厄介ですが頑張りました。
下の画像の海を作成するのに使った。ベースカラーとノーマルマップをノードベースで加工している。

ベースカラーは以下のようになっている。
上の部分でカメラからの奥行きを取得して、近くの部分を反射しないようにしていて、下の部分で10倍にした画像を水色と白で2値化している。

ノーマルマップは以下のようになっている。
上の2つで画像を10倍にして、下の部分で斜めに動かしている。

それ以外に座標もアニメーションするようにしている。
ポジションのY軸のみをsin関数を使って上下に移動するようにしている。これで潮の満ち引きを再現している。

VFXでは波しぶきと航跡波と釣りポイントエリアを作成した。
下の画像は航跡波の生成頻度と速度の計算をしている。
船のオブジェクトの速度をBlackBoardを使って取得した。その速度を使って正と負を繰り返す値と速度調整、制限をしている。

3Dモデルの輪郭線はバックフェイスカリングを用いて実装している。バックフェイスカリングとはポリゴンの裏側を描画しない機能のこと。
通常のモデルとポリゴンの裏側を表にした一回り大きいモデルを用意する。
これによって、輪郭線を作ることができた。

アーキテクチャやシーケンス、仕様書など今回の開発でまとめたドキュメント達。詳しい設計や仕様はこちらから! 開発初期段階の企画書や実装計画についてまとめたドキュメントなども置いています。
そーま:Unity側ゲームロジック担当
chebuo:3Dモデル作成、パーティクル、シェーダー担当
リタ:スマホコントローラー実装、websocket通信周り担当
ハッカソン1日目終了時点で0コミット チームメンバーなのになぜかリポジトリのContributorsに含まれていない幻の男、アリス。
この男を見つけ次第、身柄を当チームに引き渡すこと。生死は問わない。
