アツマールの思い出と学び

【ゲーム制作】レンタルサーバーを使ってスコアボードを実装する①準備編(RPGツクール/godot)

 


こんにちは。ポメルです。長文。


まえがき

ゲームアツマールがサービス終了を発表しましたね。
ゲームアツマールにはゲームを投稿する場としていいところがたくさんありました。
あの手軽さとか賑やか感とか、フリーゲームを投稿する場としてはかなり良いサービスだったのではないでしょうか。
特になくなっちゃって残念なのが、アツマールAPIです。
スコアボードとか、サーバー変数とか、共有セーブデータとか、ネットワークを介したシステムが簡単に実装出来て、その点は確実に他のゲーム投稿サービスより進んでいたと言えます。
投稿されていたゲームの中には、そのアツマールAPIを前提に作られたゲームシステムの物もあり、アツマール終了により、そのゲームの公開自体を諦めるしかないと判断した作者さんもいるのではないでしょうか。
私が公開しているゲームには、アツマールAPIを根っこにして動いているようなものはなく、精々スコアボードくらいしか使ってなくてもう公開できないっていうことはないのですが
やっぱりスコアボードがあるから楽しいし盛り上がるっていうのはあると思うんですよ。
私、一番最近だと「ひよこサバイバ~」というゲームを投稿させていただいています。ちょっとリンク貼っておきますね。
アツマール:https://game.nicovideo.jp/atsumaru/games/gm28597

こちらのゲーム、ゲーム終了時にスコアボードを表示するっていうだけで、アツマールAPIが使えないとゲームできない!というわけでは全然ありません。
しかし、スコアボードが表示できないのは、このゲームにとっては致命傷だと考えています。
このゲームかなり気に入っていまして、作者としてもう何回もプレイしていますが、今やってもフツーに楽しいです。
私考えました。このゲームの命をつなぐためにはどうしたら良いか。サーバーをレンタルして、ランキングを自前で実装するしかないと。
で、実際に実装しました。もう大変。最初は何すればいいのか全然わからない。
ゲームからネットワーク介してサーバーへスコアを送信して、ランキングを取得するにはどうしたら良いか、検索してもブラウザ上で動くうんたらかんたらとか
マルチプレイゲームの作り方とかの情報がたくさん出てくるものの、欲しい情報が丸ごとのっかっている物はなく、サッと実装を始めることができませんでした。
使えそうな情報の断片を見つけても、3歩進んでは2歩下がり、1つ峠を越えたら絶壁が待っているというような、そんな感じで1つ1つ進めるたびに何かしらに引っかかっちゃって
実装が完了した今となっては、振り返ってみるとやったことは全然大したようなことはなくて、経験ある人からしたらすごく基本的なことだと思うけど、とにかく時間がかかりました。
もしかしたら、同じように自前でサーバー用意してスコアボードやサーバー変数を実装しようとしたけども断念した、という方がいるかもしれません。
安心してください。私が代わりに調べましたので、実装の仕方をお教えします。制限はありますが無料でも可能です。
というわけで、レンタルサーバーを使ってスコアボードを実装する方法を書いていきますが、取り掛かる前に注意点がいくつかあります。


始める前に気を付けること

・ネットワークを介したシステムをゲームに実装したとはいえ、ネットワーク技術に関して私は超ド素人で、ぶっちゃけ必要な知識が全然足りていません。
 ここに書いてあることを、あまり信じすぎないように疑った目で見てください。
 説明する上で「~と思う」「~なようだ」「多分~」のような推測の言葉を多用することになると思います。
 このような言葉が使われている個所について、この記事を書いている人間もよく理解していないと思ってください。必要なら、ご自分で調べることをお勧めします。
 また、もし知識や技術のある方がこの記事を見ていて、何かおかしいところを見つけたら教えていただけると幸いです。

・今回、説明するにあたって、XFREEの無料で使えるレンタルサーバーを例として使っていきますが、無料で使うには制限がいくつかあります。
 その中でも、ゲームを公開する上で特に重要になってくるのが「3か月ごとに契約更新が必要」ということと「SSL暗号化通信に対応していない」という点です。
 もし、長くまじめにゲームデータベース用にサーバー運用するつもりなのであれば、無料レンタルは練習という位置づけにして、ちゃんとSSL暗号化通信に対応したサーバーを有料でレンタルするべきです。
 ニックネームとゲームのスコアをやり取りするくらいならいいと思いますが、もし秘匿性の高い情報をサーバーとやり取りしたい場合は、絶対にSSL暗号化は必要です。

・この記事の最終目標は「ダウンロードプレイでのランキング表示実装」と「Plicyでのランキング表示実装」を目標とします。
 ブラウザ上からのスコアボード要求は、そのサイトに合った設定が必要になるため、Plicyの動作確認しただけで私が力尽きました。

・ゲーム制作ツールは、RPGツクールMVとgodotについて実装例を説明します(多分RPGツクールMZもいけます)。私がよく使ってるツールです。

・リアルタイム性の高い、通信が頻繁に必要なゲームは動作が厳しいと思います。
 そういうゲームを実装したい場合は、それ向きのサービスもあるようですので、そちらを使った方がよいかと思います。

・ゲームアツマールに投稿していたゲームを、ちょこっと一行だけ変えて対応したいという方もいるかもしれませんが、残念ながらそういうわけにはいかず、結構な変更が必要になります。

・RPGツクールを普段使っている方の中には「スクリプトなんて書いたことない。ずっとイベントコマンドだけでやってきた。」という方もいるかもしれませんが
 そういう方にはかなり難易度が高い内容になっているかと思います。それなりの心構えでこれ以降を読み進めてください。
 こちらも、真似すればとりあえずできるよう書いていきたいと思います。

・この記事を読んで作ったゲームが何か問題を起こしても私は責任を負いません。自己責任でお願いします。
 

流れを理解する

この記事では、HTTP_POSTリクエストをサーバーへ送信して、スコアボードを応答する方法でランキング表示を実装していきます。
その流れをざっくりと理解していくと、この先が読みやすくなりますので図解します。
手っ取り早く実装方法だけ見たい方は、ここは読み飛ばして大丈夫です。


上図が、ゲームからスコアを送信してランキングをサーバーから取得する、めちゃくちゃざっくりした流れの概略図です。
この図は本当にざっくりしていて、シンプルなやり取りの間にも実際にはもっとたくさんの通信が発生しています。ちゃんと知りたい方は、ご自分で調べるようお願いします。スコアボードの実装するだけなら、とりあえずこれだけ知っておけば多分大丈夫です。
1つずつ見ていきます。

①:プレイヤーがゲームをプレイ

②:ゲームがHTTPリクエストをサーバーへ送信
 →先述の通り、ここで行うのはPOSTメソッドを使ったリクエストです。
  HTTPでパラメータを送る方法として、POSTメソッドのほかにGETメソッドというのがよく使われるようです。この辺の知識をつけると知見が広がる気がします。
  POSTとかGETとはなんなのかを知りたい方は調べてみると、賢くなった気になれますよ。

③:サーバーがスコアを受信したら、MySQLへデータの保存を指示する。
 →MySQLとは、ネットワーク上でよく使われるデータベース管理システムのことで、エクセルのようなものと思ってもらえればとりあえずよいかと思います。
  SQLという言語で特定のデータを取り出したり、追加するような指示をすることができます。

④:スコア上位100件のレコードを降順でサーバーからMySQLへ要求し、それをゲームへ応答する。

⑤:サーバーから応答されたデータを、ゲーム上でランキングとして表示する。

ゲーム制作者は、②③④⑤を実装する必要があります。
もうすでにわけがわからないよ!という方もいるかもしれませんが、わからなくても真似すればできるよう、何とかやっていきますのでガンバってついてきてくださいね。

準備

それではゲームとサーバーを通信させるために、必要なものをそろえていきましょう。


・サーバーをレンタルする

XFREEに会員登録して、サーバーをレンタルしましょう。
会員登録には、個人情報の入力が必要になりますのでご承知おきください。
レンタルするまでの手順は、ちょっとほかのサイト様に任せるとします。私は、下記に載せてあるサイト様を参考にさせてもらいました。
「2-3. アクセスの確認」まで手順を踏みましたらこちらに戻ってきてください。

てぃってぃの楽しい副業生活! 様
https://kt2525family.com/snsprogramming/


・サーバープログラムを書く

ランキングを実装する前に、一旦ゲームとサーバーが通信可能であることを簡単なサーバープログラムで確認しましょう。
先ほどのサイト様を参考にしてファイルマネージャーを開き、「ranking.php」というファイルを作成してください。
お好みで新しくゲーム名などのフォルダを新しく作って、その中に作成してもいいですよ。
私は、「HTTP_test」というフォルダを作ってその中にranking.phpを作りました。


そしたら、ranking.phpの鉛筆マークをクリックして編集画面を開き、下記のように記述してください。

<?php
	echo "ランキングテスト";
?>
書けたら「上書保存」ボタンを忘れずに押して、編集画面を閉じてください。
これはPHPという言語で、echoはprintみたいなもので、サーバープログラム上では応答するデータを指定できます。
(実際、echoとprintは非常に役割が似通っているようです。正しく知りたい方は調べてみてください。)
そしてお使いのブラウザのURLで「http://ドメイン名/フォルダ名/ranking.php」のように先ほど作ったranking.phpを指定して移動してください。
「ランキングテスト」と表示されたら成功です!
ブラウザがサーバーへHTTPリクエストを出して、サーバーはranking.phpに従って「ランキングテスト」を応答したということです。
だんだんわかってきましたかね?
この「ランキングテスト」という文字列の代わりに、スコアボードを応答すれば、ランキングが実装できるということです。


・ゲームからサーバーへHTTPリクエストする

<RPGツクールMV>

RPGツクールMVでは、HTTPリクエストを送信するためのプラグインを使わせていただきます。下記がプラグイン製作者様のブログになります。
HTTPリクエストするプラグインがダウンロードできますので、保存してRPGツクールへ導入してください。
(私はMVしか持っていないのでMZの動作確認していませんが、多分MZでも使えます。)

パンダコノート 様

導入したら、上記ブログやプラグインヘルプの内容を読んで、プラグインパラメータからタイムアウト時間と、結果格納変数の番号を指定してください。
一般的に、100件のスコアボード取得するくらいなら1秒かかりません。タイムアウト時間は長めに見積もって5~10秒くらいでいいかと思います。
次に適当にNPCを配置してイベントを組み、動作確認します。


イベントコマンドはこんな感じ。話しかけた時に起動するようにします。



変数1:応答データはプラグインパラメータで設定した結果格納変数で、HTTPリクエストする前に一旦0に設定し、0の内は応答がないとしています。
それからHTTPリクエスト先は「http://アカウント名.php.xdomain.jp/HTTP_Test/ranking.php」ですよ!
テストプレイをして、「ランキングテスト」と表示されれば成功です。




<GODOT>

ボタンを押したらHTTPリクエストするようなsceneを作ります。
ノードは、ButtonノードとHTTPRequestノード。


スクリプトはこう。_on_HTTPRequest_request_completedのシグナル接続を忘れないでね。
それからHTTPリクエスト先は「http://ドメイン名/フォルダ名/ranking.php」ですよ!

extends CanvasLayer

func _ready():
	pass 

func _on_Button_button_down():
	var error = $HTTPRequest.request("http://ドメイン名/フォルダ名/ranking.php")
	if error != OK:
		push_error("An error occurred in the HTTP request")

func _on_HTTPRequest_request_completed(result, response_code, headers, body):
	var res = body.get_string_from_utf8()
	print(res)

GODOT公式リファレンスに例文があり、それを参考にしています。

GODOT日本語公式リファレンス HTTPリクエストを行う

「ランキングテスト」と出力されれば成功です。
(確認していませんが、もしかしたらバージョンで違いがあるかもしれない・・・。私のGODOTは3.3.2です。)

・動作確認完了!

以上で動作確認は終了です。できましたか?
ちょっと長くなっちゃうのでここでパートを区切ります。
ある程度プログラムの知識がある方なら、ここまで読めばこの先も実装できちゃうかもしれませんし。
次回はMySQLにデータを挿入してみて、それらを取得しようと思います。
 


コメント