Unityに関連する記事です

 複数回の手順に分けて学習を行います。

 Unity の用意しているスクリプタブル・オブジェクトとオブジェクトプールの機能を利用し、
複数種類のエフェクトをスクリプタブル・オブジェクトとオブジェクトプールを活用して効率的に管理する手法を実装していきます。



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

 ・抽象化(インターフェース、抽象クラス、クラスの継承)

 なお、処理内では非同期処理として UniTask を採用しています。



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

1.設計


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

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

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

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


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


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

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

 また分割可能な画像を利用すればパーティクルの Texture Sheet Animation や、Animator 用の AnimationClip を作成可能です。

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



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


2.エフェクト用のクラスの作成を行う

1.設計


 エフェクトのプレハブの管理には、スクリプタブル・オブジェクトの機能と、オブジェクトプールの機能を利用します。

 複数の種類のエフェクトのプレハブをスクリプタブル・オブジェクトを利用することでデータベースとして管理し、必要な情報にアクセスできるようにします。

 生成されたエフェクトのプレハブはオブジェクトプールの機能を持たせ、繰り返し再利用できるようにします。

 そのために、まずはオブジェクトプールの機能を実装するための、エフェクトのプレハブ用のクラスを作成します。

 1.IPoolable インターフェース
 2.PoolBase 抽象クラス
 3.EffectPlayerBase クラス
 4.EffectPlayerBase クラスを継承したサブクラス

 1はインターフェース、2は抽象クラスですので、これらはエフェクトのプレハブにはアタッチできません。
そのため、3を作成し、これをエフェクトのプレハブにアタッチします。
 
 また各エフェクトのプレハブごとに処理のふるまいを変えたい場合には、4をそれぞれのエフェクトのプレハブごとに作成し、
3の代わりに4のみをアタッチして利用します。


2.IPoolable インターフェースの作成


 インターフェースです。実装したクラスにオブジェクトプール用の共通メソッドを提供します。


IPoolable.cs

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




3.PoolBase クラスの作成


 様々なオブジェクトプールに対応できる、汎用型の抽象クラスです。
抽象クラスですので、必ずほかのクラスに継承して利用します。


PoolBase.cs

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



4.EffectPlayerBase クラスの作成


 抽象クラスである PoolBase を継承して、エフェクト用のベース(親)クラスを作成します。
PlayEffect メソッドを仮想メソッドとして用意し、具体的な処理のふるまいは各エフェクトに依存できるようにしています。
また IPoolable インターフェースによる Release メソッドも同様に仮想メソッドとして実装して、
オブジェクトプールへ戻る処理を共通化したうえで、ふるまいを変えられるように用意しています。

 メンバ変数には Index か enum でエフェクトのプレハブを特定するための情報を設定します。
これはどちらを利用しても問題ありませんので、自分の実装に合わせて作成してください。

 enum を利用する場合には、次の手順で実装しますので、実装の後にメンバ変数を追加してください。


EffectPlayerBase.cs

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



5.EffectPlayerBase クラスを継承したサブクラス


 サンプルとして、サブクラスを1つ提示しておきます。
PlayEffect メソッドのみ上書きしてふるまいを変え、Release メソッドは親クラスのメソッドをそのまま利用しています。

 この時点でこのサブクラスは、MonoBehaviour、PoolBase、そして EffectPlayerBase の機能を有していることになります。


LevelUpEffect.cs

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



3.エフェクト用のプレハブに EffectPlayerBase クラスをアタッチする


 いったん、すべてのエフェクト用のプレハブに EffectPlayerBase クラスをアタッチします。
Index については、一意の値を設定し、ほかのエフェクトのプレハブとは同じ数値にならないようにしておきます。






 各エフェクトごとにふるまいを変えたい場合には、EffectPlayerBase クラスをリムーブし、
EffectPlayerBase クラスを親クラスにした子クラスを作成して、それを再度プレハブにアタッチし直します。






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

 次は スクリプタブル・オブジェクトとオブジェクトプールを活用したエフェクト複数種管理 です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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