
前回まででゲームとしての見た目が整ってきましたので、機能の部分を作り込んでいきたいと思います。
まず、現状ではキャラクターが上下に飛び出してしまい操作できなくなってしまいますので、上下を壁でふさぎます。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ボタンを押すとゲームが再開できれば成功です。