2日間でゲームを作ってみて得た教訓

今回、UnityRoomに二日間でゲームを出してみる、という

個人的な挑戦をしてみました😄


出したゲームはこちら↓↓↓ unityroom.com

結果としては、良くも悪くも教訓が得られたかなと感じたので、

今回はその内容をブログにまとめたいと思います。

教訓① バックエンドのランキングに合わせ 要件を変更した

今回作成したゲームには、PlayFabというBaaSを利用しています。

こちらの中にランキングの機能があったので利用したのですが、

最初想定していた使い方が向いていないことが分かりました。


というのも、PlayFabのランキングはログインデータと紐づいているため、

ユーザーのパラメータランキングのような形は向いているのですが、

ハイスコアランキングのような1ゲームごとの結果が

ランキングになるような形式は不得意のようです。*1

f:id:cacapon:20210920140303p:plain


当初の予定では、一ゲームあたりの結果からパラメータランキングを載せようとしたのですが、

それが出来なかったので、「回数を重ねるごとに数字が増えていく成長型のランキング」

といったアイデアにすることにしました。

周りの技術に合わせて当初のイメージを変えるか、

自分のイメージに合わせる為に周りの技術を変えるか


今回はどっちでもできる状態*2でしたが、

どちらでも対応できるようになった方がいいなと、

今回の経験を通じて思いました🙄

教訓② 不慣れなAPI 思った実装が出来ないもどかしさ

サーバーにランキングデータの送受信をする場合、

基本的に非同期による通信が主流かと思います。


私自身も、サーバーにPythonのFlaskを立ち上げて、

自前でランキングを作った経験もあるのですが、

結構めんどくさかった記憶があります💦


それはさておき、PlayFabのAPI中に既にそういった便利な機能があるので、

それを使えば比較的簡単に実装は出来たので、

こういったサービスを提供しているところは凄いと感心したものです😆


ただ、私の知識不足が原因でしょうが、

非同期処理でAPIが引数を取らない形で定義されている時に

引数による処理の変化を実装したいときに同実装して良いか迷ってしまいました。

例えば、今回のゲームの

ちからランキングとかしこさランキングの

現在のランキングの取得は↓のように定義しています。

 public void GetPlayerData(string targetStatisticName)
    {
        //GetLeaderboardAroundPlayerRequestのインスタンスを生成
        var request = new GetLeaderboardAroundPlayerRequest
        {
            StatisticName = targetStatisticName, //ランキング名(統計情報名)
            MaxResultsCount = 1                  //自分を含め前後何件取得するか
        };

        switch (targetStatisticName)
        {
            case "STRranking":
                PlayFabClientAPI.GetLeaderboardAroundPlayer(request, OnGetStrRanking, OnGetLeaderboardAroundPlayerFailure);
                break;
            case "DEXranking":
                PlayFabClientAPI.GetLeaderboardAroundPlayer(request, OnGetDexRanking, OnGetLeaderboardAroundPlayerFailure);
                break;
   ...以下略...
    private void OnGetStrRanking(GetLeaderboardAroundPlayerResult result)
    {
        foreach (var entry in result.Leaderboard)
        {
            RankingsText[1].text = $"Rank:{entry.Position + 1}";
            ParamsText[1].text = $"{entry.StatValue}";
        }
    }
    private void OnGetDexRanking(GetLeaderboardAroundPlayerResult result)
    {
        RankingsText[2].text = "";
        foreach (var entry in result.Leaderboard)
        {
            RankingsText[2].text = $"Rank:{entry.Position + 1}";
            ParamsText[2].text = $"{entry.StatValue}";
        }
    }

成功したときに渡している関数、OnGetStrRankingOnGetDexRanking

の中身はセットするindexが違うだけです。


なぜこうなったかというと、既に定義されているAction型に対して、

新しく引数なり変数を渡す方法が分からなかったためです。

そのせいで、中身がほぼ同じの新しい関数を作るという

方法で無理くりやりたい事を実装しました💦


本当は、引数で渡したりして一つの関数に収めたかったのですが…😥

この辺に関しては、有識者に質問したほうがよかったかもしれません💦

教訓③ とりあえず、自分の完成イメージじゃなくても公開する

今回作成したゲームは、自分の中ではまだまだ改善できる余地は大いにある結果になっています。

少しやってみただけでも、 * 音がない * 絵がない * スマホ操作だと画面が崩れている * 通信エラー時の対応がおろそか

といった、結構ダメダメな部分も残っています。

ですが、UnityRoomで一般公開しました。


元々二日でゲームを作ると決めたので、それに沿った。

というのもあるのですが、

まだ完成しない、完成しない…とやっていたら、

いつまでたっても日の目を見ないと思ったからです。


それだったら、まずは公開して、その後少しずつ直す方がいいかな?

と思ったのです。


未だコメントを頂いていないので、フィードバックは無いのですが、

出していたら、私が感じていない問題点をもしかしたら教えて貰えるかもしれませんし😅

この辺の考えはまちまちだと思いますが、

まずは出してみる、でいいのかなと私は考えています。


今回は以上です、2日間でゲームを作るのは

小さいゲームでもエネルギーを使いますが、

色々な発見があるので、チャレンジする甲斐はあると思います😄


次回の休日も、改めて何かに挑戦しようかなと思います

それではまた

*1:一ゲームごとを別ユーザー扱いにすれば出来なくはないです。
無料分を食いつぶしてしまいそうですが

*2:ニフクラのランキングだと当初の希望に近いランキングが実装しやすいです