ヒットアンドブロー

My Hit And Blow(一人用4桁数当てゲーム)


チュートリアル作成日

2020年9月1日

ゲームのルール

プレイヤーはある4桁の数字を、ヒントを元に推理して当てる。

4桁の数字はそれぞれバラバラで重複がなく、またその4つの合計がいくらなのか情報が与えられる。

プレイヤーが4桁の数値を回答すると、数字とその位置が合っていればヒット、数字は合っているが位置が違う場合はブローとなり、たとえば1ヒット1ブロー、0ヒット3ブローのように情報が与えられる。

プレイヤーは6回以内に、4ヒットを目指す。

 

制作環境

Unity 2019.4.6f1

C#

 

完成予想図

Unityでゲームを作るときは完成予想図を描く。

紙の完成予想図を実際にタッチして、ボタンの位置など操作性が悪くないか確認する。

 

遊び方

答えのヒントとなる情報が上に表示される。

数字の上下にある△ボタンを押して数字を上下させる。

Enterボタンで決定。数字が合ってるか判定が行われる。結果は、上に1Hit 0Blowなどと表示される。

 

 


プロジェクトの新規作成

2D。

名前、保存場所はご自由に。

 

Androidにスイッチプラットフォーム

<File>--<Build Settings>をクリック。

AndroidにPlatformを切り替える。

下記画像参照。

赤丸のAndroidを選択して、矢印の先の<Switch Platform>を押す。

1分くらいして処理が完了したら、右上のXボタンを押して、<Build Setting>画面を閉じる。

 

次に、Unityの<Game>ビューで、サイズを16:9 Portraitにする。

Sceneの名前も、SampleSceneからGameに変える。

<Project>--<Scene>フォルダの中の、<SampleScene>を右クリック。<Rename>を選択して、<Game>にする。ポップアップが出てくるので、<Reload>をクリック。

 

画像とフォントの入手

ゲームで使用する画像とフォントをインターネットから入手する。

0~9の数字の画像をネットで入手(あるいは自作)

https://opengameart.org/content/numbers-blocks-set-01

フォントをGoogle Fontsから入手(日本語が使えるもの)

https://fonts.google.com/?subset=japanese

 

 

制作開始

<Project>ビューの<Assets>フォルダ以下に、<Images><Prefabs><Scripts>の3フォルダを追加する。

カーソルを<Assets>の上に置き、右クリックして、<Folder>を選択。その後、名前を変更。

 

Main Cameraの設定

<Hierarchy>--<Main Camera>を選択し、<Inspector>ビューにていくつか変更を加える。

<Transform>--<Position>はそのままでよい。

<Clear Flags>を<Solid Color>に。

<Background>--緑色(好きな色でよい)

<Projection>を<Orthographic>に。

<Size>--5。

 

用意した画像とフォントをUnityに入れる。

 

0~9の画像のうち、64x64サイズのものを自分のフォルダ(ピクチャ等)から、<Image>フォルダにドラッグアンドドロップ。

<Project>ビューにて、画像をShiftを押しながらすべて選択する。

<Inspector>にて、

<Texture Type>--Sprite(2D and UI)

<Sprite Mode>--Single

<Pixel Per Unit>--64

下の<Apply>ボタンをクリック。

 

フォントは<Assets>直下にドラッグアンドドロップしておく。

 


Numberオブジェクトの作成

数字と上下の▲をセットとしたNumberオブジェクトを作成していく。

このオブジェクトは、プレイヤーの▲ボタンへのタップを受け付け、数字を上下して表示する。

 

<Image>フォルダから0の画像を<Scene>にドラッグアンドドロップ。

<Transform>--<Reset>して<Position>を(0,0,0)にする。

オブジェクトの名前を<Number0>に変更。

 

<Project>-<Images>フォルダ内で右クリック、<Create>--<Sprites>--<Triangle>を作成。

Triangleを<Scene>ビューへもっていき、<Position>を<Number0>の少し上の(0,0.8,0)に。

ScaleをX=0.7、Y=0.7に。

名前を<UpTriangle>に。

<Inspector>--<Add Component>で<Physics2D>--<Box Collider 2D>を設定。

<Box Collider 2D>--<Size>を、X=1、Y=1.4に。

(タップできる範囲を広めにとって、操作性を高めるため)

<Box Collider 2D>--<Is Trigger>にチェックマーク。

 

 

<UpTriangle>を<Number0>の子オブジェクトにする。

<UpTriangle>をドラッグして<Number0>の上でドロップ。子オブジェクトにする。

<UpTriangle>を複製し(Ctrl + D)、名前を<DownTriangle>に。

<DownTriangle>の<Transform>--<Position>を(0,-0.8,0)に。

<Sprite Renderer>--<Flip>のYにチェックし、図形を逆さにする。

 

↑こんな感じ。

 

スクリプトを書く。

<Project>--<Scripts>フォルダ内で右クリック、<Create>--<C# Scripts>

名前を<Numbers>に。

(ここで別の名前でC#スクリプトを作ってしまうと、あとでエラーが出ます。失敗したら、作ったスクリプトを削除して、また作ってください)

 

<Numbers>スクリプトを、<Hierarchy>--<Number0>にドラッグアンドドロップしてアタッチ。

<Numbers>スクリプトをダブルクリックして、Visual Studioを立ち上げる。

 

このスクリプトでやりたいことは、

1.上向き△を押したら、数字がひとつ増える

2.下向き▽を押したら、数字がひとつ減る。

したがって、「数字」情報を持っている必要がある。情報は<int>と、それを表示する画像<Sprite>。<Sprite>のほうは10種類の数字画像を入れるので、配列で宣言しておく。

 

public class Numbers : MonoBehaviour

{

    public int Value;

    public Sprite[] NumberCard;

 

(以下省略)

------------

int Valueのほうprivateでも構わないが、Sprite[] NumberCardのほうはpublic。次の手順で、UnityにてSprite配列に画像を入れてやるためである。

 

Ctrl+Sで保存して、Unityに戻る。

 

<Hierarchy>--<Number0>を選択し、<Inspector>--<Numbers(Script)>--<Number Card>に数字の画像を順番通りにセットする。

<Size>を10にすると<Element0~9>が作られるので、その空白にそれぞれの画像をドラッグアンドドロップ。あるいは、<Project>ビューにて0~9の画像をShiftですべて選択しておいて、<Number Card>という文字の上にすべてをドラッグアンドドロップ。

<Inspector>のカギマークをクリックするとやりやすい。

作業後はカギマークをクリックして、ロックを外す。

 

Visual Studioに戻る。

初期状態は、0にしたいので、Start関数に、以下のように記述。

 

void Start()

    {

        Value = 0;

        GetComponent<SpriteRenderer>().sprite = NumberCard[0];

    }

----------------

int Valueに0を代入。

GetComponent<SpriteRendere>().で、<Number0>オブジェクトの<SpriteRendere>コンポーネントを指定している。これはUnityの<Inspector>ビューで表示されているものと同じである。

 

上向き△を押したときの関数を作る。(名前はPlusOneにしておいた)

タッチすると0から1ずつ増えて9になり、9のときボタンを押したら0に戻るようにしたい。

(publicな関数にしておく)

 

public void PlusOne()

    {

        Value++;

        if (Value>9)

        {

            Value = 0;

        }

        GetComponent<SpriteRenderer>().sprite = NumberCard[Value];

    }

---------------------

まったく同じように、下向き▽を押したときのMinusOne関数を記述。

ボタンを押すと1ずつ減り、0のときボタンを押すと9になる。

 

public void MinusOne()

    {

        Value--;

        if (Value < 0)

        {

            Value = 9;

        }

        GetComponent<SpriteRenderer>().sprite = NumberCard[Value];

    }

------------------

 

Unityに戻る。

 

<Event Trigger>を使いたいので、いくつか設定が必要。

<Event Trigger>を使うときは、

1.<Main Camera>に<Physics 2D Raycaster>をつけること、

2.<Hierarchy>に<EventSystem>をつけること

の2点が必要である。EventSystemは、Canvasをつければ自動でつく。

 

まず<Main Camera>を選択し、<Inspector>--<Add Component>--<Event>--<Physics 2D Raycaster>を選択。

 

次に<Hierarchy>の下矢印をクリックして、<UI>--<Canvas>を作成し、以下のように<Inspector>で設定。

<Canvas>--<Render Mode>を、<Screen Space - Camera>に。

<Render Camera>のところに、<Hierarchy>の<Main Camera>をドラッグアンドドロップ。

<Plane Distance>--5に。(下の画像では100のままになっている)

<Canvas Scaler>--<UI Scale Mode>を<Scale With Screen>に。

<Reference Resolution>をX720、Y1280に。

<Screen Match Mode>を<Expand>に。

 

Event Triggerコンポーネントを作る。

次に<Hierarchy>--<UpTriangle>を選択し、<Add Component>--<Event>--<Event Trigger>をつける。

<Event Trigger>の<Add New Event Type>ボタンを押し、<Pointer Click>をクリック。

<Pointer Click>のプラスマークボタンを押し、以下の画像のように設定。

<Number0>をドラッグアンドドロップ、<Numbers>スクリプトの<PlusOne>関数を選択。

 

 

ここで、テストプレイ。

プレイボタンを押し、<Game>ビューの中で上向き△をクリックしてみると……!

 

うまく動きます。

テストプレイ中に、<Hierarchy>--<Number0>を選択し、<Inspector>--<Numbers(Script)>を見ると、Valueも同時に動いています。

 

うまくいきましたか?

 

うまくいかない場合、以下を確認。

・<UpTriangle>オブジェクトに<Box Collider 2D>がついているか。

・PlusOne関数がpublicになっているか。

・Main Cameraに<Physics 2D Raycaster>がついているか。

・<Hierarchy>内に、<EventSystem>があるか。

 

 

<UpTriangle>とおなじく、<DownTriangle>にも<Event Trigger>をつけ、今度は<MinusOne>関数を設定。

 

このあたりでとりあえず<Number0>オブジェクトは完成。

 

 

<Number0>をプレハブにする。

<Hierarchy>--<Number0>オブジェクトを、<Project>--<Prefabs>にドラッグアンドドロップしてプレハブにしておく。

 

Numberオブジェクトをプレハブを基に4つ作る。

<Hierarchy>--<Number0>を選択し、<Inspector>にて<Position>を(-1.5,0,0)に。

 

<Project>--<Prefabs>から<Number0>プレハブを<Scene>ビューにドラッグアンドドロップして、名前を<Number1>に。<Position>を(-0.5,0,0)に

 

同じ要領で、<Number2>、<Number3>をつくり、<Position>を(0.5,0,0)、(1.5,0,0)に。

すると、4つ並びます。

ここで保存して、テストプレイしてみると……!

 

うまく動きます。

 


Enterボタンの作成

Enterボタンは、プレイヤーのタップを受け付け、プレイヤーの回答が正解かどうか判定する関数を実行する。

 

 

<Hierarchy>--<Canvas>を右クリックし、<UI>--<Button>を作成。

名前を<EnterButton>に。

<Rect Transform>にて、PosX=0、PosY=-300に。Width=200、Height=100に。

<Button>コンポーネントの<Pressed Color>を黄色に。

<Hierarchy>--<EnterButton>の子オブジェクトになっている<Text>を選択し、<Text>コンポーネントの<Text>を「Enter」に。

<Font>に、ダウンロードしたフォントをドラッグアンドドロップ。

 

<Font Size>をちょうど良い感じに調整。


GameManagerオブジェクトを作成する

 

GameManagerオブジェクトを作成する。 

GameManagerオブジェクトは、ゲーム開始時に問題となる4桁の数字を作成し、プレイヤーがEnterボタンを押したときに回答が正解かどうか判定する。 

 

<Hierarchy>にて右クリック、<Create Empty>を作成。

 

名前を<GameManager>としておく。<Position>はどこでもいいが、とりあえず<Reset>しておく。

 

スクリプトを記述。

<Project>--<Scripts>にて、<Create>--<C# Script>、名前を<QandA>にしておく。

<QandA>スクリプトを<GameManager>オブジェクトにアタッチ(ドラッグアンドドロップ)。

 

このスクリプトでやることは、

1、4桁の問題の作成

2、Enterボタンを押したときの判定

主にこの二つ。

 

<QandA>をダブルクリックしてVisual Studioを開く。

 

問題作成の考え方。

0~9の数字をListにしておき、それをシャッフル。

シャッフルされたものを、問題配列(4桁)に入れる。

なので、Listと配列を定義。

 

public class QandA : MonoBehaviour

{

    private List<int> NumberList = new List<int>();

    public int[] QuestionArray = new int[4];

--------------------------

 

次に、このNumberListに0~9の数字を入れるCreateNumbers関数を作る。

 

void CreateNumbers()

    {

        for (int i = 0; i < 10; i++)

        {

            NumberList.Add(i);

        }

    }

--------------

 

これで、NumberListには0~9の数字が入る。

これをシャッフルするShuffle関数を作る。

 

 void Shuffle()

    {

        for (int i = 0; i < 10; i++)

        {

            int r = Random.Range(0, 10);

            int temp = NumberList[r];

            NumberList[r] = NumberList[i];

            NumberList[i] = temp;

        }

    }

----------------------

 

このアルゴリズムでは、NumberListの0から9番目のどれかの数字と、i番目の数字を入れ替えている。

 

次に、シャッフルしたNumberListの数字をQuestionArrayに入れるMakeQuestion関数を作る。

 

void MakeQuestion()

    {

        for (int i = 0; i < 4; i++)

        {

            QuestionArray[i] = NumberList[i];

        }

    }

-----------

 

ここでは単純に、NumberListの0番目をQuestionArrayの0番目、1番目を1番目、として4つの数字をQuestionArrayに入れている。

そして、これらの関数をStart関数からつながるように、以下のように記述する。

 

void Start()

    {

        CreateNumbers();

    }

 

    void CreateNumbers()

    {

        for (int i = 0; i < 10; i++)

        {

            NumberList.Add(i);

        }

        Shuffle();

    }

 

    void Shuffle()

    {

        for (int i = 0; i < 10; i++)

        {

            int r = Random.Range(0, 10);

            int temp = NumberList[r];

            NumberList[r] = NumberList[i];

            NumberList[i] = temp;

        }

        MakeQuestion();

    }

 

    void MakeQuestion()

    {

        for (int i = 0; i < 4; i++)

        {

            QuestionArray[i] = NumberList[i];

        }

    }

-------------

 


PushEnter関数の作成

Enterボタンを押したときのスクリプトを記述する。

プレイヤーの回答が問題の数字とあっているか否か判定する。

 

考え方としては、先に作った4つの<Number0~3>オブジェクトのValueと、上記QuestionArrayの中身とを比べてやればよい。

そこでまず、<Number0~3>を<QandA>スクリプトで呼び出せるように準備するとともに、プレイヤーの回答を入れる配列を作る。さらに、ヒットとブローの数を数えるため、それも定義する。

 

public class QandA : MonoBehaviour

{

    private List<int> NumberList = new List<int>();

    public int[] QuestionArray = new int[4];

    //

    public Numbers[] numbersCS;

    public int[] AnswerArray=new int[4];

    private int Hit;

    private int Blow;

--------------------

//以下の4行が追記した部分である。Numbers[] numberCSはpublicで作る。あとで、unityで<Number0~3>オブジェクトを関連付ける。なお、CSとはCSharpの意味でつけた。

QuestionArrayとAnswerArrayはprivateで構わないのだが、テストプレイの時に答えが<Inspector>ビューに表示されて便利なので、publicにしてある。

 

Enterボタンを押したときのPushEnter関数を作る。publicにすること。

まずは、<Number0~3>のValueをAnswerArray配列に入れる。

次にAnswerArrayとQuestionArrayを比べて、数字が合っていて、かつ位置もあっているならHitを加算し、数字が合っているだけならBlowを加算する。その前にHitとBlowを0にする。

 

public void PushEnter()

    {

        for (int i = 0; i < 4; i++)

        {

            AnswerArray[i] = numbersCS[i].Value;

        }

        //

        Hit = 0;

        Blow = 0;

        //

        for (int i = 0; i < 4; i++)

        {

            for (int j = 0; j < 4; j++)

            {

    //Answerのほうをi、Questionのほうをjとした。

                if (AnswerArray[i]==QuestionArray[j])

                {

                    if (i==j)

                    {

                        Hit++;

                    }

                    else

                    {

                        Blow++;

                    }

                }

            }

        }

 

    }

 

-------------------

ここのスクリプトはfor~forの二重ループで複雑だが、考え方としては地道で、<Number0>のValueをQuestionArrayの0番目と比べ、1番目と比べ、2番目、3番目と比べ、合っていればHitかBlowを加算し、次に<Number1>のValueをQuestionArrayと比較していっている。

注意することは、二つ目のforループはiではなく、jとすることである。

 

 

このあたりでスクリプトにエラーが出るとしたら、たとえばNumbersスクリプトのValueがpublicになっていないとか、if文の中が==となっていないとか、が考えられる。

 

Unityに戻る。

<Hierarchy>--<GameManager>を選択し、<Inspector>ビューのカギマークをクリックしておいて、<QandA(Script)>の<NumbersCS>のところに、<Number0~3>オブジェクトをドラッグアンドドロップ。Element0には<Number0>、Element1には<Number1>と順番通りに入れること。

作業後は、カギマークをクリックしてロックを外す。

 

 


Textオブジェクトの作成

1.4つの合計がいくらかわかるTextオブジェクト

2.HitとBlowの数がわかるTextオブジェクト

3.残り回答数がわかるTextオブジェクト

を、用意する。

 

<Hierarchy>--<Canvas>を右クリック、<UI>--<Text>を選択。

できたTextオブジェクトの名前を<TotalText>として、ゲーム画面の上のほうに設置。

その他、<Font>に入手したフォントを入れ、<Font Size>を調整し、<Alignment>をそれぞれ真ん中に、<Horizontal Overflow><Vertical Overflow>をOverflowにしておく。

この要領で、HitとBlowがわかる<HitText>、のこり回答数がわかる<RemainsText>を作る。

下の画像のようになっていればよい。

 

Enterボタンオブジェクトに先ほど作ったPushEnter関数を関連付ける。

<Hierarchy>--<EnterButton>を選択し、<Inspector>--<Button>コンポーネントの<On Click()>の+マークを押し、<GameManager>オブジェクトをくっつけて、<QandA>の<PushEnter>関数を関連付ける。

 

 

Visual Studioの<QandA>スクリプトに戻る。

まず、先ほど作った3つのTextオブジェクトを定義する。それから、4つの合計値を示すintの定義、また残り回答可能数を示すintを定義する。

 

using UnityEngine;

using UnityEngine.UI;

 

public class QandA : MonoBehaviour

{

    private List<int> NumberList = new List<int>();

    public int[] QuestionArray = new int[4];

    //

    public Numbers[] numbersCS;

    public int[] AnswerArray=new int[4];

    private int Hit;

    private int Blow;

    //

    public Text TotalText;

    public Text HitText;

    public Text RemainsText;

    private int total;

    private int remains;

-----------------

おわりの5行と、冒頭の2行目を追記した。

Text型を使うためには、冒頭にusing UnityEngine.UI;と記述する必要がある。

なお、Textは、あとでUnityで関連付けを行うため、publicにしている。

 

4つの合計を算出し、ゲーム画面に表示させるスクリプトを記述する。場所はMakeQuestion関数の中にした。

 

 void MakeQuestion()

    {

        for (int i = 0; i < 4; i++)

        {

            QuestionArray[i] = NumberList[i];

        }

        //

        for (int i = 0; i < 4; i++)

        {

            total += QuestionArray[i];

        }

        TotalText.text = "4つの合計は" + total.ToString();

    }

--------------

//以下が追記した部分である。

QuestionArrayに入っている問題の数字をtotalに加算し、その結果をTotalTextに表示させている。intやfloatなどの数字をTextに表示するときは、その後ろに.ToString()をつける。

 

次に、HitとBlowの数を表示する。そのスクリプトは、PushEnter関数に追加すればよい。

 

HitText.text = Hit.ToString() + "Hit! " + Blow.ToString() + "Blow";

-------------------

最後に、のこり回答可能数を表示するスクリプトである。これはEnterボタンを押したときに数を減らせばよいので、これもPushEnter関数の中に記述するのだが、その前提として、プレイヤーの入力値が不正解である必要がある。そこで、以下のようなスクリプトを考える。

 

if (Hit==4)

        {

            //正解したときの演出

        }

        else

        {

            remains--;

            RemainsText.text = "のこり "+remains.ToString()+"回";

        }

----------------

PushEnter関数は全体として以下のようになっている。

 

public void PushEnter()

    {

        for (int i = 0; i < 4; i++)

        {

            AnswerArray[i] = numbersCS[i].Value;

        }

        //

        Hit = 0;

        Blow = 0;

        //

        for (int i = 0; i < 4; i++)

        {

            for (int j = 0; j < 4; j++)

            {

                if (AnswerArray[i]==QuestionArray[j])

                {

                    if (i==j)

                    {

                        Hit++;

                    }

                    else

                    {

                        Blow++;

                    }

                }

            }

        }

      

        //

        HitText.text = Hit.ToString() + "Hit! " + Blow.ToString() + "Blow";

        //

        if (Hit==4)

        {

            //正解したときの演出

        }

        else

        {

            remains--;

            RemainsText.text = "のこり "+remains.ToString()+"回";

        }

    }

-----------------------------

さらに、remainsをはじめは6としておきたいので、Start関数にそのように記述する。あわせて、ゲーム開始時にHitとBlowのTextも表示する。(HitとBlowはなにも代入していないが、初期値で0になっている)

 

void Start()

    {

        remains = 6;

        HitText.text = Hit.ToString() + "Hit! " + Blow.ToString() + "Blow";

        RemainsText.text = "のこり " + remains.ToString() + "回";

        CreateNumbers();

    }

----------------

 

ここでUnityに戻って、各Textオブジェクトを<QandA(Script)>に関連付ける。

 

 

テストプレイしてみる。

うまく動くだろうか?

 

ここで、うまく動かないとすると、Start関数が間違っているか、オブジェクトをスクリプトに関連付けるのを忘れているか、そのあたりと思われる。

 

 

さて、うまく動いたとしても、いまのままでは、正解しても4Hit!と出るだけだし、どんなに間違えても、のこり回答数がマイナスの数値になっていくだけだ。

そこで、正解したときと、6回間違えてゲームオーバーになったときの処理を考える必要がある。

 

クリア判定とゲームオーバー判定

プレイヤーが正解したら、「正解!」と表示されるようにしたい。

 

<Hierarchy>--<Canvas>で右クリック、<UI>--<Panel>をクリック。

<Panel>の<Inspector>--<Rect Transform>のStretchとなっている図をクリック。

<Anchor Presets>のポップアップが出るので、真ん中をクリックして、Enterキーを押す。

 

<Rect Transform>--<Height>を500にする。

<Image>--<Color>で透明度(A)を200に。

 

 

次に、<Hierarchy>--<Panel>で右クリックし、<UI>--<Text>を作成。

これで<Text>が<Panel>の子オブジェクトになる。名前を<EndingText>としておく。

 

<Text>コンポーネントの<Font><Font Size><Alignment><Horizontal Overflow><Vertical Overflow><Color>などを変更する。以下の画像を参考に。

 

Visual Studioに戻る。

<QandA>スクリプトに、今作った<Panel>と<EndingText>を操作できるように定義づけ。

また、クリアしたときもゲームオーバーになったときもEnterボタンを押せないようにしたいので、準備としてbool型のIsOverを定義。

 

public class QandA : MonoBehaviour

{

    private List<int> NumberList = new List<int>();

    public int[] QuestionArray = new int[4];

    //

    public Numbers[] numbersCS;

    public int[] AnswerArray=new int[4];

    private int Hit;

    private int Blow;

    //

    public Text TotalText;

    public Text HitText;

    public Text RemainsText;

    private int total;

    private int remains;

    //

    public GameObject Panel;

 public Text EndingText;

 private bool IsOver;

---------------

最後の3行を追記した。

はじめから<Panel>が表示されているとゲーム画面が見えないので、Start関数にて、<Panel>オブジェクトに休んでおいてもらう命令を記述。

 

void Start()

    {

        remains = 6;

        HitText.text = Hit.ToString() + "Hit! " + Blow.ToString() + "Blow";

        RemainsText.text = "のこり " + remains.ToString() + "回";

        //

        Panel.SetActive(false);

        //

        CreateNumbers();

    }

------------

Panel.SetActive(false);としておけば、<Panel>は表示されない。

 

クリアかゲームオーバーとなったときはEnterボタンを押せないようにしたいので、PushEnter関数の冒頭に以下を追記。

 

 public void PushEnter()

    {

        if (IsOver)

        {

            return;

        }

----------------

 

PushEnter関数内に、以下のように追記。

 

if (Hit==4)

        {

            //正解したときの演出

            Panel.SetActive(true);

            EndingText.text = "正解!";

            EndingText.color = new Color(0, 0, 1);

            //

            IsOver = true;

        }

        else

        {

            remains--;

            RemainsText.text = "のこり "+remains.ToString()+"回";

            if (remains==0)

            {

                Panel.SetActive(true);

                EndingText.text = "残念!";

                EndingText.color = new Color(1, 0, 0);

                //

                IsOver = true;

            }

        }

-------------

クリアしたときの処理

クリアしたときに、<Panel>を有効にして、その子オブジェクトである<EndingText>の文章と色を指定。色(0,0,1)は青。

最後にIsOverをtrueにする。

 

ゲームオーバーの処理

間違えるたびにremainsが減っていき、それが0になったときゲームオーバーなので、クリアしたときと同様に記述。(1,0,0)は赤。

 

 

ここでUnityに戻って、<QandA(Script)>に<Panel>と<EndingText>を関連付ける。

 

うまくいくか、テストプレイ。

 

 

さて、今の状態だと、正解するか6回間違えるとゲームが終わってしまうので、正解したら次の問題にうつり、また、ゲームオーバーになったら初めからやり直せるようNewGameボタンを設置する。

 

 

正解すると次の問題に移る

<QandA>スクリプトに、次の問題につなげるNextQuestion関数を作る。

 

void NextQuestion()

    {

    total = 0;

        //

        remains = 6;

        RemainsText.text = "のこり " + remains.ToString() + "回";

        //

        Hit = 0;

        Blow = 0;

        HitText.text = Hit.ToString() + "Hit! " + Blow.ToString() + "Blow";

        //

        Panel.SetActive(false);

        IsOver = false;

        //

        Shuffle();

    }

--------------

total、remains、Hit、Blowなどをリセットし、そのテキストを表示。

また、<Panel>を休ませ、IsOverをfalseにしてEnterボタンを押せるようにしておく。

そして、Shuffle関数につなぐ。

 

このNextQuestion関数を、正解したあと3秒後に動くようにしたいので、PushEnter関数の正解処理のところに以下のように追記。

 

if (Hit==4)

        {

            //正解したときの演出

            Panel.SetActive(true);

            EndingText.text = "正解!";

            EndingText.color = new Color(0, 0, 1);

            //

            IsOver = true;

            //

            Invoke("NextQuestion", 3f);

        }

-----------

クリア処理の末尾に、1行追記した。これで3秒後にNextQuestion関数が動きだす。Invokeは特殊な書き方をするので間違えないように注意。

もし5秒後にしたい場合は、3fを5fにすればよい。

 

 

Unityに戻って、テストプレイ。

 

クリアすると次の問題に移るが、4つの数字が0にリセットされず、前の状態のままである。

これを直す。

 

次の問題に移ったときに、<Number>を0にする処理

<Numbers>スクリプト(<QandA>ではない)に、ResetNumber関数を作る。内容はStart関数と同じ。

 

public void ResetNumber()

    {

        Value = 0;

        GetComponent<SpriteRenderer>().sprite = NumberCard[Value];

 

    }

------------------

publicな関数にしておくこと。

 

<QandA>スクリプトのNextQuestion関数に以下を追記。

 

//

        foreach (var item in numbersCS)

        {

            item.ResetNumber();

        }

 

        //

        Shuffle();

----------------

Shuffle()につなげる前に、foreachでnumberCSそれぞれのResetNumber関数を実行。

 

NewGameボタンの設置

NewGameボタンの処理

<QandA>スクリプトの冒頭に以下を追記。

 

using UnityEngine.SceneManagement;

--------------

 

次に、NewGame関数を記述。Unityで関連付けを行うので、publicな関数。

 

 public void NewGame()

    {

        SceneManager.LoadScene("Game");

    }

-----------------

NewGame関数を実行すると、ゲームがすべてはじめからスタートとなる。

 

Unityに戻る。

 

NewGameボタンの設置と、NewGame関数の関連付けをする。

方法はEnterボタンと同じなので、EnterボタンをCtrl+Dで複製して、<Position>や<Text>を変更し、<On Click()>のところにNewGame関数をつけてやればよい。

 

さらに、<File>--<Build Settings>をクリック。

<Add Open Scenes>をクリックし、今作成している<Game>Sceneを追加。これで、先に作ったNewGame関数が動くようになる。

 

 

テストプレイ。

 

これでほぼ完成。

あとは、<Text>のサイズや色を変えたり、ゲームのタイトルを入れてみたり、見た目を工夫してみてください。

 


実機ビルド(for Android)

スマートフォン端末(Android)の「開発者向けオプション」と「USBデバッグの有効化」を設定する。

以下のサイトを参照。

https://developer.android.com/studio/debug/dev-options?hl=ja

 

スマートフォンとPCを、USBケーブルでつなぐ。

 

<File>--<Build Settings>--<Player Settings>をクリック。(左下にあるボタン)

 

<CompanyName><ProductName>を適当に決め、下の画像の<Default Orientation>を<Portrait>にする。これでスマホを傾けてもゲーム画面が回転しない。

 

右上のXボタンで<Project Settings>を閉じる。

 

<Build Settings>--<Build And Run>をクリック。

 

ファイル名の設定を求められるので、TestSampleなどとしておく。

 

ビルド処理が始まる。2~3分で終了する。

 

終わったら、右上Xボタンで<Build Settings>を閉じる。

Unityに、ビルドが正常に終了したことを示すメッセージが出ている。

 

USBケーブルを抜いて、スマートフォンでテストプレイしてみる。

 

 

これで、あなたオリジナルのゲームの完成です!

 

より面白くするために。

このゲームをもっと楽しいものにするために、たとえば

・効果音を入れる

・正解したときの演出をもっと派手なものにする

・正解した問題数がカウントされる

などなど、いろいろ試してみましょう。

 

 

それでは!

Feel free to share and comment!

ホームへ戻る。


コメントをお書きください

コメント: 4
  • #1

    moi (日曜日, 21 3月 2021 23:04)

    先日、こちらのヒットアンドブローを完成させました!
    とても勉強になりましたし、難易度も初心者の自分にとってちょうどよかったです。
    次のゲームの製作にもチャレンジします!
    ありがとうございました!

  • #2

    Renoboy (月曜日, 22 3月 2021 08:14)

    お疲れ様でした!
    おめでとうございます!
    どんどん作ってみてください!

  • #3

    おもち (木曜日, 13 7月 2023 16:12)

    こちらの解説通り進めて無事ゲームを完成させることができました!
    初めてunityを触るので右も左もわからない状態だったのですが、解説がわかりやすかったので躓かずに最後まですらすら進められました。

    丁寧な解説ありがとうございました!
    他のものも参考にさせていただきます。

  • #4

    Renoboy (金曜日, 14 7月 2023 15:08)

    おもちさん、お疲れさまでした!
    その調子でいろいろ作ってみてくださいね!

 

 

Profile

string name = "Renoboy";

string message = "《Unity,C#》に詳しくない私による、詳しくない人のためのチュートリアルです。詳しくないので、難しいことは決して教えません。";

 

Appale-Takemuroid