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

その1はこちら

前回まででゲームとしての見た目が整ってきましたので、機能の部分を作り込んでいきたいと思います。

まず、現状ではキャラクターが上下に飛び出してしまい操作できなくなってしまいますので、上下を壁でふさぎます。Hierarchyに空のオブジェクトを作成し、名前をWallsとします。その中にWall1、Wall2という空のオブジェクトを作成し、Box Collider 2Dを追加します。ScaleのXを18、PositionのYをそれぞれ5.5、-5.5とします。

これで上下はふさがりましたが、壁に触れるとキャラクターが回転してしまいます。これを防ぐためにRegidbody 2DのConstrainsのFreeze Rotation Zにチェックを入れます。

続いて、PlayerScriptに以下の記述を書き加えます。障害物に当たった(isDead)という変数を用意し、ゲームスタート時にはfalse、ぶつかった場合はtrueとして画面をタップしても上昇しないようにします。青線の部分が追記した箇所です。

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

public class PlayerScript : MonoBehaviour
{
    public float upForce;

    private Rigidbody2D rigidbody2D;
    private bool isDead = false;

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

    // 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;
    }
}

同様にPlayerScriptに追記して、BGMとぶつかった時の効果音を追加します。BGMはProjectフォルダに取り込んだものをHierarchyのプレイヤーキャラクターにドラッグ&ドロップします。InspectorのPlay On AwaekとLoopにはチェックを入れてください。ゲーム開始と同時にBGMが流れます。

効果音はキャラクターを選択した状態でInspectorのplayerScriptのsound1にドラッグ&ドロップします。これで、ゲームスタート時にBGMが流れ始め、キャラクターが障害物にぶつかると効果音が流れBGMが止まります。

また、ゲームオーバーの音としてSound2に音源をドラッグ&ドロップして追加しました。

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

public class PlayerScript : MonoBehaviour
{
    public float upForce;

    private Rigidbody2D rigidbody2D;
    private 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;
        audioSource.Stop();
        audioSource.PlayOneShot(sound1);
    }

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

BGMはリパブリック讃歌(まあるい緑の山手線のCMでおなじみの曲です)の8bit版を、効果音はパッケージ内にあった効果音を使用しました。

次に、ゲームオーバーになったら「Game Over」とリトライボタンを表示するようにします。Hierarchy → UI → Textを選択し、名前をGameoverText(任意)とします。Widthを640、Heightを240、Pos Yを96としました。TextにはGame Overと入力し、基本のフォントサイズは64、Best Fitにチェックを入れてMin Sizeは32、Max Sizeを128としました。

続いて、Hierarchy → UI → Buttonを選択し、名前をRetryButton(任意)とします。Widthを320、Heightを96、Pos Yを-96としました。TextにはRetryと入力し、基本のフォントサイズは48、Best Fitにチェックを入れてMin Sizeは24、Max Sizeを64としました。サイズはGameウィンドウを最大化するか、実機で確認しながら調整すると良いと思います。

これら2点はCanvasの下にGameOverUIという空のオブジェクトを作成し、まとめて格納して管理しやすくします。また、ゲーム開始時は表示しませんのでInspectorのチェックを外します。

次に、キャラクターが障害物にぶつかったらGame OverのテキストとRetryボタンを表示するように、下記のようにPlayerScriptに追記します。

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

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

    private Rigidbody2D rigidbody2D;
    private 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);
    }
}

続いて、Retryボタンを押すとゲームが再スタートするようにRetryScript(任意)を作成し、下記のように記述します。

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()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}

Unityに戻り、PlayerのInspectorのGame Over UIの欄にHierarchyのGameOverUIをドラッグ&ドロップします。

また、RetryScriptはHierarchyのGameControlにアタッチします。そしてRetryButtonのInspectorのOn Click ()にHierarchyのGameControlをドラッグ&ドロップし、RetryScript.OnRetryを選択します。

以上が済んだらUnityを実行し、キャラクターがぶつかったらGame Overの文字とRetryボタンが表示され、Retryボタンを押すとゲームが再開できれば成功です。

その3に続きます

  • 2
  • 0
  • 0

おすすめのタグ

Laffey(ラフェィ)

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

作者のページを見る

関連記事

寄付について

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

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

寄付についてのご案内