しゃどうぶろっかー

しゃどうぶろっかー

#

Unity

#

MediaPipe

#

OpenCV

#

Python

「バーチャルな2D アクションゲーム」と「リアルな身体の動きによる妨害」を融合させた新感覚の対戦アクションゲーム「しゃどうぶろっかー」。東京ゲームショー2025にて出展した。

##画像・動画

しゃどうぶろっかー-1763832978263.webp

##概要

この​ゲームは東京ゲームショー2025(以下​ TGS) にて​出展し、​100 人以上の方に​遊んでいただきました。​遊んでいただいた​方から​「ありそうでなかった​ゲーム」​「身体を​動かして​妨害するのが​楽しい」と​いった​反応を​いただきました。

2D アクションの​ステージで​ゴールを​目指す​「プレイヤー」と、​影(シャドウ)と​なって​ゲームに​入り、​プレイヤーを​ゴールさせないために​キックや​パンチなどの​身体動作で​妨害する​「シャドウ」の​ 2 人に​分かれて​戦います。​「バーチャルな​ 2D アクションゲーム」と​「リアルな身体の​動きに​よる​妨害」を​融合させた​新感覚の​対戦アクションゲーム​「しゃどうぶろっかー」です。

チーム開発で​私は​ゲームシステムと​効果音などの​サウンド面、​トラッキングを​おこなっている​バックエンドを​担当しました。

##背景

私の​所属している​愛知工業大学では​東京ゲームショーで​自作した​ゲームを​出展する​学生プロジェクトが​行われています。​この​学生プロジェクトでは、​バーコードや​障子などの​日常に​ある​一風​変わった​ものを​ゲームインターフェース化する​挑戦を​続けています。​そこで​私たちは、​「人間の​身体​その​もの」を​ゲームインターフェースに​して​直感​的かつダイナミックに​遊べる​ゲーム​「しゃどうぶろっかー」を​考えました。

##ゲーム内容

###基本

この​ゲームは​ 2D アクションの​ステージで​ゴールを​目指す​「プレイヤー」と、​影(シャドウ)と​なって​ゲームに​入り、​プレイヤーを​ゴールさせないために​キックや​パンチなどの​身体動作で​妨害する​「シャドウ」に​分かれて​戦います。
制限時間は​ 100 秒です。​100 秒以内に​ゴールできれば​プレイヤーの​勝ち、​100 秒以内に​ゴールさせなければ​シャドウの​勝ちです。

###アイテム

アイテムには​「バリアアイテム​(一定​時間キックや​パンチの​影響を​受けなくなる)」と​「ブーストアイテム​(一定​時間ジャンプ力が​上がる)」の​ 2 種類が​ランダムで​ステージ上に​出現します。​ プレイヤーは、​状況に​合わせて​アイテムを​取得する​ことが​勝利の​カギと​なります。​シャドウは、​プレイヤーに​アイテムを​取らせないようにしましょう。

###プレイヤー

プレイヤーは、​コントローラーで​キャラクターを​操作して​ゴールを​目指します。​途中で​シャドウからの​妨害を​食らうと、​キャラクターが​飛んで​一時的に​操作が​できなくなりますが、​ステージの​ギミックを​利用して​諦めずに​ゴールしましょう。

###シャドウ

シャドウは、Web カメラの​前でキックや​パンチなどの​全身を​使った​動きを​行います。​この​動きを​ MeidaPipe で​リアルタイムに​検知し、​その​結果​(キックや​パンチなどの​判定)に​応じて​プレイヤーキャラクターを​吹き飛ばして​一時的に​操作不能に​する​「ブロッカー」と​して​機能します。
これを​利用して​シャドウは​プレイヤーを​ゴールさせないようにしましょう。

##技術スタック

  • ゲームエンジン: Unity (C#)
  • トラッキング (姿勢推定): MediaPipe
  • カメラ処理: OpenCV
  • バックエンド言語: Python

##技術的な​工夫

###リアルタイム姿勢推定

リアルタイムの​姿勢推定には​ Mediapipe を​使用しました。​Mediapipe は​ Google が​開発した​オープンソースの​フレームワークで、​カメラの​映像や​動画から​顔や​手などの​全身の​姿勢を​リアルタイムで​検出し、​トラッキングを​する​ことができます。
Mediapipe で​取得した​ランドマークの​加速度を​計算し、​ある​一定の​閾値を​超えたら​キックや​パンチの​身体動作を​検知するようになっています。​キックの​閾値は​パンチの​閾値よりも​高く​設定しており、​パンチよりも​厳しく​判定しています。​キックの​閾値を​高く​する​ことで、​歩く、​座るなどの​日常動作での​誤検知を​防ぎ、​激しい​足の​動作を​検知した​場合に​キックと​判定します。​また、​手や​足が​どの​方​向に​動いたかも​チェックし、​「手を​下ろす」や​「足を​前に​出す」などの​意図しない​動作には​キックや​パンチの​判定を​しないように​しています。

###バックエンドに​ Python を​採用した​理由

ゲームエンジンの​ Unity は、​グラフィック​処理や​物理演算などを​行い、常に​安定した​フレームレート (FPS) を​維持する​必要が​あります。​一方、​Mediapipe を​使用した​リアルタイム姿勢推定は、CPU / GPU に​高負荷な​処理を​します。​TGS の​展示では、8 時間もの​連続動作に​耐えられるような​安定性を​保つ必要が​ありました。
そこで、​私は​トラッキング処理に​ Python を​採用し、​Unity とは​独立した​別プロセスの​実行を​する​ことで​安定した​処理を​行えると​考えました。​これに​より、​Mediapipe 側が​処理速度の​遅延や​フレームレートの​低下が​起きても、​Unity 側の​フレームレートを​低下する​ことなく、​安定性を​保って​ゲームを​実行できました。

###Python と​ Unity の​通信

Python 側と​ Unity 側の​通信は​ TCP 通信を​用いて​行っています。​映っている​人物を​切り​取って​黒塗りの​画像にします。​画像を​ PNG 形式に​変換し、​テキストベースで​扱える​ Base64 に​エンコードした​データを​ Unity 側に​送ります。​Unity 側は​送られた​データを​デコードし、​ゲーム内に​画像と​して​表示しています。​これを​連続で​繰り返すことに​よって​映像のように​処理できます。

Share