Unityでスマホゲームを作ってみました その3

それでは、ゲームの勝敗を決めるものとして、時間経過とともに加算されるスコアを実装したいと思います。まずはゲームオーバーかどうかの判断をPlayerScriptを利用したいので、private bool isDead = false;の部分を外部のスクリプトからも利用できるように書きかえます。青線の部分が変更箇所です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour
{
    public float upForce;
    public GameObject gameOverUI;

    private Rigidbody2D rigidbody2D;
    public static bool isDead = false;
    public AudioClip sound1;
    public AudioClip sound2;
    private AudioSource audioSource;


    // Start is called before the first frame update
    void Start()
    {
        rigidbody2D = GetComponent<Rigidbody2D>();
        audioSource = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update()
    {
        if (isDead == false)
        {
            if (Input.GetMouseButtonDown(0))
            {
                rigidbody2D.velocity = Vector2.zero;
                rigidbody2D.AddForce(new Vector2(0, upForce));
            }
        }
        
    }

    private void OnTriggerEnter2D(Collider2D Collision)
    {
        rigidbody2D.velocity = Vector2.zero;
        isDead = true;
        gameOverUI.SetActive(true);
        audioSource.Stop();
        audioSource.PlayOneShot(sound1);
    }

    private void OnTriggerExit2D(Collider2D Collision)
    {
        audioSource.PlayOneShot(sound2);
    }
}

次に、得点を加算していくスクリプトをScoreScript(任意)とし、下記のように記述します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ScoreScript : MonoBehaviour
{
    public Text scoreText;

    private int score = 0;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        if (PlayerScript.isDead == false)
        {
            score++;
            scoreText.text = "Score : " + score.ToString();
        }
        
    }
}

また、RetryScriptがこのままではGameOverの状態を読み込んでしまうので、PlayerScript.isDead = falseを追記します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class RetryScript : MonoBehaviour
{

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }

    public void onRetry()
    {
        PlayerScript.isDead = false; 
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}

続いて、得点を表示する部分を作成します。Hierarchy → UI → Textと選択し、名前をScoreText(任意)とします。Anchor pointを左上に変更し、Pos X、Pos Yをそれぞれ-32、Widthを320、Heightを80にしました。フォントサイズはBest Fitにチェックを入れて、Max Sizeを64にしました。

次に、下記の記事を参考にボリュームスライダーを実装しました。

Hierarchy → UI → Sliderを選択し、名前をVolume(任意)とします。Anchor pointを左下に設定し、Pos Xを-64、Pos Yを32、Widthを160、Heightを32としました。

On Value Changedの+をクリックし、Playerをドラッグ&ドロップします。

Functionの部分はAudioSource → volumeを選択します。Unityを実行してスライダーを左右に動かし、BGMの音量が変われば成功です。

このままでは何のスライダーか分かりませんので、スピーカーアイコンを追加したいと思います。UI → Raw Imageを追加します。

Textureの部分にフリー素材のスピーカーアイコン(背景透過PNG)をドラッグ&ドロップします。Anchor pointを左下に設定し、Pos Xを調整します。

以上でゲームはほぼ完成ですが、ゲームオーバーになってもサボテンが延々と出現するのでそれを止めたいと思います。ObstraclePrefabに下記のように追記しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObstraclePrefab : MonoBehaviour
{
    public GameObject obstacle;
    public float spawnRate = 1f;
    public float obstacleMin = -5f;
    public float obstacleMax = 5f;

    private float timeSinceLastSpawned;
    private Vector2 obstaclePosition = new Vector2(0, 0);

    // Start is called before the first frame update
    void Start()
    {
        timeSinceLastSpawned = 0f;
    }

    // Update is called once per frame
    void Update()
    {
        timeSinceLastSpawned += Time.deltaTime;

        if (PlayerScript.isDead == false)
        {
            if (timeSinceLastSpawned >= spawnRate)
            {
                 timeSinceLastSpawned = 0f;
                float spawnYPosition = Random.Range(obstacleMin, obstacleMax);
                GameObject obstacles;
                obstaclePosition = obstacle.transform.position = new Vector2(10, spawnYPosition);
                obstacles = Instantiate(obstacle, obstaclePosition, Quaternion.identity);
            }
        }
    }
}

最後に、タイトル画面を作成します。GameSceneをCtrl+Dでコピーし、名前をTopScene(任意)とします。Main CameraとEventSystem以外は削除しても構わないのですが、タイトルだけではさみしいのでPlayerと雲を配置しました。タイトルとスタートボタンの配置は、ゲームオーバー時のテキストとリトライボタンと同じ要領でできます。

次にスタートボタンを押すとゲームが始まる(GameSceneへ移動する)ようにスクリプトを下記のように記述し、スタートボタンにアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class StartScript : MonoBehaviour
{
    public void onStart()
    {
        SceneManager.LoadScene("GameScene");
    }

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

StartButtonをOn Click ()へドラッグ&ドロップし、FunctionをStartScript.onStartにします。Unityを実行してスタートボタンを押し、ゲームが始まれば成功です。

ここまで順調に進んだら、いよいよ書き出していきます。File → Build Settiongを開き、Add Open SceneでTopSceneとGameSceneを追加します。そして、Player Settingsを開きます。

こちらのProject Nameですが、最初の文字はアルファベットのみ、名前に半角スペースは使えませんのでご注意ください。こちらの名前が表示されるアプリ名になります。

Project Nameの登録が終わったら、Build And Runを実行します。

ところが、ここで「Required API Level 26」とエラーが出てしまいました。「Update Android SDK」と「Use Highest Installed」と選択肢が出ましたが、どちらを選んでも上手くいきません。仕方がないのでエラーメッセージでそのまま検索したところ、下記の記事にたどり着きました。

  • UnityでAndroidビルドしたら「Required API Level 26」「Android SDK is missing required platform API」とエラーが出たのでメモ | 神部まゆみのブログ
    https://knb-mayumi.com/unity-android/

この記事を参考にAndroid Studioをインストールし、使っているスマホと同じバージョンのSDKを導入、Unityのパスを変更したら上手くいきました。つまづいた時には、エラーメッセージで検索してみましょう。

こちらが実機で動作している状態です。

こちらがWeb版です。
https://ma510884.com/birdstrike/

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

  • 1
  • 0
  • 0

おすすめのタグ

Laffey(ラフェィ)

色々な物・もの・モノを作って記事にしています

作者のページを見る

関連記事

寄付について

「novalue」は、‟一人ひとりが自分らしく働ける社会”の実現を目指す、
就労継続支援B型事業所manabyCREATORSが運営するWebメディアです。

当メディアの運営は、活動に賛同してくださる寄付者様の協賛によって成り立っており、
広告記事の掲載先をお探しの企業様や寄付者様を随時、募集しております。

寄付についてのご案内