見出し画像

自作ゲーム開発記 Mother Planets #7 Twitchで「!join」したら、本当に自分の惑星が生まれました

前回は、Twitchのチャットに書いたコメントがUnityまで届くところまで進みました。

その記事の最後に「次は !ping に対して pong を返し、その先で !join と惑星生成までつなげたい」と書いていたのですが、今日はその続きをかなり一気に進めることができました。

最終的には、Twitchで自分が !join と書き込むと、Unityのゲーム画面に実際に惑星が1個出現するところまで到達しました!

まずは !ping に pong を返せるようになりました

最初に確認したのは、TwitchからUnityへ届くだけではなく、UnityからTwitchへ返事を送れるかどうかです。Twitchチャットに !ping と入力すると、Unity側がそれを受信し、今度はゲーム側から pong をTwitchチャットへ投稿するところまで動きました。

前回は「Twitch → Unity」の一方向でしたが、これで「Twitch → Unity → Twitch」という双方向の通信が担保されました。見た目としては「pong」と一言返ってくるだけなのですが、これも視聴者参加型ゲームではかなり大事な一歩です。

!join で参加者として登録できるように

次は、本命の !join です。

Twitchで !join を送ると、そのユーザーのTwitch User IDを使って、ゲーム内部の参加者として登録されるようにしました。同じ人がもう一度 !join を送っても、ちゃんと参加人数は1人のままです。

Twitchでは表示名を変更できるため、名前ではなくUser IDを基準に同じ人物かどうかを判定しています。このあたりは後から直すとかなり面倒になりそうなので、早い段階で重複参加を防げることも確認しました。

参加者から「惑星データ」を作るところまで接続

ここから、今日の中でもかなり大きかった部分です。

!join で登録された参加者を、そのまま画面に球として出すのではなく、一度ゲーム内部の PlanetState という惑星データへ変換する仕組みを作りました。

新しく PlanetSpawnService を作り、

Twitchの参加者
↓
PlanetStateを生成
↓
PlanetJoinedEventを発行

という流れにしています。

同じTwitchユーザーから惑星が2個作られないことや、別のユーザーなら別の惑星になることも自動テストで確認しました。

本物のTwitchチャットからPlanetState生成に成功

準備ができたところで、実際のTwitchチャットからテストしました。
自分で !join と送ると、UnityのConsoleに

「jyoriの惑星を生成しました」

というログが表示され、ゲーム内部にPlanetStateが1個作られました。
ここで初めて、

Twitchチャット
→ !join
→ 参加者登録
→ 惑星データ生成

が全部一本につながりました。

同じ状態でもう一度 !join を送っても2個目の惑星は作られません。実際のTwitch環境でも重複防止がちゃんと働くことを確認できました。

自動テストも164件すべて成功

ここまで追加したところで、既存部分を壊していないか全体のテストも実行しました。

結果は 164 tests PASS / 0 failed。

今回追加した惑星生成だけではなく、それまで作ってきたゲームコアやTwitch参加処理も含めて全部成功しました。一つ機能を増やすたびに別の部分が壊れていないか少し怖いので、毎回オールグリーンでかなり安心します。

そして、ついに画面に惑星が出ました

ゲーム内部にPlanetStateを作れるようになったので、次はそれをUnity上の見た目へつなげました。

まずは本当に最低限の表示として、UnityのSphereを使った惑星Prefabを作成しました。さらに PlanetView と PlanetViewSpawner を作り、PlanetStateが生成された時に発生するイベントを受け取って、対応する惑星Prefabを画面へ出すようにしました。

そして実際にTwitchで !join。すると、Unityのゲーム画面に球体が1個、本当に出てきました。まだ灰色のただの球です。名前もHPバーもなく、公転も自転もしません。でも、この球は最初から置いてあるオブジェクトではありません。

Twitchでjyoriが !joinした結果として生成された、jyoriのPlanetStateに紐づいた惑星です。

ここはかなり嬉しかったです。

地味でわかりづらいですが、その様子を動画に撮りました。

前回書いた「30秒動画」の素材が、もう作れそうになってきた

前回の記事では、コンテスト用動画について「チャットで !join した直後に、自分の惑星がゲーム画面へ生まれる場面」をまず30秒ほど試作したいと書きました。

今日の時点で、その入口になる動作そのものは実際に成立しました。もちろん今の灰色のSphereをそのまま動画に使うわけではありません。ここから名前、属性、色、公転、自転、HP表示などを追加して、「誰が参加して、どの惑星が生まれたのか」が一目で分かる状態にしていきます。

ただ、前回はまだ文章の中で想像していた

「右のチャットに !join が流れたら、左のゲーム画面にその人の惑星が生まれる」

という場面が、もう技術的には動き始めました。
これは今日かなり大きく進んだ部分だと思います。

まだ見た目はただの球。でも、ちゃんとゲームの中から生まれた球

今日できたことだけ並べると、

!ping → pong
!join → 参加者登録
参加者 → PlanetState生成
PlanetState → 画面上の惑星生成

まで進みました。

朝の時点ではまだTwitchのチャットをUnityで受け取れるようになったところだったので、1日でかなり先まで来ました。

特に最後に画面へ出てきたものは、現時点では何の変哲もない灰色の球です。でもその球の裏側には、ここまで作ってきたTwitch接続、参加者管理、ゲーム内部の惑星データ、イベント通信、Unityの表示処理が全部つながっています。

そう考えると、ただのSphereなのに妙に愛着がありますねw

今後の予定

次は、この灰色の球を少しずつ「Mother Planetsの惑星」にしていきます。

まずは誰の惑星なのか分かるように名前を表示し、その後にPlanetStateが持っている公転情報を使って、実際に恒星の周囲を動かしていく予定です。

その先で自転、属性による色、HP表示などを追加していきます。

今まではゲームの裏側を作っている時間が長かったですが、ここからしばらくは画面上の変化も増えてきそうです。

Twitchで「!join」と書く。
その瞬間に、自分の惑星がゲームの世界に生まれる。

Mother Planetsを作り始めた時からやりたかったことの一つが、ようやくUnity版でも目に見える形になってきました!

シルバーウイークでの進捗はここまで!
ここからは通常の進行に戻りますので、地道にがんばります。


いいなと思ったら応援しよう!