音無サノトの空想録

ゆるい漫画を描いています

【ゲーム制作】Unityを利用した横スクロールゲーム開発 03 制限時間とBGMの追加

どうも音無サノトです。

個人的趣味でやっているゲーム制作メモです。

 

今日の成果

  • 時間制限の追加
  • 土台が落ちるトラップの追加
  • BGMの追加

 

作業ログ

 時間制限の追加

ゲームに緊張感を持たせるため時間制限の処理を追加します。

まずゲームの様々な要素を管理するために「GameController」という空のオブジェクトを用意します。

f:id:otonasisanoto:20200913120118p:plain

 

次に時間を表示するテキストとタイムオーバーになった時のテキストをCanvasプレハブ内に用意します。

f:id:otonasisanoto:20200913120630p:plain

 

先ほど作ったGameControllerに次の処理を追加します。

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

public class GameController : MonoBehaviour
{
    public float countTime; // カウントの時間
    public Text countText;  // 時間の表示
    public Text timeoverText;   // タイムオーバーの表示

    
    void Start()
    {
        timeoverText.gameObject.SetActive(false); // タイムオーバーの表示をオフに
    }

    void Update()
    {
        // 残り時間の計算
        countTime -= Time.deltaTime;

        // 残り時間を表示する
        countText.text = "残り" + countTime.ToString("f1") + "秒";

        // 残り時間が0になったら
        if(countTime < 0)
        {
            timeoverText.gameObject.SetActive(true); // タイムオーバーの表示をオンに
            Time.timeScale = 0; // ゲーム停止
        }
    }
}

UnityではTime.deltaTimeで1フレームの時間を取得できるので、制限時間として設けた数値から引くことでカウントダウンを実装しています。

 

実装するとこんな感じ。

 

土台が落ちるトラップの追加

プレイヤーがその土台に触れたら落下するトラップを作ります。

プレイヤーが土台に触れた瞬間、オブジェクトの色を変えて危険だということを知らせます。

その後に土台が落下するという流れの処理を実装します。

 

これは全部スクリプトでやってしまいます。

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

public class FallBlock : MonoBehaviour
{
    private bool isFall = false;    // トラップのフラグ
    public int count;   // ループさせる回数
    private Vector3 temPosition;

    void Update()
    {
        if(isFall)
        {
            // オブジェクトを落下させる処理
            temPosition = this.transform.position;
            temPosition.y = temPosition.y - 0.05f;
            this.transform.position = temPosition;
        }
    }

    void OnCollisionEnter(Collision collision)
    {
        // プレイヤーというタグのオブジェクトに衝突したら
        if(collision.gameObject.tag == "Player")
        {
            StartCoroutine("OnTrap");
        }
    }

    IEnumerator OnTrap()
    {
        // ループさせることでオブジェクトの色をチカチカさせる
        for(int i = 0; i < count ; i++){
            GetComponent<Renderer>().material.color = Color.red;    // 色を赤にする
            yield return new WaitForSeconds(0.5f);  //0.5秒待つ
            GetComponent<Renderer>().material.color = Color.gray;    // 色を灰色にする
            yield return new WaitForSeconds(0.5f);  //0.5秒待つ
        }

        GetComponent<Renderer>().material.color = Color.red;    // 最後は赤にする

        isFall = true; // 落下発動
    }
}

 

これを落下させたいオブジェクトにつけるだけです。

 

BGMの追加

やっぱゲームには音楽付けないとダメですよねー。

ということでBGMを追加します。

使う音源は自分がライブ配信用に作ったテキトーBGMがあるので、とりあえずそれを使います。

 

Unityの音源はAudio Sourceから発生して、それをAudio Listenerでキャッチすることで聞こえるというシステムです。

Audio Listenerはデフォルトでカメラについているので、今回はそのままAudio Sourceをカメラに追加してBGMを実装します。

個人的にはこれが一番簡単。

Audio Sourceを追加したら音源を設定、ループにチェックを入れてボリュームを調整したら完了です。

f:id:otonasisanoto:20200913140402p:plain

 

これで終わり。作業時間3分。いいね。

 

とりあえず今日はここまで。

プロトタイプとしてはだいぶ形になってきたし、ゲーム制作にも慣れてきました。

来週は続きをやるか、新しいゲームに入るかちょっと考えます。

 

本日は以上です。最後まで読んでいただきありがとうございました!