【Unity(C#)】NCMBからクイズの正答率を取得&表示する(v1.07)【SAP】

Unity

こんにちは、ばいおです。

今回は、SAPクイズゲームの改修報告(v1.07)の記事になります。
v1.07では、タイトル画面でNCMB(ニフティクラウド mobile backend)から取得したクイズの正答率を表示するようにしましたので、その実装方法について主に記載します。

記事執筆当時のゲームはこんな感じです(動画です)。

ゲームは以下リンク先よりプレイできます。是非やってみてください!
https://unityroom.com/games/sapquiz

実際にゲームやってみての感想や改善点などがありましたら、ゲームリンク先のUnityroomにコメントを残せるので、是非コメントしてください!泣いて喜びます!
(ランキング機能も実装しているので、是非登録してくださいまし!)

また、クイズゲーム制作についての記事は↓にまとめていますので、あわせてご参照ください!

v1.07で追加した機能

正答率表示機能

冒頭に記載したとおり、タイトル画面に新しくクイズの平均正答率を表示するようにしました。

正答率を表示するためには、まず正解数をデータベースに保持しなくてはいけないので、10問答えた段階でNCMB(ニフティクラウド mobile backend)にデータを送信するようにしました。

こちらの「tama-lab」さまの記事を参考にしています。

【Unity】NCMBを使ってサーバにデータを保存、取得する方法 | tama-lab
Unity1Weekというゲームジャムで、以下の動画のような「敵に見つからないように壁に文章を書き残す」「書き残した文章は他のプレイヤーの画面に表示される」というシステムのゲームを作成しました。

クイズ結果を表示するシーンに遷移した時に、自動でNCMBに正答数を送信するようにしています。データベースはこんな感じになっています。

これで、正答数はNCMB上に保持できるようになりました。

後は、ここからデータを引っ張ってくるだけ、、だったのですがこれがなかなか上手く行かず、平均正答率が0%になってしまうという状況になってしまいました。

原因は、恐らくNCMBからデータを取得する前に、画面出力するテキストへデータ取得結果を反映させてしまっていたからだと思います。

この問題を解決するためには、何やら「非同期処理」なるものを理解しなくてはいけない模様。ここで完全にハマりました、非同期処理ムズカシイ、、、

「コルーチン」なるものを使用すればできそうなのですが結局ちゃんと理解できず、とりあえず2秒待つというパワープレイで当座は凌ぐことにしました。

ちなみに2秒待つ処理は、「yield return new WaitForSeconds (秒数);」というコードにより実装しています。

次の改修タイミングまでに非同期処理についての理解を深め、今度は「データが取得できたらそのデータをテキスト表示する」というロジックを実装したいです。

該当部分のソースコードは、ちゃんと上記ロジックが実装できたら公開しようと思います。

ツイート機能&ブログリンク機能

ツイート機能については、こちらのQiita記事を参考にしました。

【Unity】Twitterボタン設置とツイートの報酬付与 - Qiita
UnityにTwitterボタン設置して、ボタンを押してくれたユーザに報酬をプレゼントします。 ■Twitterボタンの入手 自作するとレギュレーションが面倒なので、特にこだわりのない場合はTwitterの公式からボタン画像をダウン...

この記事にあるソースをそのまま使用してしまうと、UnityroomからTwitterのページに遷移してしまうので、別ウィンドウで開かれるように少し手を加えました。

これでクイズゲームの結果を簡単にツイートできるようになりました!

まあ、ツイートしてるの私以外誰もいないんですけどね(涙)

ブログリンク機能については、こちらの「ゲタバコ倶楽部」さまの記事を参照しました。
とてもわかりやすいです。

UnityでURLを開く | ゲタバコ倶楽部 (げたばこくらぶ)

画面構成とか考え直さないといけないですが、クイズに関連するブログ記事へリンクできれば、もっと勉強になるクイズにできそうな気がします。

実際に書いたソースコードはこんな感じ。

//ブログリンク機能
public void buttonpushb()    
    {
        Application.ExternalEval(string.Format("window.open('{0}','_blank')", "https://yobaioi.com/"));
    }
//ツイート機能
public void buttonpusht()    
    {
        int getpoint = resultmanager.getscore();
        bool quizflag = inputquestion.inputflagget();
        if(quizflag == true)
        {
            string tweet = "SAPクイズ(入力式)の結果、10問中" + getpoint.ToString() + "問正解でした!\nhttps://unityroom.com/games/sapquiz \n#SAPクイズ";
            Application.ExternalEval(string.Format("window.open('{0}','_blank')", "http://twitter.com/intent/tweet?text=" + WWW.EscapeURL(tweet)));                    
        }         
        else
        {
            string tweet = "SAPクイズ(4択式)の結果、10問中" + getpoint.ToString() + "問正解でした!\nhttps://unityroom.com/games/sapquiz \n#SAPクイズ";
            Application.ExternalEval(string.Format("window.open('{0}','_blank')", "http://twitter.com/intent/tweet?text=" + WWW.EscapeURL(tweet)));    
        }        
    } 

4択式クイズの結果と入力式クイズの結果とで、条件分岐するようにしています。

おわりに

今回は、SAPクイズゲームの改修報告(v1.07)について記載しました。

今回の改修により、クイズゲームが実際にどのくらい遊ばれているかがわかるようになったので、毎日楽しみにデータベースを見ています。

まだ、クイズ全体の正答率しか表示できていませんが、ゆくゆくは問題ごとの正答率を出したいと思っています。データベースをどのように持つか考えないといけないですね。

クイズゲームの感想・改善点いただければとても嬉しいです!TwitterでもUnityroomコメント欄でもどこでも書いちゃってください!

ここまで読んでいただきありがとうございました。

タイトルとURLをコピーしました