トコロテンの日記

自分の活動内容や普段考えていることをアウトプットするためのブログです。ITに関わる話がメインであり、開発、競技プログラミング、気に入った技術などの話が多くなります。

大学祭でゲームを作った話 - 2019

今年の大学祭について

こんにちは。トコロテンです。私が所属している大学の組織では、毎年大学祭で自分たちが作った作品を展示します。展示物は自作ゲームが殆どです。今年は、以下のような展示物がありました。

  • シューティングVRゲーム
  • 剣と魔法のVRゲーム
  • 声でキャラクターを操作するマリオライクなゲーム
  • 手の動きだけで3Dモデルに色塗りができるアプリ
  • アスキーアートSTAR WARSを表現した映像
  • ラズパイで取得した温度・気圧・湿度・カメラ映像を閲覧できるWeb
  • ジョイコンで遊べる対戦ゲーム
  • 体を動かす3Dリズムゲーム

 

私の作品は、ジョイコンで遊べる対戦ゲームです。

簡単な紹介とダウンロードリンクを以下に置いておきます。ただし、注意点として遊ぶ際にはゲームを2つの端末で同じアスペクト比の解像度で起動してください。異なるアスペクト比の解像度ではおじさんが正常に相手の画面にスポーンすることができません。

 

drive.google.com

ゲームの説明

ゲームのタイトルは「たんさんおじさん(SparklinGrandpa)」というタイトルで簡単に説明するとジョイコンを振りまくって画面越しの敵を狙って攻撃するゲームです。

ゲームの操作にはNintendo SwitchのJoy-Conを利用します。

実際のプレイ動画等は上のツイートを見てください。

ジョイコンを降ると「たんさんエネルギー(SparklingEnergy)」が溜まり、これがおじさんを飛ばす力に変換されます。たんさんエネルギーが溜まっている方が飛距離を稼ぐことができ、一度おじさんを発射するごとにたんさんエネルギーが半減します。弾丸になるおじさんには何種類かタイプがあり、見た目と当たり判定の大きさのみ異なります。

各画面には、ヒットボックスとなる「ヒットボックスおじさん(HitBoxinGrandpa)」が存在し、そこに相手が発射したおじさんが当たるとダメージを受けてHPが減少します。

 2つの画面の境界は、ネットワーク通信によって仮想的に接続されており、画面端まで飛んでいったおじさんは画面の境界を超えて相手の画面におじさんタイプ・速度・加速度・回転角を引き継いだ状態で登場します。

ゲームの設計時に考えたこと

ターゲット層

このゲームを設計する際に最も重要視したのは遊んでくれるターゲット層です。去年の大学祭の来場者の傾向から、圧倒的に親子の割合が多く、小学生くらいの子が多かった記憶がありました。したがって、ターゲット層はこの方々に設定して設計しました。私は幸いなことに小学生の弟がいるため、弟を仮想客として考えました。

まず、最近の小学生は、スマホ世代であることからパソコンを使う機会が少なく、キーボードによるゲーム操作は不適であると考えました。小さい子に身近で直感的かつPCで利用できるインターフェースを提供する必要があり、これを満たすのがSwitchのJoy-Conであると考えました。私が小学生の頃はNintendo DSWiiが流行のゲームデバイスでしたが、現在は小学生がよく遊ぶゲーム機といえばNintendo Switchです。このコントローラーは彼(女)らからすれば身近であり、操作も直感的かつPCで利用することもできます。これらのことからジョイコンをゲームのコントローラに採用しました。また、小さい子は頭を使うよりも体を動かした方が楽しいだろうと考え、ジョイコンを振るといった動作をゲーム内に取り入れました。

そして、親子連れが多いといったことから、親御さんと一緒に小さい子が遊べるゲームが良いと考えました。また、リアルタイム性のある対戦ゲームにすることでプレイを見ている方も応援できるようになるのではないかといった考えもあり、今回のようなゲームを設計することになりました。

余談ですが、小さい子どもは、本当に正直に思ったことや感想を言ってくれます。少し年がある子は気を使ってくれて、楽しくなくても「楽しい」と言ってくれますが、年齢の低い小さい子どもからは、「なにこれ!意味分かんない!」といったような正直なフィードバックを得ることができます(実際に頂いた意見です)。この貴重な意見を利用しない手はありません。小さい子の指摘に耳を傾け、小さい子でも難なくプレイできる操作性やゲームの設定を維持した上で楽しいゲームを提供することは、一種のユニバーサルデザインを実現することにつながると考えています。

フィードバック

このゲームを設計する際に次に重要視したのはプレイヤーのアクションに対するフィードバックです。

まず、おじさん発射時のたんさんエネルギーの半減によってプレイヤーはおじさんを発射する度にしっかりとジョイコンを振らないと発射されたおじさんの飛距離が短くて相手の画面まで届かない設計になっています。したがって、プレイヤーは勝つために必ずジョイコンをしっかりと振る必要があります。一度プレイしてみるとわかりますが、この「ジョイコンを振る」といった動作は思っているよりも腕が疲れます(そのように設計しました)。言い換えるならば、コストが掛かります。ジョイコンを振るといったコストの掛かる動作に対して、おじさんの飛距離が伸びるといった一種の報酬が存在します。これがまず第一のフィードバックです。

次に、相手のおじさんが自分のヒットボックスおじさんに当たった際には、以下の現象が発生するようにしました。

  • 画面全体が一瞬赤くなる
  • ジョイコンが振動する
  • ヒットボックスおじさんが回転する
  • ヒットボックスおじさんが痛そうな声を出す
  • HPゲージが減少する

ダメージを受けたということに対する危機感を与えるために、視覚・触覚・聴覚に訴えるようなフィードバックを用意しました。人間の五感は視覚に大きく依存していると言われています。したがって本来なら画面全体が一瞬赤くなるといった現象はプレイヤーに大変わかりやすく情報を伝達することができますが、このゲームの場合、それだけでは足りません。なぜならば、「おじさんを相手の画面のヒットボックスおじさんに当てる」といった基本アクションを行う際には相手の画面をしっかりと見る必要があり、自分の画面が赤くなっていることはわからないためです。したがって、自分の画面を見ていないときでもプレイヤーにダメージを受けたというフィードバックを与える必要があります。これを「ジョイコンが振動する」「ヒットボックスおじさんが痛そうな声を出す」といった触覚・聴覚に訴えるフィードバックを与えることで解決します。HPゲージが必要なのは言うまでもありません。

開発に関する技術的な話

ゲームエンジン

ゲームを作るにあたって、Unityを利用しました。開発言語はC#です。

unity.com

通信関係

 

このゲームには以下の3種類の通信が存在しています。

PCとJoy-Con間のBluetooth(HID)通信については、以下のリポジトリのドライバを利用しました。かなり良くできており、サンプルも付属しているためスムーズに導入できました。

github.com

 

TCPは対戦相手との接続に利用しています。対戦相手との接続用の通信には信頼性が必要であったためTCPを利用しました。

実装の際には、.NET FrameworkのSystem.Net.Sockets.TcpListenerとSystem.Net.Sockets.TcpClientクラスを利用しました。

docs.microsoft.com

docs.microsoft.com

 

UDPは発射されたおじさんを相手の画面に転送する際に利用しています。発射されたおじさんが画面の境界に行くと送信側は相手側におじさんの情報をまとめたデータグラムを送信しておじさんを削除した後、相手側はそれを受信しておじさんを生成します。これによって仮想的に画面を接続しています。ただし、UDPは通信の品質を保証しないため、送信したおじさんのデータグラムが削除されて相手におじさんが届かない場合があります。これを私は「おじさんのロスト」と呼んでいます。この送信方法の場合、おじさん送信用のパケットはあまり飛び交わないため、負荷も高くなく、一般的にはTCPにしたほうが良いかと思われます。あえてUDPを採用した理由はロマンと実装のお手軽さです。まず、TCPがストリームを成して送受信するデータ境界が存在しないのに対し、UDPはデータグラムといった意味のあるまとまりのデータ単位で送受信し、データ境界が存在します。つまり、おじさんそのものがネットワーク上を飛んでいるのです。ここにロマンを感じます。また、データ境界があることに寄ってプログラムの実装が簡単になります。

実装の際には、.NET FrameworkのSystem.Net.Sockets.UdpClientクラスを利用しました。Unityのスレッドをブロックしないように気をつけて非同期でデータの送受信を行っています。

docs.microsoft.com

当日の様子

当日は、去年の大学祭よりも多くの方々がブースに来てくださり、盛況していました。来場者は、予想通り親子の割合が多く、小学生くらいの子が多かったです。したがってターゲット層にバッチリとマッチしており、狙い通りであったと言えます。私が作ったゲームも多くの方に遊んでいただき、お父さんと小学生くらいの息子さんが楽しそうに対戦している姿を見て本当に嬉しかったです。

また、ジョイコンを見て「スイッチ!?」「ジョイコンだ!!!」といった反応をしてくれる子も何人かいてここも狙い通りであったと言えます。中には、ゲームを自分で作ったことのある小学生の子からジョイコンとどうやってPCを接続しているのか聞かれたり、エンジニアの方から「ジョイコンの通信プロトコルは公開されているのか?」といった質問を頂いたりと技術的なお話もできて大変楽しかったです。

自分が作ったゲームを楽しそうに遊んでもらうのは本当に本当に嬉しいです。

反省点

連続で何回かゲームをプレイしているとジョイコンの接続が怪しくなるといった現象が多発しました。その度にゲームを再起動することになり、一部の来場者の方々には少し不快な気持ちをさせてしまったかもしれません。動作を注意深く観察しているとおそらくドライバなどの問題ではなく、私のプログラムのロジックの問題であるのではないかといった予想がつきました。本番前に予め実機テストを十分にしていればバグに気づいてロジックを修正することができたかもしれなかったため、実機テストをもう少し行っていればよかったと後悔しました。