「悪路王」を完成させる

14回にわたる悪路王のチュートリアルもいよいよ最終回です。ここでは最後の仕上げとして、BGMや効果音を設定し、ゲームバランスの調整をしてからビルドを行います。

スポンサーリンク

BGM・効果音の設定

まず音がないと寂しいので、BGMと効果音の設定を行います。ただし著作権の関係上、素材の再配布はできないため、ネット上から適当なBGM・効果音素材を探してください(素材を使う時は利用規約を遵守してください)。必要な音声ファイルは次の4種類です。

  • BGM(ループに対応しているもの)
  • ジャンプ音
  • コイン取得音
  • 死亡音

そうしたらまずはBGMを設定します。GameManagerオブジェクトに「Audio Source」コンポーネントをアタッチしてください。「Audio Clip」にBGMファイルを設定し、「Loop」にチェックを入れて「Volume」を調整します。これでBGMが設定できました。

次は効果音ですが、こちらはPlayerオブジェクトに2つ「Audio Source」コンポーネントを追加します。効果音をそれぞれ設定したら、「Play On Awake」のチェックを外し、「Volume」を調整してください。そしてPlayerスクリプトを下記のように変更します。

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

public class Player : MonoBehaviour {

	//インスペクタに表示する変数
	[SerializeField]
	float speed = 0.0f;
	[SerializeField]
	float jumpPower = 30.0f;
	[SerializeField]
	Transform groundCheck;
	[SerializeField]
	int itemScore = 500;

	//インスペクタには表示しない変数
	bool jumped = false;
	bool grounded = false;
	bool groundedPrev = false;
	bool inCamera = false;
	Animator animator;
	Rigidbody2D rigidBody2D;
	GameManager gameManager;
	AudioSource[] audioSources;

	//初期化
	void Start () {
		//コンポーネントを取得
		animator = GetComponent<Animator>();
		rigidBody2D = GetComponent<Rigidbody2D>();
		audioSources = GetComponents<AudioSource>();

		//GameManagerを検索し、コンポーネントを取得
		gameManager = GameObject.Find("GameManager").GetComponent<GameManager>();
	}

	//毎フレームの処理(一般)
	void Update()
	{
		//接地チェック
		//GroundCheckオブジェクトに床などが重なってるならtrue
		grounded = (Physics2D.OverlapPoint(groundCheck.position) != null) ? true : false;

		//接地してるかどうかの分岐
		if (grounded)
		{
			//接地しているならジャンプを許可
			if (Input.GetMouseButtonDown(0))
			{
				Jump();
			}
		}

		//ジャンプしてるかどうかの分岐
		if (jumped)
		{
			animator.SetTrigger("Jump");

			//ジャンプ終了(前フレームで接地してなくて、今のフレームで接地したとき)
			if (!groundedPrev & grounded)
			{
				jumped = false;
			}
		}
		else
		{
			animator.SetTrigger("Dash");
		}

		//このフレームの接地状態を保存
		groundedPrev = grounded ? true : false;
	}

	//毎フレームの処理(物理演算)
	void FixedUpdate()
	{
		if (grounded)
		{
			rigidBody2D.velocity = new Vector2(speed, rigidBody2D.velocity.y);
		}
	}

	//ジャンプ
	void Jump()
	{
		jumped = true;

		rigidBody2D.velocity = Vector2.up * jumpPower;

		//ジャンプ音
		audioSources[0].PlayOneShot(audioSources[0].clip);
	}

	//死亡処理
	void Dead()
	{
		gameManager.GameOver();

		rigidBody2D.Sleep();

		Destroy(gameObject);
	}

	//アイテムと衝突した時の処理
	void OnCollisionEnter2D(Collision2D other)
	{
		if (other.gameObject.tag == "Item")
		{
			//スコア加算
			gameManager.score += itemScore;
				
			//取ったアイテムを消す
			Destroy(other.gameObject);

			//コイン取得音
			audioSources[1].PlayOneShot(audioSources[1].clip);
		}
	}

	//カメラ内外の判定処理
	void OnBecameVisible()
	{
		inCamera = true;
	}

	void OnBecameInvisible()
	{
		if (inCamera)
		{
			Dead();
		}
	}
}

AudioSourceコンポーネントは複数あるので、GetComponentsで取得し配列に格納します。このとき格納される順番はコンポーネントを追加した順番なので注意してください。上記の場合は

  • [0]:ジャンプ音
  • [1]:コイン取得音

の順に格納されているとします。テストプレイして音が鳴っているのを確認出来たらOKです。

スポンサーリンク

ゲームバランスの調整

次はゲームバランスの調整です。このままリリースしてしまってもいいのですが、ぜひ自分好みにゲームバランスを調整してみましょう。おさらいも兼ねてゲームバランスに関係する項目をまとめると下記の通りです。

GameManager

  • Level Up Time:レベルアップする時間(秒)
  • Max Level:レベルの最大値
  • Add Score Interval:スコアを自動で加算する間隔(秒)
  • Add Score Cofficient:スコアを自動で加算するときの係数

Player

  • Jump Power:数値を大きくすると高くジャンプする
  • Item Score:アイテムをとった時に加算されるスコア

Emitter

  • Emit Wait Time Min:壁が出現する間隔の最小値(秒)
  • Emit Wait Time Max:壁が出現する間隔の最大値(秒)
  • Interval Cofficient:レベルアップしたときに壁の出現時間に掛ける係数(1未満なら出現時間が短くなる)

何度もテストプレイして調整し、面白いと思うゲームバランスにしてみてください。

スポンサーリンク

ビルドする

いよいよゲームをビルドします。「File」→「Build Settings」 を開き、「WebGL」を選んで「Switch Platform」をクリックします。そして「Scenes In Build」にシーンが追加されていることを確認したら「Build」をクリックしてください。

UnityのWebGLでのビルド

ビルドにはかなり時間がかかります。終わるまで気長にお待ちください。

スポンサーリンク

ゲームを公開する

ようやくゲームを公開できる状態になりました!あとは自分のサイトに公開したり、unityroomに投稿したりするのもよいでしょう。

これで2Dジャンプアクションゲーム「悪路王」のチュートリアルを終わります。最後までご覧いただきありがとうございました。


トップページに戻る