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ジャンプアクションゲーム「悪路王」のチュートリアルを終わります。最後までご覧いただきありがとうございました。