Unityに関連する記事です

 この手順ではスクリプタブル・オブジェクトを利用したエフェクトの管理処理を実装していきます。



 新しい学習内容は、以下の通りです。

 ・エフェクトを再生する場面を考える



1.エフェクト用のアセットをダウンロードしてUnityにインポートする

1.設計


 まずはゲーム内のどの場面でエフェクトを再生するかを想定し、どの位の種類のエフェクトが必要になることを把握します
例えば、以下の3種類です。左側が想定するファイル名、右側がエフェクトを再生する場面です。

<エフェクト・リスト>
 1.Hit       --  攻撃命中時
 2.Damage   --  敵からの攻撃の被弾時
 3.ItemGet  --  アイテム取得時

 このようにリスト化して書き出しておくと管理しやすくなります。

 今後、エフェクトを利用する場面が増えたり、変更したい、といった場合には、上記に追加をして検討してください。


2.アセットストアより、エフェクトを再生する場面をイメージして、任意のアセットを探して Unity にインポートする


 エフェクトにはパーティクルシステムを利用して作成されたアセットを利用します。
アセットストアより任意のアセット Unity インポートして、ゲーム内でエフェクトを再生するための準備をします。

 頭の中で場面を思い浮かべながら、どんなエフェクトがよいか、確認しながら決めていきましょう。
先ほど提示した場面に合わせて、合計で3種類のエフェクト用のパーティクルシステムのゲームオブジェクトを用意をしてください。

Unity公式マニュアル
パーティクルシステム
https://docs.unity3d.com/ja/current/Manual/class-P...



 出来れば複数のアセットをインポートして、Unity 内で再生してみるとよいでしょう。



2.エフェクト用のデータベースとして利用するスクリプタブル・オブジェクトを作成する準備を行う −EffectDataSO スクリプトを作成するー

1.設計


 次回の手順で新しく作成する EffectManager スクリプトを利用して、インポートしたエフェクト用のゲームオブジェクトを再生したり、停止したりする制御を行います。

 このとき、エフェクト用のゲームオブジェクトをゲーム内で動的にアサインする方法としては、リソースからロードしたり、
それぞれのゲームオブジェクトに事前にアサインしておいたりと様々な実装の方法があります。
 
 今回はエフェクト専用のスクリプタブル・オブジェクトを作成しておいて、そちらにデータ単位として、エフェクト用のゲームオブジェクトを事前に登録しておく手法を利用します。

 スクリプタブル・オブジェクトには、エフェクト用のデータクラスを作成し、それをList にて管理を行います。
 
 また、エフェクト用に利用するための enum を一緒に宣言します。
エフェクトの利用する場面などを列挙子と登録して利用するという形式になります。

<構成>
 ・エフェクトの種類を設定する Enum の EffectName
 ・Enum とエフェクト用のプレハブを登録するための EffectData クラス
 ・EffectData クラスを List でまとめているスクリプタブル・オブジェクト
 ・シングルトンクラスで、どこからでもエフェクトの情報にアクセスするようにして管理する EffectManager クラス


2.EffectName スクリプトを作成する


 enum を利用し、EffectName スクリプトを作成します。

 エフェクトを利用する場面を列挙子の名前として登録しておくことで、
エフェクト用のゲームオブジェクトを紐づけし、かつ、プログラム内で利用する際にも処理をわかりやすくします。


EffectName.cs

 <= クリックすると開きます



3.EffectData スクリプトを作成する


 先ほど作成した EffectName を利用し、一緒にエフェクト用のプレハブを登録できるクラスを作成します。


EffectData.cs

 <= クリックすると開きます


 このように1つのクラス内に複数の異なる情報を用意しておくことで、
EffectName に紐づいた ParticleSystem のようにセットで扱うことが出来るようになります。


4.EffectDataSO スクリプトを作成する


 スクリプタブル・オブジェクトを作成するために必要な、EffectDataSO スクリプトの作成を行います。


EffectDataSO.cs

 <= クリックすると開きます


 スクリプトを作成したらセーブします。


5.EffectDataSO スクリプトの構造について


 実装した処理の内容について、順番に確認していきます。

 1.エフェクト用の enum。Hit や ItemGet といった、利用する処理名で列挙子を登録しておく
 2.エフェクトを管理する1つ単位でのデータ(通し番号、エフェクト用のプレハブのアサイン用変数、【1】で作成した enum による エフェクトの種類などのデータ群など)を扱うクラス
 3.【2】のエフェクト用のクラスのデータを複数作成してまとめる List(リスト)


1.エフェクト用の enum。Hit や ItemGet といった、利用する処理名で列挙子を登録しておく

 enum (イリューム) を利用して、エフェクトの種類を事前に登録し、この情報 エフェクトに関連する情報として EffectData クラス内に設定できるようにします。

/// <summary>
/// エフェクトの種類
/// </summary>
public enum EffectName
{
    Hit,
    Damage,
    ItemGet,
    
    // TODO 他にも利用したいエフェクトがあれば追加

}

 enum ではゲーム内に登場させたい種類の情報を、列挙子(れっきょし)という形で種類を作成できます。
今回は、エフェクトの種類、という情報を EffectName という名前で作成し、その中に エフェクトの種類を登録しておきます。
これは変更可能な情報ですので、先々にエフェクトの種類が増減しても対応できます。
 
 ゲームの内容に応じた enum と列挙子を考えて作成して運用していきましょう。


2.エフェクトを管理する1つ単位でのデータ(通し番号、エフェクト用のプレハブのアサイン用変数、【1】で作成した enum による エフェクトの種類などのデータ群など)を扱うクラス

 エフェクト用のファイル(プレハブ)を個々で扱う方法ではなく、1つのデータ単位として管理できるように EffectData クラスとして作成して管理を行うようにします。
利点は、1つの EffectData クラス内には1つ分のエフェクト用のデータが登録できることです。

 EffectData クラス内に必要な変数を用意することによって、エフェクト用のファイル(プレハブ)の登録だけではなく、
エフェクトの種類などもセットで用意しておくことが出来ます。
そしてこれらの情報を参照して利用できるような設計にしています。

 例えば、EffectData.EffectName と記述すれば、それはその EffectData クラスに登録されている EffectName の値を参照することが出来るようになります。

/// <summary>
/// エフェクト用のデータ
/// </summary>
[System.Serializable]
public class EffectData
{
    public EffectName effectName;
    public ParticleSystem effectPrefab;
}

 このようにエフェクト1つ分に必要になるデータをクラスとしてまとめておくことで管理と利用が容易になります

 また、エフェクトの情報を増やしたい(一緒に利用したい音声データなど)場合には、この EffectData クラス内に 型と変数を追記すれば、好きなだけ増やすことも出来ます。


3.エフェクト用のクラスのデータを複数作成してまとめる List(リスト)

 EffectData クラスにはエフェクトに関連する情報をまとめておいて、登録できるようにしました。
このデータはエフェクト1つ分ですので、もしも複数のエフェクトのデータを用意して登録したい場合、
この EffectData クラスを複数用意して、それを管理するための変数が必要になります。

 他のスクリプタブル・オブジェクトと同じように、EffectData 型の List を用意して管理をさせます。

    public List<EffectData> effectDataList = new();



 public 修飾子にて List を宣言することで、インスペクター上でサイズの変更が可能です
例えばエフェクトのデータを3つ分作って登録したい場合には、インスペクターで List のサイズを 3 に設定すれば
EffectData クラスが 3 つ、Element 0 〜 Element 2 として作成されますので、ここにエフェクトのデータを1つずつ、合計3つ分登録することが出来ます。


 以上でスクリプタブル・オブジェクト用のスクリプトの作成は完了です。


3.EffectDataSO スクリプトを利用して EffectDataSO スクリプタブル・オブジェクトを作成し、オーディオのデータを登録する

1.設計


 EffectDataSO スクリプトを元に EffectDataSO スクリプタブル・オブジェクトを作成します。
EffectDataSO スクリプトに用意してある EffectData 型の List である effectDataList 変数がデータベースの役割を持っています。


2.<クラスのリスト化によるデータベース作成>


 EffectData クラスは1つのデータ情報を扱うことが出来ます。今回であればエフェクト1つ分の情報です。
そのため複数の エフェクトの情報を扱う必要がある今回のような場合には、その分だけ EffectData クラスを追加して作成しなければなりません

 それらを管理するために EffectData 型の List を作り、まとめて管理を出来るようにしています。
ここで大切なことは、1つ1つの別の変数に個別に EffectData が存在していたのではまとめて管理していることにはなりません
EffectData のリストとはすなわち、EffectData をまとめて扱っているデータの集合体になりますので、ここにデータベースとして役割を成立させることが出来ます

 この管理方法はいままでと同じです。


3.EffectDataSO スクリプタブル・オブジェクトを作成する


 最初に、スクリプタブル・オブジェクトを管理するためのフォルダを作成しておきます。
Project 内で右クリックをしてメニューを開き、Datas フォルダを作成してください。
この中に作成されたスクリプタブル・オブジェクトを入れて管理します。



 Unity の左上のメニューより、Assets => Create => Create EffectDataSO を選択します。
新しく EffectDataSO というファイルが作成されます。名前はそのままで構いません。

 このアイコンの形が違うファイルがスクリプタブル・オブジェクトになります。
これはアセットとして取り扱われるようになる情報です。

 EffectDataSO スクリプタブル・オブジェクトを Datas フォルダへ移動してください。
今まで同様にスクリプタブル・オブジェクトを作成したら、Datas フォルダ内で管理するようにします。


<フォルダ管理>



 スクリプタブル・オブジェクトを活用して、エフェクトのデータを登録していきましょう。


4.EffectDataSO スクリプタブル・オブジェクトの設定を行う


 作成された EffectDataSO スクリプタブル・オブジェクトを選択してインスペクターを確認します。
EffectDataSO スクリプトにて宣言した effectDataList 変数がインスペクターに表示されて、 Sizeが 0 になっています。
これがスクリプタブル・オブジェクトの中身です。

 Size に任意の数を入力すると、同数の Element が作成されます。これが List で管理する EffectData クラスの情報群になります。


インスペクター画像



 まずは エフェクトのデータを2つ分登録しておきたいと思います。
effectDataList 変数の Size を 2 に変更してください。Element 0 〜 1 が下に作成されます。

 Element とは List の要素(中身)のことです。
そのため、Element 1つが EffectData 1つになります。Element の番号は 0 から始まります。



 下記の画像を参考にしながら、任意の設定を行ってみてください。


インスペクター画像



 エフェクト用のファイル(プレハブ)は任意ですが、EffectName の値だけは異なる種類で設定してください。
この値はエフェクトデータ用を一意の情報として利用する可能性がありますので、同じ種類を重複して設定してしまうと、同じ種類のエフェクトファイルが複数存在することになり、
EffectName によってエフェクトファイルを特定することが出来なくなります。

 エフェクトに使うプレハブは、ここにドラッグアンドドロップすれば登録し、変更も出来ます。
視覚的にも分かりやすく、管理もしやすいです。これもスクリプタブル・オブジェクトの便利な部分です。



 以上でこの手順は終了です。

 次は エフェクト生成処理の実装例 です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます