Unityに関連する記事です

 この手順では場面に応じてエフェクトを再生する処理を実装していきます。

 こちらの処理を実装するにあたり、事前準備が必要になります。

   => スクリプタブル・オブジェクトを利用したエフェクトの管理

 先にこちらの処理を実装し、理解を深めておいてください。



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

 ・シングルトン・デザインパターン



1.EffectManager ゲームオブジェクトと、EffectManager スクリプトを作成する

1.設計


 エフェクトを再生する処理を考えた場合、エフェクトを再生したいゲームオブジェクトのクラス内に専用の変数を作成し、
エフェクトのプレハブをアサインしておく方法が考えられます。
例えば PlayerController 内にプレイヤーへの被弾時の処理用のエフェクトを登録するための変数を用意する形です。

 エフェクトは色々な場所で用いられるため、この方法の場合、色々なゲームオブジェクトに対して異なるエフェクトをアサインする手間が発生します。
色々なオブジェクトを見ていく都合上、管理が煩雑になるため、結果としてアサイン忘れが発生したり、それに気づくのが遅れてしまったりします。



 そこで今回は、エフェクト関連の処理をすべて管理するためのマネージャークラスとして EffectManager スクリプトを作成して、
ゲームオブジェクト単位で設定していたエフェクト情報を、1つのクラスにまとめて管理するように設計を考えます。
ここの中に、パーティクルのプレハブをエフェクトとして再生したり、停止したりする制御の実装を行います。



 EffectManager スクリプトには、エフェクトに関連する機能をすべて管理する役割を持たせます。
そのためこれらのオーディオ関係の処理は、いつどのスクリプトでもよいように、シングルトンデザインパターンを採用して設計を行うことを考えます。

 エフェクトに限らず、SE なども、いずれのスクリプトからでも実行命令が発生する可能性があります。
そういった場合、各スクリプトごとに EffectManager スクリプトの変数を用意して代入処理を行うのでは、非常に労力がかかります。
恐らくすべてのスクリプトに追加をするようになってしまう可能性もあります。

 こういったケースの場合は、各スクリプトが変数を用意して利用できる状態にするのではなく、
EffectManager 側が、いずれのスクリプトから、いつでも利用しても問題ない状態にしておく設計の方が管理もアクセスも容易になります。

 一方からの処理を考えるのではなく、双方の処理を見直して、どのように設計を行っておいたほうが
先々の利便性や修正作業、管理が簡単かつ、わかりやすくなるのかを、念頭に置いて設計を行うようにしましょう。


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


 シングルトンデザインパターンで、EffectManager を作成します。
変数やメソッドも多く、処理も複雑ですので、処理を記述して満足するのではなく、
どの処理がどのように動いているか、どの処理と処理がつながっているかをしっかりと副種して、処理を把握出来るようにしましょう。
処理の内容がわからないままだと、自分で修正作業が行えなくなってしまうためです。


EffectManager.cs


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


3.<シングルトンデザインパターン>


 こちらのクラスはシングルトン・デザインパターンになっています。
シングルトンにすることによって、いずれのクラスからでもエフェクトを見つける命令しやすい設計にしています。



 シングルトンとは、数多くあるデザインパターンの1つです。そのクラスのインスタンスが必ず1つであることを保証するデザインパターンのことを言います。

 EffectManagerクラスでは、このシングルトンを採用しています。つまり、ゲーム中を通じて、このEffectManagerクラスが1つしか存在できないようになります。
実装例は複数ありますが、一番読みやすい方式で記述しています。

 このシングルトンによってインスタンスが1つか生成されないことが保証されますので、このEffectManagerクラスへの参照は、いずれのクラスからであっても変数を介さずに参照を行えるようになります。

 例えば、Enemyというクラスがあり、そのEmenyクラスを持つゲームオブジェクトが5つあった場合、「どの」Enemyクラスであるかを確定できないと、対象となるEnemyクラスへは参照できません。
そのため、Enemy型の変数を用意して、その変数へ参照したいEnemyクラスを代入することによって、はじめてEnemyクラスの情報を扱うことができるようになります。

 ですがシングルトンであるEffectManagerクラスの場合には、このインスタンスは常に1つしかないことが保証されていますので、「どの」という指定の部分が不要になります。
つまり変数への代入が不要になります。
EffectManagerという指定はすなわち、自動的にただ1つのEffectManagerへの参照が行われます。


4.EffectManager ゲームオブジェクトを作成して、EffectManager スクリプトをアタッチし、設定を行う


 ヒエラルキーの空いている場所を選択して右クリックをしてメニューを開き、Create Empty を選択して空のゲームオブジェクトを1つ作成します。
名前を EffectManager に変更します。

 先ほど作成した EffectManager スクリプトをドラッグアンドドロップしてアタッチしてください。



 続けて EffectManager ゲームオブジェクトを選択して、インスペクターにて EffectManager スクリプトのアタッチを確認し、設定を行います。

 EffectDataSO 変数に、Datas フォルダにある EffectDataSO スクリプタブル・オブジェクトをドラッグアンドドロップしてアサインします。
他の部分はそのままで問題ありません。


EffectManager ゲームオブジェクト インスペクター画像



 以上で設定は完了です。


2.利用例

1.設計


 EffectManager クラスは、シングルトンデザインパターンによって作成されています。
そのため、いずれのスクリプトからでも自由に参照して、メソッドを実行することが可能です。

 エフェクト再生のたびに、各スクリプト内に EffectManager スクリプトの変数を用意して取得をしていると、
例えば、エネミーの攻撃に合わせてエフェクトを再生したいとなった場合、生成されるたびに EffectManager スクリプトの参照を取得する必要が生まれます。

 こういった【複数のスクリプトから参照される用途があり、汎用的に利用される情報】については、
シングルトンデザインパターンを採用することにより、各スクリプト内に新しい変数を追加する必要もなくなり、
エフェクトの再生処理についてもメソッドを実行する命令文を1行記述すれば済みます。



 EffectManager クラスに記述したメソッドは、【クラス名.クラスの代入されている変数名.実行したい変数名かメソッド名(引数の指定)】の書式で記述します。

<シングルトンクラスのメソッドの実行命令>
  EffectManager.instance.GetEffectFromName(EffectName.Hit);

 引数に EffectName を指定することにより、指定した EffectName の設定されている EffectData が参照されて、
そのクラス内にアサインされているエフェクトのプレハブを利用する設計になっています。



 EffectManagerのGetEffectFromNameメソッドを呼び出すことでエフェクトを再生できます。
シングルトンですので、アサインは不要で、いずれのクラスからでも以下の命令で呼び出しが可能です。


2.ゲームを実行して動作を確認する


 実際に処理を書いて、動かしてみましょう!

 いままで個別のゲームオブジェクトに登録していたエフェクトの変数があれば、一旦そちらをコメントアウトします。
そして、エフェクトの再生処理の部分を、先程使い方を紹介した EffectManager からエフェクトを再生する処理に置き換えてください。


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

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

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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