見出し画像

【Unity】1週間ゲームジャム(#Unity1Week)に挑戦!お題「そろえる」で「向日葵合わせ」という神経衰弱ゲームを作った【備忘録】

1.1週間ゲームジャム(#Unity1Week)について

1週間ゲームジャムはフリーゲーム投稿サイト「unityroom」で不定期に開催されているイベントで、提示されたお題にそったゲームを1週間以内にUnityで開発し、投稿、相互評価します。
数年前から存在は知っていましたが、参加するのは今回が初めてです。もっと早く参加しておけばよかった…。
今回は5月2日の月曜日の0:00にお題の「そろえる」が発表され、5月8日の日曜日の20:00までに投稿され、一斉公開されるというスケジュールでした。

2.どんなゲームを作るか考える

お題の「そろえる」が発表されて、1~2時間考えましたが、絵画の画像をランダムに表示して、指定された作者の作品を選択するという、クイズ的なモノを考えました。
にわかですが自分が絵が好きなことと、有名な絵画の多くはパブリックドメインであるため、素材がふんだんにあることが理由です。
話はそれますが、山田五郎さんのYouTubeチャンネルは本当におすすめです。

絵の画像の収集を始めますが、初心者の自分が1からゲームシステムを考えて、期間内に投稿できるのか怪しい…。
今まで投稿した作品も、作り方の説明がネットにあったゲームに、オリジナリティを足すという制作方法をとっています。

「ネットに作り方がある」「そろえるというお題に沿える」の2点を考慮した結果、神経衰弱を作成することにしました。
絵柄には、収拾した絵画の画像も使えそうです。

まず、始めにこの動画をマネして神経衰弱を作成しました。
…しかしコードがかなり複雑で、全く頭に入ってきませんでした。

諦めて他に作り方を上げている人がいないかと探し、以下のページに行きつきました。

3.まずは作り方のとおりに神経衰弱を作る

その8とその9が2つづつあるので、ややこしいですが、上から順番にページを見ながら作っていけば神経衰弱は作れましたが、詰まった点もありましたので、後述していきます。

【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その1
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その2
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その3 ( カード生成のやり方)
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その4 ( カードの複数生成 )
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その5 (カードを選択しよう!)
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その6 (カードの裏面画像と切り替え処理 )
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その7 (カードを2枚選択したら)
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その8 ( カードの裏返し処理を作ろう!)
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その9 ~( DoTweenで綺麗なアニメーション)
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その8 (カードを配るアニメーション実装)
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その9 ( タイマーを作成しよう!)
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その10 (Enumを使ってゲームの進行を管理しよう!)
【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その11 (スタートとリザルト画面を作成しよう!)

4.【改良点】カードが揃っているか判定が終わるまでは、他のカードをめくれないようにする。

先述の神経衰弱の作り方では、2枚カードをめくったときに絵柄が揃っているか判定し、揃っていたら消える、揃っていなかったら裏側に戻す処理が行われますが、その処理が終わる前にも他のカードをめくれるので、どんどんカードをひっくり返して、揃えばラッキーみたいな運ゲーになります。

これを防ぐためにcanCardTurn変数をデフォルト値2で用意し、カードを1枚めくると変数を1減らし、これが0になるとカードをめくれないようにします。揃っているかの判定が終わった後にcanCardTurn変数を2に戻します。

canCartTurn変数は20枚生成されるcardのprefabのコンポーネントであるCard.csではなく、CardCreateManager.csに実装しなければなりません。
Card.csにpublic CardCreateManager cardCreateManagerと入力し、CardCreateManagerをコンポーネントとして持っているGameManagerをcardのprefabにアタッチしようとしたところ、できませんでした。

どうやらprefabで他のオブジェクトを参照するときは、この方法は使えないようです。以下の通りGameObject.FIndで参照するとうまくいきました。

    private CardCreateManager cardCreateManager;

    private void Start() {
        GameObject gameObject = GameObject.Find("GameManager");
        cardCreateManager = gameObject.GetComponent<CardCreateManager>();
      }

これで判定が終わるまでは、カードがめくれないようになったのですが、ゲームをプレイしていると、canCardTurnがずれてしまい、2枚めくってもcanCardTurnが1のときが出てきました。
これは2枚めくって判定する際に、強制的にcanCardTurnを0にすることで解決しました。boolで良かったですね…。

5.【改良点】シーン遷移するときに発生するDoTweenが原因のエラーを修正する。

ゲームが完成し、テストプレイを行っていたところ、1回目のプレイは問題ないのですが、結果発表画面から「タイトルに戻る」を選択し、再度プレイすると、カードをめくった瞬間にエラーが発生しました。
何か参照しなければいけないモノがDestoyされてしまっているのは解ったのですが、解決する自信はありません。
それであれば、「タイトル画面に戻る」がクリックされた時、シーンを再読み込みすればいい。しかしそれもエラー…。
しかし、このエラーは原因が分かりました。

DoTweenが起動した状態のまま、シーン遷移を行うとエラーが出てしまうようです。DoTweenを使用したときは、シーン遷移前にDOTween.Clear(true);
をすることを癖にした方がよさそうです。

6.絵画「ひまわり」紹介モードの追加。

神経衰弱だけだと流石にオリジナリティがないので、絵画鑑賞モードも実装しました。右のサムネイル画像をクリックすることで、gameObject.SetActive(true)と(false)が切り替わって、大きい絵画の画像と紹介文も切り替わる単純なシステムです。

7.全ての解像度に対応!魔法のプラグインを発見!

今回のゲームはPC上で遊ぶこと考えているゲームであるため、アスペクト比の変更や多解像度への対応はあまり考えていなかったのですが、上記のような便利なプラグインを発見したので、入れてみたところ、うまく動きました。

8.オンラインランキングを実装する。

↑クリアタイムが表示される

ゲームクリア時にクリアタイムが表示されるのですが、これをオンラインランキングにすることにしました。
以下の通り、unityroomの管理人naichi氏による解説があります。

    /// <summary>
    /// リザルトステートの設定処理
    /// </summary>
    private void mSetResultState() {

        this.resultStateManager.SetTimerText(mElapsedTime);

        String clearTime1 = mElapsedTime.ToString("f2");//小数点2桁まで
        float clearTime2 = float.Parse(clearTime1);

        // Type == Number の場合
        naichilab.RankingLoader.Instance.SendScoreAndShowRanking(clearTime2);
    }

クリアタイムなので、タイムのランキングとして実装するのだと思いましたが、うまくいきませんでしたので、理由を探していたところ、以下の通り、スコアのランキングとして実装することで、うまく表示されました。

オンラインランキングで表示されるfloat型のclearTime2ですが、小数点以下が画面端まで表示されており、見栄えが悪かったので、小数点以下2桁までの表示に制限したいと思ったのですが、やり方が分からない…。
諦めかけていましたが、Twitterで教えてくれた親切な方がいらっしゃいました。下図のとおり、スクリプトではなく、インスペクター上のCustomFormatに入力することで、表示されました!
(自分の場合は「F2」と入力しました。)

9.「AssetHunterPro」で使っていないデータを、削除する。

ビルド時に、使用してないアセットを解析することができる優れものです。今回のプロジェクトはそれほど使用していないアセットはなかったのですが、フォントと画像を削除することができました。

余談ですが、自分は持っているフリーフォントはプロジェクトにとりあえず全て入れます。フリーフォントを全て一つの.unitypackegeにしています。
AssetHunterProで、使用していないフォントを簡単に解析できるようになったので、色々なフォントを使っても問題なさそうです。

10.無事ゲームジャム期間中にunityroomに納品できました。

よろしければ遊んでください。

GooglePlayにもアップしました。


この記事が気に入ったらサポートをしてみませんか?