初心者でもできる! 7日間で作るUnityゲーム開発

Day3:Unityなら爆発エフェクトも簡単!

クマに弾が当たったら爆発エフェクトを起動させる

前回の記事でプレイヤーの3Dモデルをプロ生ちゃんに変更しましたが、今回は爆発エフェクトを追加していきます。フリーの爆発エフェクト「Detonator Explosion Framework」を使えば簡単に爆発エフェクトを追加することができます。では早速アセットストアからダウンロードしていきましょう!

Detonator Explosion Frameworkをダウンロード&セットアップする

メニューの[Window⁠⁠—⁠Asset Store]をクリックします。

アセットストアのウィンドウが表示されるので、右上の検索ボックスに「Detonator Explosion Framework」と入力してエンターを押します図1⁠。

図1
図1

Detonator Explosion Frameworkが検索結果に表示されるので、クリックするとDetonator Explosion Frameworkのページが表示されますので[Download]ボタンを押します図2⁠。

図2
図2

Detonator Explosion Frameworkを使うにはUnity4.5.3が必要です。古いバージョンのUnityでアセットストアのDetonator Explosion Frameworkのページにアクセスすると、

「Needs Unity upgrade to version 4.5.3」

と表示されます。その場合、最新版のUnityにアップデートをしてください。

DownloadボタンをクリックするとImporting packageダイアログが表示されるので[Import]ボタンをクリックします図3⁠。

図3
図3

ProjectにDetonator Explosion Frameworkが追加されました図4⁠。

図4
図4

爆発エフェクトを起動するコードを追加する

続いて、HierarchyのTeddyをクリックし、Inspectorの「Bear」をダブルクリックします図5⁠。

図5
図5

MonoDevelopが起動してBear.csがオープンされます。Bear.csのpublicフィールドにdetonatorのGameObjectを追加します。

public class Bear : MonoBehaviour {
    public GameObject detonator;

続いてOnCollisionEnterを以下のように変更します。

    bool hitFlag = false;
    void OnCollisionEnter(Collision collision) {
        if (avatar != null) {
            if (hitFlag == false && collision.collider.tag == "Bullet") {
                hitFlag = true;
                GameObject exp = (GameObject)Instantiate(detonator.gameObject, transform.position, Quaternion.identity);

                var currentState = avatar.GetCurrentAnimatorStateInfo(0);
                var nextState = avatar.GetNextAnimatorStateInfo(0);
                if (!currentState.IsName("Base Layer.Dying") && !nextState.IsName("Base Layer.Dying")) {
                    avatar.SetBool("Dying", true);
                    Destroy(this.gameObject, 3.0f);
                }
            }
        }
    }

以下の部分が爆発エフェクト関連のコードです。

            if (hitFlag == false && collision.collider.tag == "Bullet") {
                hitFlag = true;
                GameObject exp = (GameObject)Instantiate(detonator.gameObject, transform.position, Quaternion.identity);

if文のcollision.collider.tag == "Bullet"で弾と当たった時を判定しています。hitFlagは接触判定を一度だけに限定するためにフラグ制御をしています。GameObject exp = (GameObject)Instantiate(detonator.gameObject, transform.position, Quaternion.identity);で爆発エフェクトをインスタンス化しています。これにより爆発エフェクトが作動します。

爆発エフェクトの大きさを調整する

Unityに戻ってProjectの[Detonator Explosion Framework⁠⁠—⁠Prefab Examples⁠⁠—⁠Detonator-Chunks]をクリックします。

Inspectorの「Detonator(Script)⁠⁠—⁠Size」に1を入力、⁠Duration」に1を入力します。この作業は爆発エフェクトの大きさを設定しています。デフォルトのままだと爆発が大きすぎるので1にすることで適切な大きさにしています。

図6
図6

爆発エフェクトの参照をスクリプトに設定

続いてHierarchyのTeddyをクリックします。Inspectorの「Bear(Script)⁠⁠—⁠Detonator」にProjectの[Detonator Explosion Framework⁠⁠—⁠Prefab Examples⁠⁠—⁠Detonator-Chunks]をドラッグアンドドロップします図7⁠。

図7
図7

弾オブジェクトにBulletタグを追加する

続いてHierarchyのBulletをクリックします。InspectorのTagの横に「Untagged」と書かれてる箇所をクリックするとドロップダウンが表示されるので、⁠Add Tag...]をクリックします図8⁠。

図8
図8

Inspectorの[Tags⁠⁠—⁠Element 0]の横のテキストボックスに⁠Bullet⁠と入力します図9⁠。

図9
図9

再びHierarchyのBulletをクリックします。InspectorのTagの横のUntaggedをクリックして表示されたドロップダウンから[Bullet]を選択します図10⁠。

図10
図10

ここで一度ゲームを実行してみましょう!

図11
図11

弾を消去する

今のままだと弾がクマに当たって爆発エフェクトが発生しても、弾自体はそのまま残ってしまいます。クマに当たらなかった弾丸も地面の上にずっと残ってしまいます。クマに当たった際と当たらなかった際に弾を消去する処理を追加します。

クマオブジェクトにTeddyタグを追加する

HierarchyのTeddyをクリックします。InspectorのTagの横にあるUntaggedをクリックし、コンテキストメニューの[Add Tag...]をクリックします図12⁠。

図12
図12

Inspectorの[Tags⁠⁠—⁠Element 1]「Teddy」と入力します図13⁠。

図13
図13

HierarchyのTeddyをクリックします。InspectorのTagの横のUntaggedをクリックしてコンテキストメニューの[Teddy]を選択します。

図14
図14

弾を消去するスクリプトを作成する

ProjectのScriptフォルダを右クリックして[Create⁠⁠—⁠C# Script]をクリックします。C#スクリプトを作成してファイル名を「Bullet」に変更し、ダブルクリックしてMonoDevelopで開きます図15⁠。

図15
図15

Bullet.csに以下のコードを追加します。

    void OnCollisionEnter(Collision collision) {
        if (collision.collider.name == "Plane") {
            Destroy(this.gameObject, 2.5f);
        } else if (collision.collider.tag == "Teddy") {
            Destroy(this.gameObject);
        }
    }

if (collision.collider.name == "Plane") {は弾が地面に当たった時の判定です。Destroy(this.gameObject, 2.5f);で2.5秒後に弾の消去をしています。Destroyメソッドの第二引数は何秒後に消去を実行するかの指定です。

} else if (collision.collider.tag == "Teddy") {は、クマと弾が当たった時の判定です。この場合、当たった瞬間弾を削除しています。

Unityに戻ってProjectの[Script⁠⁠—⁠Bullet]をHierarchyのBulletにドラッグアンドドロップします。

図16
図16

爆発音を追加

続いて、爆発音を追加していきます。爆発エフェクトが作動するタイミングに合わせて爆発音を再生させるとゲームの臨場感が増します。

Detonator Explosion Frameworkには爆発音の素材が添付されているため、それを使用していきます。

サウンド管理用クラスの作成

まず、サウンド管理用クラスを作ります。

ProjectのScriptフォルダを右クリックして[Create⁠⁠—⁠C# Script]をクリックします。C#スクリプトを作成してファイル名を「SoundManager」に変更し、ダブルクリックしてMonoDevelopで開きます図17⁠。

図17
図17

SoundManager.csを以下のように編集します。

using UnityEngine;
using System.Collections;

public class SoundManager : MonoBehaviour {
    private static SoundManager instance;
    public AudioClip explosionAudio;

    public static SoundManager Instance {
        get {
            if (instance == null) {
                instance = (SoundManager)FindObjectOfType(typeof(SoundManager));
                if (instance == null) {
                    Debug.LogError("SoundManager Instance Error");
                }
            }
            return instance;
        }
    }

    public void PlayExplosionAudio() {
        audio.PlayOneShot(explosionAudio);
    }
}

public AudioClip explosionAudio;は音声ファイルへの参照です。Unity上から音声ファイルをドラッグアンドドロップで指定します。

public static SoundManager Instance {はこのクラスのインスタンスを返すメソッドです。Singletonパターンというデザインパターンを使用しています。Singletonパターンを使うとインスタンスが一つしか生成されないようにすることができます。サウンド管理クラスはインスタンスが一つあれば十分なのでこのパターンを使用しています。public void PlayExplosionAudio() {は爆発音を発生させるメソッドです。audio.PlayOneShot(explosionAudio);で爆発音性を再生しています。

爆発音再生処理を呼び出す

爆発音はクマに弾が命中した時に鳴らすのでBearクラスのOnCollisionEnterメソッドのhitFlag = true;の下に以下のコードを追加します。

SoundManager.Instance.PlayExplosionAudio();

Audio Sourceを作成する

Unityに戻ってメニュー[GameObject⁠⁠—⁠Create Empty]を選択します。Hierarchyに作成されたGameObjectの名前を「SoundManager」に変更します。Inspectorの[Add Component]をクリックします。

表示された検索ボックスに「Audio」と入力するとAudio Sourceが表示されるのでクリックします図18⁠。

図18
図18

Audio Sourceは簡単に言うと音を鳴らす人です。ここに音素材であるAudio Clipを指定すると音を鳴らすことができます。

続いて、Inspectorの[Audio Source]ー[Play On Awake]のチェックを外します図19⁠。Play On Awakeにチェックが付いているとゲーム開始時に音が再生されます。今回のケースだとチェックが付いてるとゲーム開始時に爆発音が再生されてしまい、おかしいのでチェックを外しておきます。

図19
図19

音管理クラスにAudio Clipの参照を設定する

Projectの[Script⁠⁠—⁠SoundManager]をHierarchyのSoundManagerにドラッグアンドドロップします図20⁠。

図20
図20

Projectの[Detonator Explosion Framework⁠⁠—⁠Sounds⁠⁠—⁠FarExplosionA]をInspectorの「Sound Manager⁠⁠—⁠Explosion Audio」にドラッグアンドドロップします。

図21
図21

これでSoundManagerクラスからAudio Clipを参照することができるようになりました。このようにクラスのpublicフィールドにIDEから参照を設定できるのがUnityの特徴の一つです。今回のケースだと別のAudio Cllipをドラッグアンドドロップすれば、別の音を鳴らすことが可能です。スクリプトと音素材の関連が祖結合になってコンポーネントの再利用性を高めることができます。

3Dサウンドを無効化する

Unityには3Dサウンド機能があります。3Dサウンドとは音源の位置によって音の聞こえ方が変わる仕組みです。遠くで音が鳴ったら小さく聞こえる等、音源の位置によって音の聞こえ方を変えることができます。ただし効果的な使い方をするには音源の位置の調整が必要なため、今回は無効化します。

Projectの[Detonator Explosion Framework⁠⁠—⁠Sounds⁠⁠—⁠FarExplosionA]を選択します。Inspectorの3Dサウンドのチェックを外します。ダイアログが表示されるので[Apply]をクリックします図22⁠。

図22
図22

これにより3Dサウンドが無効化されてどこで音を鳴らしても同じように聞こえるようになります。

それではゲームを実行していましょう。弾が熊に当たった際に爆発音が再生されるようになりました!


いかがだったでしょうか? エフェクトやサウンドを追加することでゲームの臨場感がグッと増しました。しかも、Unityを使うと、それらをとても簡単にできることがお分かり頂けたかと思います。

次回はタイムトライアル機能を追加してゲーム性を強化していきたいと思います。お楽しみに!

おすすめ記事

記事・ニュース一覧