Unityーボタンとスコアを連動させるー

##はじめに
Unityに関わらず、ゲームを作成する際にはプレイヤーの移動距離を表示したり、
ボタンを押している間、何らかのアクションを実行したり、
といった処理が必要になると思います。

今回はボタンと連動してスコアが増えたり減ったりする、簡単なアプリの作り方をご紹介します。私自身プログラミング歴6ヶ月、Unity歴3ヶ月なので、私のような初心者の方でも制作できるように、わかりやすく書いたつもりです。

アプリのイメージはこんな感じです。
![1f1a12cc53bded87885022ce75db1a42.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/ce794b40-eac6-2649-f3fe-87cf312c89bf.gif)

###実装要件は以下の通りです
・右のボタンを押すとスコアが増える。
・左のボタンを押すとスコアが減る。
・スコアが２００になったら「クリア」と表示する。
・スコアが０になったら「ゲームオーバー」と表示する。

##目次
1.事前準備
2.StandardAsetts(バーチャルパッド）のダウンロード
3.ボタン(バーチャルパッド）の作成
4.InputManagerの作成
5.GameManagerの作成
6.Canvasの作成
7.GameManagerに各Canvasをアタッチ
8.参考にしたサイト
9.ゲームのご紹介
10.おわりに


##1.事前準備
まずはUnity２Dの新規プロジェクトを立ち上げてください。

次にプラットフォームをIOSに変更してください。
ファイル　→　ビルド設定　→　IOS　→　SwitchPlatform

ゲーム画面のサイズを調整してください　1920*1080 Portrait
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/f3599e57-0dfc-afb6-b540-b6a70869034d.png)

##2.StandardAsetts(バーチャルパッド）のダウンロード
StandardAsettsのダウンロードは非常に簡単に行えます。
1.まずは以下のURLよりアセットストアを開きます。
https://assetstore.unity.com/

2.AssetStoreは英語表示のため、必要に応じて日本語表示に変更してください。
※GoogleChromeをご利用の方は以下が役に立つと思います。
https://support.google.com/chrome/answer/173424?co=GENIE.Platform%3DDesktop&hl=ja

3.検索欄に「StandardAssets」と記載して検索してください。
4.Standard Assets (for Unity 2018.4)を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/a6dfc3f2-071b-e1ee-9838-d2fe26922f49.png)
5.「Open In Unity」を押してください。
すると自動的にパッケージマネージャーが開きます。

6.Standard Assets (for Unity 2018.4)を選択し、右下の「ダウンロード」を押してください。
ダウンロードが完了すると「ダウンロード」が「インポート」に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/bfcd60a1-431a-6ef1-4619-1bf1c2b38e29.png)

7.Standard Assets (for Unity 2018.4)を選択し、右下の「インポート」を押してください。
するとImport Unity Packageが開きます。

8.以下の画像をよくみて同様のチェックを入れて（注意深く確認してください）、「インポート」を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/71430509-d777-b06c-3ac3-83df02b3fcec.png)
・CrossPlatformInputは全てにチェックを入れています。
・Editorは一部にチェックを入れています。
・その他は全てチェックを外しています。



##3.ボタン(バーチャルパッド）の作成
1.canvasグループの作成

まずはヒエラルキー上で右クリックをしてください。
UI > キャンバスグループをクリックしてください。
そしてヒエラルキー内に生成されたcanvasをクリックしてください。

その後レンダーモードを「スクリーンスペース - カメラ」に変更します。
インスペクター　> canvas > レンダーモード　をクリックして変更します。

その後、レンダーカメラに「Main Camera」をアタッチします。
[![Image from Gyazo](https://i.gyazo.com/a868685d4c31b9c0294da543857e64da.gif)](https://gyazo.com/a868685d4c31b9c0294da543857e64da)

2.MobileSingleStickControlのプレハブを開く

プロジェクト > Assets > StandardAssets > Prefabs > MobileSingleStickControl
以下の画像の右上の「プレハブを開く」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/563424c5-46c9-9c9a-9f07-522adc94808d.png)

3.Mobile JoyStickを削除する

ヒエラルキー > MobileSingleStickControl > JoyStick
JoyStickを右クリックして削除を押す。
※Saveするか聞かれた場合はSaveをクリックする。

4.JumpButton内のTextを削除する

ヒエラルキー > MobileSingleStickControl > JoyButton >Text
Textを右クリックして削除を押す。
※Saveするか聞かれた場合はSaveをクリックする。


5.MobileSingleStickControlのプレハブをcanvas内にドラックアンドドロップする

プロジェクト > Assets > StandardAssets > Prefabs > MobileSingleStickControlを先ほど作成したcanvasにドラックアンドドロップしてください。
以下の画像のようになっていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/773de298-2203-1205-655f-bdae09a138c5.png)

6.MobileSingleStickControlの幅と高さを調整する

インスペクター内で変更を行います。
まずはRectTransformの幅と高さをそれぞれ1080と1920にします。
次にRectTransformのスケールX,Y,Zをそれぞれ１に変更します。
以下の画像のように白いボタンが出現すればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/2839e0c0-0522-495c-6c62-b0485cf2c57e.png)

7.JumpButtonを複製し、名前を変更する
ヒエラルキー　> Canvas > MobileSingleStickControl > JumpButtonを右クリック > 複製
それから以下の画像のようにそれぞれのオブジェクトの名前を変更します。
・LeftButton
・RightButton
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/d56756a9-a666-7884-be57-3239f8517876.png)

8.ボタンの位置を調整する
左右のボタンの位置を以下の画像のように調整します。

LeftButton
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/eb43d7b7-a407-53ab-a2d1-eaef11ab1ae3.png)

RightButton
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/eb49ed6d-46da-bda1-51c1-ad73391f34e9.png)

ここまでできたらお好みでボタンの色などを変更してもいいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/826452a6-f7d6-ce61-85fe-d65a11f2716c.png)

9.ButtonHandler(スクリプト）の名前を変更する
【重要】ここに記載している名前は今後重要になってきますので、綴りの間違いがないようにしておいてください。

LeftButton
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/f02988d0-817f-0312-cea4-ee052b231ae4.png)

RightButton
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/ee211658-9d64-abb8-8b3c-49f51d841693.png)

以上でボタンの作成は終了です。
お疲れ様でした。
筆者はコーヒーを淹れて、江國香織さんの「スイカの匂い」という小説を読みながら、すこし休憩します。

##4.InputManagerの作成

イメージはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/d8d8cef8-62bd-3eef-84f5-414e07aee73f.png)
1.空のオブジェクトを作成します。

ヒエラルキー内で右クリックを押して、空のオブジェクトを作成してください。
それから、名前を「InputManager」に変更してください。

2.InputManagerスクリプトを作成します。

・プロジェクト内にScriptフォルダを作成してください。
プロジェクト　> Assetsを右クリック　> 作成　>フォルダー
その後、フォルダー名を「Script」に変更してください。

・次にInputManageｒ(スクリプト）を先ほどのフォルダー内に作成してください。
プロジェクト　> Assets　>  Scriptを右クリック　> 作成　> C#スクリプト
その後、Script名を「InputManager」に変更してください。

3.InputManagerスクリプトのコードを書き換える
InputManagerのC#スクリプトを開き以下のようにコードを書き換えてください。

```InputManaer.C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityStandardAssets.CrossPlatformInput;

public class InputManager : MonoBehaviour
{
    protected static readonly string[] findTags;

    private static InputManager instance;

    public static InputManager Instance
    {
        get { return instance;}
    }

    void Awake()
    {
        CheckInstance();
    }

    private bool CheckInstance()
    {
        if (instance == null) {
            instance = (InputManager)this;
            DontDestroyOnLoad(gameObject);
            return true;
        } else if (Instance == this) {
            return true;
        }

        Destroy(this);
        return false;
    }

    /* -- 入力検知 --------------------------------------------------------------------------------- */
    private int  buttonKey = 0;
    //パブリックの変数
    public int ButtonKey
    {
        get { return buttonKey; }
    }

    void Update()
    {
        // ジャンプ
        PushBottun();
    }

    //GetButtonDownはボタンを押した時に返す値を記載
    //GetButtonはボタンを押している間に返す値を記載
    //GetButtonUpはボタンを離した時に返す値を記載
    void PushBottun()
    {
        if (CrossPlatformInputManager.GetButtonDown("RightButton")) { //クロスプラットフォームのButtonハンドラーのname欄ということ
            buttonKey = 1;
        } else if (CrossPlatformInputManager.GetButton("RightButton")) {
            buttonKey = 2;
        } else if (CrossPlatformInputManager.GetButtonUp("RightButton")) {
            buttonKey = 0;
        } else if (CrossPlatformInputManager.GetButtonDown("LeftButton")) { //クロスプラットフォームのButtonハンドラーのname欄ということ
            buttonKey = 3;
        } else if (CrossPlatformInputManager.GetButton("LeftButton")) {
            buttonKey = 4;
        } else if (CrossPlatformInputManager.GetButtonUp("LeftButton")) {
            buttonKey = 0;
        }
    }
}
```

4.InputManager（スクリプト）をInputManager（オブジェクト）にアタッチする

プロジェクト内にあるInputManage（スクリプト）を、ヒエラルキー内にあるInputManager（オブジェクト）にドラック&ドロップでアタッチしてください。

InputManagerの作成は以上となります。


##5.GameManagerの作成
イメージはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/aefd9a34-e210-18b9-9204-41d396fe8419.png)
1.空のオブジェクトを作成します。

ヒエラルキー内で右クリックを押して、空のオブジェクトを作成してください。
それから、名前を「GameManager」に変更してください。

2.GameManagerスクリプトを作成します。

・次にGameManageｒ(スクリプト）をScriptフォルダー内に作成してください。
プロジェクト　> Assets　>  Scriptを右クリック　> 作成　> C#スクリプト
その後、Script名を「GameManager」に変更してください。

3.GameManagerスクリプトのコードを以下のように書き換えます。

```Gamemanager.C#
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    //インプットマネージャー
    InputManager inputManager;

    //スコア
    public GameObject canvasScore;
    public Text scoreText;//Canvasのスコアテキストをアタッチメントするための変数（箱）
    int score = 100;//ゲームスタート時に表示するスコアを決める
    string score_3digits;//２５を表示する時に025のように3桁で表示するために必要

    //ゲームクリアキャンバス
    public GameObject canvasGameClear;
    public GameObject canvasGameOver;


    //ゲーム開始と同時に呼び出される関数
    void Start()
    {
        canvasScore.SetActive(true);
        canvasGameClear.SetActive(false);
        canvasGameOver.SetActive(false);
        inputManager = InputManager.Instance;
        SetScore();
    }

　　 //0.02秒ごとに呼び出される関数（初期設定の場合）
    void FixedUpdate()
    {
        AddScore();
        ClearCheck();
    }


//--スコアを画面に表示する関数ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

    private void SetScore()
    {
        score_3digits =score.ToString("D3");//数字を3桁で表示するための記述
        scoreText.text = score_3digits + "m";//3桁の数字＋mで表示するための記述
    }

//--ボタンを押している時の処理ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    //スコア加算
    public void AddScore()
    {
        if (inputManager.ButtonKey == 2) {
            UpScore();
        }
        if (inputManager.ButtonKey == 4) {
            DownScore();
        }

    }

    private void UpScore()
    {
        score += 1;
        SetScore();
    }

    private void DownScore()
    {
        score -= 1;
        SetScore();
    }

//--ゲームクリアに関する処理ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

    private void ClearCheck()//スコアが0か200になったらゲームクリア
    {
        if(score == 200)
        {
            GameClear();
        }
        else if(score == 0)
        {
            GameOver();
        }
    }

    private void GameClear()
    {
        canvasScore.SetActive(false);
        canvasGameClear.SetActive(true);
    }

    private void GameOver()
    {
        canvasScore.SetActive(false);
        canvasGameOver.SetActive(true);
    }

}
```

4.GameManageｒ（スクリプト）をGameManageｒ（オブジェクト）にアタッチする

プロジェクト内にあるInputManage（スクリプト）を、ヒエラルキー内にあるGameManageｒ（オブジェクト）に
ドラック&ドロップでアタッチしてください。

GameManagerの作成は以上となります。


##６.Canvasの作成

このアプリケーションでは3つのCanvasを作成します。
・スコアを表示するためのTextCanvas（UI）
・「クリア」という文字を表示するためのTextCanvas（UI）
・「ゲームオーバー」という文字を表示するためのTextCanvas（UI）

イメージはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/032b545d-b056-c23f-59df-f885fbefb4c0.png)

1.スコアを表示するためのTextCanvas（UI）を作成します。

ヒエラルキー　> Canvasを右クリック　> UI　> Text
表示名を「ScoreText」に変更してください。

インスペクターを以下のように変更してください。

位置Y：300
幅：700
高さ：300
テキスト:000m
フォントサイズ：200
Paragraph > 整列：真ん中、真ん中
色：白

下の画像のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/80d43b21-2724-5245-1260-ce449902732d.png)


2.「クリア」という文字を表示するためのTextCanvas（UI）を作成します。

まず、上記で作成したScoreTextを複製してください。
ヒエラルキー > ScoreTextを右クリック　>　複製

表示名を「GameClearText」に変更してください。

その後、インスペクター内のテキスト「000m」を「クリア」に書き換えてください。


3.「ゲームオーバー」という文字を表示するためのTextCanvas（UI）を作成します。

まず、上記で作成したScoreTextを複製してください。
ヒエラルキー > ScoreTextを右クリック　>　複製

表示名を「GameOverText」に変更してください。

その後、インスペクター内のテキスト「000m」を「ゲームオーバー」に書き換えてください。
また、フォントサイズ「200」から「100」に変更してください。
※200だと「ゲームオーバー」の文字列がうまく表示されないため。

以上です。
あともうすこしで完成です！


##7.GameManagerに各Canvasをアタッチ

イメージはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1528981/fc7681f2-7b43-d885-da39-407e6218a64d.png)

上記の画像のように、ヒエラルキー内にあるScoreText,GameClearText,GameOverTextを、GameManagerオブジェクトのGameManager(スクリプト）にアタッチしてください。

##8.参考にしたサイト
https://www.youtube.com/watch?app=desktop&v=XyH64iQq9Wo

https://www.kitajima-ryoto.com/how-to-jump-like-mario/

##9.ゲームのご紹介
今回ご紹介した技術を活かして作成したゲーム（IOS限定）はこちらです。

https://apps.apple.com/jp/app/%E3%82%AF%E3%82%BD%E3%82%B2%E3%83%BC%EF%BC%92d-%E9%81%A0%E6%B3%B3%E3%81%A7%E3%83%90%E3%82%BF%E3%83%95%E3%83%A9%E3%82%A4%E3%81%99%E3%82%8B%E3%82%84%E3%81%A4/id1565895336


##10.おわりに

以上でアプリケーションの作成は終了となります。
動作確認をして、無事に動けば完了となります。
筆者は2021年5月時点では、Unityでのゲーム制作歴3ヶ月です。

ここのコードの書き方もっとこうした方がいいよとか、他にもっと良い方法があるよというアドバイス等をいただけると嬉しいです。

まだまだ至らない点が多いですが、引き続きよろしくお願いいたします。
最後までお付き合いいただきまして、ありがとうございました。


筆者：いのう