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」をクリックしてください。
ビルドにはかなり時間がかかります。終わるまで気長にお待ちください。
ゲームを公開する
ようやくゲームを公開できる状態になりました!あとは自分のサイトに公開したり、unityroomに投稿したりするのもよいでしょう。
これで2Dジャンプアクションゲーム「悪路王」のチュートリアルを終わります。最後までご覧いただきありがとうございました。

