Unityに関連する記事です

 具体的な実装例を元に、2回の手順に分けて抽象化について学習を行います。

 処理の内容としては、アクションゲームなどにおける必殺技について、分岐処理を無くして抽象化していく方法の実装例です。

 インターフェースを利用し、かつ、スクリプタブル・オブジェクトを利用することで、
処理の抽象化しつつ、必殺技の設定自体は可視化をしていくという手法になっています。

 抽象化の処理は難しいため、なるべく学習しやすいような内容を考えました。

 今回は、スクリプタブル・オブジェクトと一緒に利用することで
抽象化の処理を見えるようにして学習するのが、この教材のポイントです。

 ここで抽象化の処理に慣れることで、スクリプタブル・オブジェクトを使わない、一般的な抽象化の処理も学習していけると思います。



設計


 インターフェースとスクリプタブル・オブジェクトの関係性についてまとめます。

 ISpecialSkill インターフェース
   ↓
 SpecialSkillBase 親クラス(必殺技の元。インターフェース実装、スクリプタブル・オブジェクト継承)
   ↓
 必殺技の名前のクラス 子クラス(各必殺技。親クラスの継承。このクラスをスクリプタブル・オブジェクトとして作成する)

 上記の関係性です。

 このイメージを最初に作ってから、実際にスクリプトを作成していきます。
そのため、処理を書いていく、作っていくためには、設計部分がとても大切になります。


インターフェースを作成する


 必殺技の処理を書くためのメソッドと、後処理を書くためのメソッドの2つを定義しておきます。

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


 後処理については、必殺技の処理が終わったあとに片付けの処理が必要な場合に備えたものです。

 このメソッドを定義しておくことで、このインターフェースを実装したクラスは、この2つのメソッドを必ずクラス内に書かなければなりません。


親クラスを作成する

 
 「必殺技」であることを定義するためのクラスです。

 このクラス、あるいはこのクラスを親として継承している子クラスを「必殺技のクラス」として認識できるようにします。
これが抽象化に向けたポイントの1つです。

 先ほどのインターフェースを実装してクラスを作成します。
子クラスにおいて共通化する変数やメソッドがない場合には、このクラスは不要で、直接インターフェースを実装して問題ありません。

 今回の必殺技については、必殺技という範疇でみた中で共通している設定項目や参照したいクラスなどがあるため、
その部分を抜き出して、親クラスに実装しています。

 このような設計にしておくことで、すべての子クラスで共通の必殺技の設定項目を持たせることが出来ます。


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


 親クラスにインターフェースに書いてあるメソッドを実装していますが、ここでは処理の内容は記述しません。
必殺技の内容については、子クラス内に各メソッドを実装して振る舞いを変える形で必殺技の内容を記述します。

 このクラスが大切なポイントは、プログラムに「必殺技」の定義を認識させるように利用することを前提に作られている部分です。


SpecialSkillBase クラスを継承した子クラスを作成する


 各子クラスは、親クラスである SpecialSkillBase クラスを継承しています。
つまりこれら子クラスは「必殺技の中の、○○という技」としての位置づけになります。個別の必殺技を作る形です。
そして、その親クラスに定義されている2つの仮想メソッドを上書きし、各必殺技の効果となる処理を書いています

 ここではサンプルとして、3つの必殺技を用意しています。そのため、3つの子クラスを作成します。

・すべての敵を倒す
・すべての敵の動きを止める
・プレイヤーの分身キャラを生成する

 先ほども説明があったように、SpecialSkillBase クラスを継承していることで、
それを継承している子クラスは「必殺技」としてプログラムに認識をさせます。

 どの必殺技までかを特定させず、「必殺技であるか、どうか」だけを認識させるようにします。
これも抽象化に向けたポイントです。


RovescioData スクリプトを作成する


 すべての敵を倒す必殺技の処理です。

 親クラスに実装されている BeforeSpecialSkill メソッドを override して、すべての敵を倒す処理を記述しています。

 演出用のエフェクトには別記事にて紹介している EffectManager の機能を利用しています。


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



MezzanotteData スクリプトを作成する


 全ての敵の移動を停止させる必殺技です。

 処理の内容は先ほどのクラスと同様で、親クラスにあるメソッドを override して、停止させる処理を記述しています。

 先ほどの子クラスとの違いは、このクラスでのみ利用する変数があるため、新しい変数の追加を行っている部分です。


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



MagiaData スクリプトを作成する


 プレイヤーの分身を作成します。

 このクラスの場合も変数の追加を行っています。

 このように、各子クラスでのみ利用する変数をそれぞれのクラスに記述していくことで、処理に必要な変数のみを子クラスに記述することが出来ます。

 また今回は追加していませんが、子クラスでのみ利用できるメソッドを定義することも出来ます。


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




各子クラスのスクリプタブル・オブジェクトを作成する


 作成した子クラスはすべて SpecialSkillBase クラスを継承しています。
それぞれが固有の必殺技であるとともに、大きなくくりで見たときには「必殺技」として定義されています。

 SpecialSkillBase クラスにはスクリプタブル・オブジェクトが継承されていますので、
それを継承している子クラスもスクリプタブル・オブジェクトとしての機能を持っています

 早速、子クラスをスクリプタブル・オブジェクトとして作成してみましょう。
全部で3つの子クラスがありますので、3つのスクリプタブル・オブジェクトを作成することが出来ます。

 下記はサンプルです。

メニュー



フォルダ



各子クラスによるスクリプタブル・オブジェクトのインスペクター



 これはすべて必殺技であり、それぞれが固有の必殺技のファイルとしての機能を持ちます。
同じ親クラスを継承しているので、すべての子クラスには共通する設定項目が用意されています。


CharaData スクリプトと CharaDataSO スクリプトを作成し、キャラのデータにスクリプタブル・オブジェクトを必殺技として登録する


 必殺技用のスクリプタブル・オブジェクトを作成しましたが、他のスクリプタブル・オブジェクトと同じで、変数にアサインしないとゲーム内では参照できません

 ここではサンプルとして、キャラの情報用のクラスを作成し、その中に必殺技用の変数を作成して、スクリプタブル・オブジェクトを登録出来るようにします。


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





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




 上記のスクリプトを作成して、キャラ用の CharaDataSO スクリプタブル・オブジェクトを作成し、CharaData を登録できるようにします。

 CharaData 内にある SpecialSkillBase 変数の型は、先ほど作成した子クラスのスクリプタブル・オブジェクトの親クラスである SpecialSkillBase 型です。
この部分を子クラスで指定してしまうと、その子クラスしかアサイン出来ません。特定の技のみ、となるイメージです。

 ですが今回は SpecialSkillBase 型で変数を用意しているため、固有の必殺技ではなく、
もっと大きなくくりである「必殺技」であればアサインできるようにしている部分が重要なポイントです。

 このように「必殺技」なら何でもOKとしているので、親クラスを SpecialSkillBase 型で継承している各子クラスであれば、
どの子クラスのスクリプタブル・オブジェクトでもアサインして登録出来ます

 子クラスのスクリプトではなく、子クラスから作成したスクリプタブル・オブジェクトをアサインします。
間違えないようにしてください。



 この手法において必殺技は CharaData 内にアサインして利用するため、視覚的に確認しやすく、そして自由に付け替えが可能です。

 また、CharaData クラス内の変数は、応用することで複数の必殺技を登録することも可能です。









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

 必殺技の情報が完成したので、次の手順では、ゲーム内で必殺技を実行する機能を作成します。
このとき、分岐処理を作って必殺技を特定する方法ではなく、抽象化を利用したメソッドの振る舞いを変える方法で処理の分岐を行います。

 次は インターフェースとスクリプタブル・オブジェクトを利用した抽象化処理の実装例 です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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