MonoGame で制作したゲーム「リトルセイバー」を Web (Blazor + WebGL) で動かしてみた話

Web で動くゲームを作ってみようと思った話

image

現在 Steam や DLsite, Microsoft Store, Google Play で配信中のアクションゲーム「リトルセイバー」ですが、動作フレームワークとして「MonoGame」を使用しています。

当ゲームは有料での販売であるため各々で体験版を配布しているのですが、よりお手軽にゲームを体験できるようにするために開発中のデモ版も含めて以前まで Web で公開していました。

その時は「Silverlight + XNA」をフレームワークとして作り公開していましたが、残念ながら 2021 年にサポートが終了し、唯一動く IE もサポートが終了してしまったため、現在 Web で試せる環境はなくなってしまいました。まあ一応「β版開発室」にはずっとページは残っているのですが。

image

Unity など他のゲーム開発プラットフォームでは WebGL がサポートされていたりしますが、MonoGame では現時点で Web 版はサポートされていません。しかし実験的に開発はしているらしく、コミュニティを見てみたら一応 Web 上で動くライブラリを公開しているようでした。

内部的な動作ベースは WebAssembly となっているため、これまでの Flash や Silverlight とは異なり多くのブラウザでサポートされています。今後 (現在もですが) Web ブラウザで手軽に遊べるゲームを作るなら WebAssembly + WebGL ベースで作るのが良いかと思います。

WebGL で動かせるライブラリが見つかったので、今後 Web でゲームのお試し版を公開する可能性があるかもしれないことも考え、試しに現在のゲームを Web 版で動かせるかどうか試してみました。

実際に動かしてみた動画

実際にどうやったのかなどは後で書きますが、結果としては「動かすこと」はできました。どんな感じに動いているかは動画としてアップしましたので見てみてください。

ニコニコ動画

Youtube

ちなみにこのゲームを動かしているサイトは開発目的で作ったものなので非公開となっており一般の方が遊ぶことはできません。理由としては使用しているライブラリがまだ未完であるのと、遊べるレベルまで最適化するのが非常に面倒だったためです。

使用しているライブラリなど

今回使用しているライブラリは MonoGame の開発者でもある nkast さんが個人的に作ったライブラリとなっています。

該当するコミュニティのページは以下となっています。

またビルド・実行可能なサンプルプログラムも公開されています。

フレームワークとしては「Blazor WebAssembly」+「WebGL」+「.NET 6」+「C#」で動く形となっています。

動くプログラムを確認するならサンプルプログラムを触ってみるのが手っ取り早いですが、ライブラリは nuget でも公開されているので新規プロジェクトとして制作することもできます。

プログラムの移行に関していろいろやったこと

WebGL 版も MonoGame ベースのフレームワークとして作られているので大部分のコードについては変更することなく移行することができました。ただ本ゲームは 2D ベースなので 3D ベースのゲームプログラムの場合はどのぐらい影響があるかは分かりません。また、大部分は変更はありませんでしたが Web ブラウザで動くプログラムになってしまうので、いくつかは変更が必要になるものはありました。ここではゲーム固有部分ではなく誰にでも影響がありそうな修正箇所についていくつか書いてみたいと思います。

Effect (.fx) コンテンツは使用できない

デフォルトで実装されているエフェクトは分かりませんがコンテンツパイプラインから読み込む形の Effect は使用できないみたいです。`Content.Load` で読み込もうとした時点でエラーになります。2D でもカスタマイズした描画を実行している場合は注意が必要です。3D は特に影響が大きいのではないでしょうか。

リトルセイバーでは被弾時の白点滅にエフェクトを使っていたのですが今回省きました。

Song クラスは使用できない

BGM 再生などに使用されることがある `Song` クラスは使用できません。こちらも `Content.Load` でエラーになります。BGM を流したい場合は効果音と同じ `SoundEffect` クラスを使用する必要があります。`Song` クラスはストリーム再生できるメリットがあるのですが汎用性が低いこともあり、リトルセイバーでは `SoundEffect` で BGM を再生していたため手間はあまりありませんでした。

GamePad は使用できない

`GamePad` クラスで何らかのアクセスをしようとしただけでエラーになります。キーボードやマウスは使用可能です。Web ブラウザではゲームパッドの対応が元々難しかったりするので仕方ないですね。

Load 用コンテンツ (.xnb) を実行ファイルに埋め込み

WebGL 版のライブラリでは `wwwroot` フォルダ内にあるファイルからコンテンツを読み込むように作成されていますが、テスト段階でなぜか読み込めない場合がありました。キャッシュの問題なのかなんなのか不明だったため、コンテンツファイルはすべて「埋め込みリソース」として実行ファイルに埋め込むようにしました。これが原因か分かりませんが、先述のサンプルプログラムでも一部そのようにカスタマイズして読み込んでいるコードがあったりします。

コンテンツファイルを埋め込むと初回ダウンロード時にすべてのファイルをダウンロードする必要があるので読み込みに時間が掛かります。ただし、全て読み込んでからゲームを動かすのでゲーム実行中の読み込みスピードは上がります。逆に `wwwroot` に置くパターンは初回のゲーム読み込みは早いですが、コンテンツが必要なタイミングでインターネットからダウンロードするので途中の読み込みは遅くなります。

テクスチャーで Dxt3 は使用できない

おそらく WebGL 版にデコーダーがないので `Content.Load` でエラーになります。`SpriteFont` もデフォルトでは `Compressed` (Dxt3) になっているので、普通に作ってるとエラーになります。テクチャーフォーマットは `Color` にしておけば大丈夫です。

SpriteFont.Characters は使えない

使っている人がいるかどうかは分かりませんが `SpriteFont` に何の文字が含まれているかをチェックするためなどの目的で `Characters` プロパティは使用できません。

暗号化やハッシュのライブラリは使用できない

これは MonoGame 側の話ではなく Blazor 側の話です。一応クラスはあるのですが使おうとするとサポートされていないという Exception が発生します。代わりに `BouncyCastle.NetCore` などのサードパーティライブラリを使用する必要があります。ただ今後の .NET のバージョンで暗号化やハッシュがサポートされる可能性はあります。

ローカルファイルへの書き込みはできない

Web ブラウザで動作するものなのでローカルへのファイル書き込みは出来きず代案が必要となります。...とはいうものの実は一時的にできたりはしますが、結局は永続化はできないので対処は必要です。ローカルストレージやインターネット上の Web ストレージなどを使用する必要があります。

SoundEffect の音量が正しく設定できない

これはおそらく不具合だと思うのですが、`SoundEffect.Volume` プロパティを設定しても必ず 100% の音量で再生されてしまいます。対処法としては元のサウンドファイルの音量を下げるしかないのですが、さすがに面倒なので放置しています。ただなぜか再生中には音量は変更できるようです。

パフォーマンス関連

おそらくこれが一番影響がでかいのではないかと思います。ネイティブで動くコードと WebAssembly で動くコードではパフォーマンスに大きな差があるため、ネイティブでギリギリまで調整して動いているプログラムは Web で動かそうとするとほぼ動かすことが困難になるのではないかと思います。ちなみにどれぐらいパフォーマンスが落ちるかについては先述の動画で確認できると思います。

ただ WebAssembly はまだ発展途上なので今後少しづつ改善はされていくと思います。それでもネイティブに勝てることはないと思うので Web 版が正式リリースの対象に含まれているゲームの場合は定期的にパフォーマンスの確認をしていった方がよいと思います。

まとめ

今回 WebGL 版としてゲームを動かせるか試してみたのですが、目的としてはローカルで動くゲームをまずは手軽に Web 上で遊んで確認できるような環境を作りたかったというのがあります。

リトルセイバーについてはすでに本リリースしているので今のところそういう環境が必要という場面にはなっていないですが、今後そういったこともあるかもしれないので興味的なものも含めて試してみました。

もしかしたら WebGL でゲームを公開してみたいという方もいるかもしれないので、この調査結果が大なり小なりでも参考になればいいかなと思いました。

ゲーム「リトルセイバー」Steam 版のセーブデータクラウド同期に対応しました

Steam 版のリトルセイバーでセーブデータのクラウド同期に対応しました。これにより複数のPCでセーブデータを共有できるようになります。(セーブデータ同期にはインターネットの接続は必須。同期しなくてもゲームはできます)

例えばデスクトップでリトルセイバーを遊んでいたが、出先でノートPCなどで続きを遊ぶということができるようになります。また、PC が壊れた場合にもセーブデータがクラウドにあるのでセーブデータが失われにくくなります。

この機能は Steam 側の設定で完結できているのでリトルセイバーのバージョンアップは特にありません。そのままいつも通り遊べるようになってます。ゲーム起動時は一瞬 Steam の同期ダイアログが出ることはあります。

ちなみにセーブデータ同期前に複数のPCで違うセーブデータがあった場合はどうなるのか、という疑問については、リトルセイバーでは同じ番号のセーブデータでも別々のセーブデータとして認識できるようになっています。読み込む際にいらない方を削除するかそのまま残すかも選択できます。この機能は Microsoft Store 版のリトルセイバーで実装済みなので Steam 版でもそのまま適用されています。

image

ちなみに現在 Steam リトルセイバーによくわからない実績があると思うのですが、現在仮の実装なので気にしないでください。

いくつか実況動画を上げています

告知というか投稿状況については現在ニコニコ動画内でしか行っていないのですが、いくつかゲーム実況とゲーム制作実況を現在進行形で上げています。

【実況】不思議のダンジョン 風来のシレン5plus やります (初見)

久々に不思議ダンジョンシリーズをやりたくなったので探してみたら去年 Steam (と Nintendo Switch) で風来のシレン5plus がリリースされていたので遊んでみました。やったことがないので初見プレイです。

現在12回分公開していますが、たぶんしばらくは終わらないかと思います。

【実況】聖剣伝説3 TRIALS of MANA (ノーフューチャー)、やります

実況しながらアクションゲームができるかを試してみたくてやってみました。というよりかは風来のシレンだけだと動画の公開間隔が結構空きそうだったので穴埋めとしてやってみました。

実況しながらゲームできるかといいつつ難易度は6段階で一番上のノーフューチャーでプレイしています。一応クリア済みなので初見ではありません。現在8回分公開していますがまだ序盤なのでまだまだ続きそうです。

【実況】2作目のゲームを作ります

そろそろ次のゲームを作りたくなったのでゲーム制作と並行で制作状況の動画を上げることにしました。といってもまだゲーム制作自体には入っていないのでまだ始まりの部分です。動画の作成はゲーム制作の進み具合にもよるので公開間隔は不定期としています。まだ2回分しか公開していません。

とりあえず今のところは途中でやめるということはないのでゲーム実況のほうはたぶん最後までやるかと思います。ゲーム制作の方はまだ先が長いです・・・。

2~3日間隔で1本公開しているので同一シリーズは週に1,2本公開している感じですね。忙しくなければ今の間隔で上げていくと思いますのでぜひ見てやってください。

Windows で遊べるゲーム「リトルセイバー」が DMM GAMES にて公開されました。「遊び放題」プランでも遊べます。

image リトルセイバーは現在、Steam や MSストア、DLsite で公開していますが、今回新たに DMM GAMES にて配信開始されました。内容は他で公開しているものと変わりませんが、DMM GAMES を中心に遊んでいる方は手軽に遊べるようになりました。 価格は他で購入する場合と変わらないように 980 円で統一しています。現在ポイント還元中 (たぶん 20%) なので、他のサイトよりはお得になっていると思います。 また、DMM GAMES には特有のプラン「遊び放題プラン」があり、こちらでもリトルセイバーを遊べるようになっています。たしか月額 980 円だったので、1か月限定で考えればかなりお得なんじゃないかと思います。すでに遊び放題プランに加入しているからであれば気兼ねなく遊ぶことができると思います。 ストアページは以下のリンク先となっています。

対応プラットフォームは他と同じく Windows 7 以降となっています。DMM GAME PLAYER のインストール(無料)が必要らしいです。 リトルセイバーの公式ページと体験版ダウンロードは以下のリンク先となっています。 ]]>

Windows向けに公開中の2Dアクションゲーム「リトルセイバー」をAndroid版としてGoogle Playにて配信開始しました

戦闘ステージ_Mobile_002 Windows, Windows 10 Mobile 向けに配信していたゲーム「リトルセイバー」を Android 向けに公開いたしました。2か月ほど前にテスター向けに限定公開していましたが、ようやく正式版として公開することができました。 「リトルセイバー」は多数のユニット同士が戦い合うリアルタイムバトルアクションゲームでPC向けに制作しておりましたが、スマートフォンでも遊べるように Android で動くようにしました。とはいっても実はすでにスマートフォン OS である Windows 10 Mobile でも遊べるようになっていましたので、すでに遊ばれた方もいるかもしれません。ただ、Windows 10 Mobile ユーザーは全体的に少ないと思いますので、今回 Android に対応したことによって多くの人が遊べるようになったかと思います。

要求スペック

要求スペックは以下のようになっています。細かいことについては下の方に書いてあります。
  • CPU : Snapdragon 617 相当
  • メモリ : 2GB
  • OS : Android 8.0 以降 (7.0 は未検証、6.0 以前は非対応)
推奨スペックなので上記スペックより低くても動作しますが、その場合カクカク動作になったりするかもしれません。

配布場所と価格

Android 版のリトルセイバーも有料版と無料版があります。有料版はアカウント単位で買い切りです。価格は Windows 版と同じで 980 円となります。配布・ダウンロード先は Google Play となっており、apk 単体では配布しておりません。 注意点としてセーブデータについてですが、有料版と体験版は別アプリとして配布してありますので、体験版のセーブデータを有料版の方に引き継ぐことはできませんのでご注意ください。

PC 版と違う点 その1

PC 版と違う点はスマートフォンは PC に比べるとかなりスペックが低いので、同時に動くユニットの数はそれなりに減っています。とはいってもスマートフォン同士でもスペックの差はかなり広いのでオプションでユニットの配置数はある程度調整することは可能です。低スペックのスマートフォンだと配置数を最低にしてもカクカク動作になりますし、私がテストした Google Pixel 3a の場合、最大数で配置してもほぼスムーズに動作しました。より高スペックなスマートフォン、タブレットならもしかしたら PC モードでも遊べるかもしれません。PC モードはユニットの配置数ははるかに多いですが、そもそも広い画面が必要なので少なくともタブレットぐらいのサイズは必要です。 image 一応要求スペックとしてはCPUは「Snapdragon 617 相当」、メモリは「2GB」にしてあります。ただスマートフォンの種類がかなり多いので正直ここが妥当なのかはわかりません。体験版も公開してありますので事前に動作確認してください。

PC 版と違う点 その2

PC 版と違う点のもう一つはひとつのステージの広さがPC版に比べて狭くなっています。前述のスペックを考慮しているのもひとつなのですが、スマートフォンの場合、出先などで少しだけ遊ぶ、というスタイルもあるかと思いましたので、なるべく1つのステージを小さくしてステージクリアごとにセーブできるようにしました。その代わり PC 版に対してステージ数(深さ)を増やしました。普通に遊べば攻略にかかる総時間は PC 版と変わらないかと思います。

公式サイト

いまだに完成していないのですが、以下の URL が公式サイトとなっております。Windows 版もこちらから体験版をダウンロードできたり、有料版の購入ページにアクセスすることができます。

参考プレイ動画

ニコニコ動画、Youtube でリトルセイバーのプレイ動画を公開しています。どちらも投稿している内容は同じです。 ]]>

ゲーム「リトルセイバー」Ver 1.08 を公開しました

2か月ぶりですがバージョンアップしました。主に海外環境での改善になるので、現在プレイしている方で動作に問題ない方はすぐにバージョンアップする必要はないかと思います。

機能改善
  • 日本語、英語以外の言語を選択したときにテキストが枠をはみ出ないように改善。
仕様変更
  • 【バランス調整】特殊技の消費SFを若干減らした。
不具合修正
  • ユニットが強化されると特殊技の消費SFが減る問題(本来増える)
  • フランス語環境など日本語や英語と数値の書式が異なる環境で実行したときに戦闘開始時に異常終了する問題

それと Android のβ版を2か月ほど前に公開しましたが、Google Pixel 3a で動作に問題ないことを確認しましたので近いうちに公開したいと思います。

スマフォなので値段を下げるかどうか考えましたが、高スペックスマフォだと Android でも全然動作に問題ないことがわかりましたので他と同じ 980円付近にしようかと思います。もしかしたら高スペックなら PC モードでも動作するかもしれません。

]]>

ゲーム「リトルセイバー」を Steam にて公開しました

image

現在 Microsoft Store, DLsite にてリトルセイバーを公開しておりますが、提供できる場をもう少し広げてみたかったので今回新たに Steam でもゲームを公開することにしました。ゲームの内容はいずれも同じ内容となっておりますので、完全版を遊ばれる方は好きな場所から購入していただくことができます。Steam の公開ページは以下のリンク先となります。 体験版も Steam 経由でプレイ可能です。完全版の価格については他サイトとほぼ同じ 980 円となります。Steam で公開されているゲームは割と高めだったりするのですが、Steam の販売価格だけ高くしてもアレなので同じようにしました。 Steam 経由でゲームをプレイする際、割と親切だと思ったのが、ゲーム実行に必要なコンポーネントをゲーム開始前に自動でインストールしてくれるところでした。DLsite で公開しているプログラムはゲームの実行ファイルだけですので、ゲームをプレイする際は自分でコンポーネントをダウンロードしてきてインストールする必要がありました。MS ストアで公開しているアプリは全部含まれているのでこちらも何もせずにそのままゲームを実行できますが、UWP という限られた環境内なので、Windows 7 以降も含めて対応している Steam は割と親切だと思いました。(macOS や Linux も対応しているっぽい?) Steam でゲームを公開するまでは登録する内容が沢山あったりすぐにゲームを公開できなかったりレビュー返しを沢山くらったりしましたが何とか公開までたどりつけました。わりかし国外の方も見ることが多いらしいのでぜひ遊んでいただけると嬉しいです。]]>

ゲーム「リトルセイバー」Ver 1.07 を公開しました

今回はゲームバランスの調整といくつか改善を行いました。

追加機能
  • オプションに「非アクティブのとき入力を受けない」を追加しました。ON にするとゲームウィンドウがアクティブでなくなった時に入力を受け付けなくなります。
  • プレイヤー入力設定に「キャラ向き固定ボタン、ターゲット固定ボタンをトグル形式」にできる設定を追加しました。
機能改善
  • プレイヤーが1人の場合、戦闘中での接続されているすべてのゲームパッドで操作できるようにしました。
仕様変更
  • 【バランス調整】ステージ1~4の難易度を若干下げました。
  • 【バランス調整】武器「クロス」の能力を全体的に下げました。
  • 【バランス調整】武器「カノン」の能力を若干上げました。
  • 【バランス調整】武器「ボム」の能力を若干上げました。
  • 【バランス調整】武器「マルチプル」の能力を若干上げました。

いくつかの公開サイトにはアップデートをかけていますが、反映されるまで時間がかかる場合がありますのでお待ちください。

なお、Android 版については現在もβ版のみの公開となっております。こちらは Ver 1.06 の内容のままです。

]]>

ゲーム「リトルセイバー」Ver 1.06 を公開しました

今回そんなに更新内容はないのですが、割と致命的な不具合が1つ修正されているので可能であればアップデートをお願いします。

更新内容は以下の通りです。

追加機能
  • Android 版に対応しました。体験版のβ版をリリース後、体験版と正式版をリリースします。(現在 Google Play でのみリリースです)
  • 操作説明画面をタイトル画面と一時停止画面に追加しました。
機能改善
  • プレイヤー入力の設定に関係なく、メニュー画面では接続されているすべてのゲームパッドで操作できるようにしました。
不具合修正
  • ステージの途中でマップに戻るとアイテムが消失する不具合

一応アップデートの大きな目玉は Android 対応ですが、現時点では Google Play において体験版をβ版としてリリースしているところです。詳しくは前の投稿に記載しているのでそちらをご覧ください。

]]>

現在ゲーム「リトルセイバー」の Android 版のテストプレイが可能です

前回投稿した内容が長すぎたので別途投稿します。

公開中のゲーム「リトルセイバー」の Android 版をリリース予定です。現在β版として公開していますので、以下のリンク先からダウンロード、インストール可能です。Android 端末からアクセスしてください。

ゲームの内容は体験版と同等となっています。Android 端末のスペックは以下を推奨しますが、複数端末で検証できていないので以下のスペック以外でも動作するかもしれません。

  • OS : Android 8.1 (Oreo) (最低でも Android 7.0)
  • CPU : Snapdragon 617 クラス
  • メモリ : 2GB

もしテストプレイをしていただいて動作に問題があったり、特定の端末ではあまり快適に動作しなかったなどの症状があれば以下のどこでもいいのでご連絡いただけると助かります。

]]>