Unityに関連する記事です

 以下の内容で順番に実装を進めていきます。

手順15 ー手球と障害物との接触処理を実装ー
27.手球用スクリプトを修正し、障害物に接触した際に手球の残数が減るようにする。手球ゲームオブジェクトをプレファブにする
28.BattleManagerを修正し、手球の生成処理と手球が障害物に接触した際の制御処理を追加する



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

・GameObject型ではない、自作クラスを用いたゲームオブジェクトのインスタンス方法



27.手球用スクリプトを修正し、障害物に接触した際に手球の残数が減るようにする。手球ゲームオブジェクトをプレファブにする

設計


 障害物に手球が接触した際に、手球の残数が減り、その情報をUIManagerのUpdateDisplayIconRemainingBallメソッドを呼び出すことで
手球アイコンの数が手球の残数と同じになるようにします。

 手球については、最初からCanvas上に配置するのではなく、ゲーム実行時に、BattleManagerクラスから生成してもらうようにします。
そのため、スクリプト修正後にはCharaBallゲームオブジェクトをプレファブ化します。
また障害物に接触した際には、手球の動きを停止し、この生成した地点をリスタート地点として戻るようにします。

 生成した地点へ戻っている間は手球のコライダーをオフにして、キューラインで弾けないようにし、
戻ったあとには再びコライダーをオンにして弾けるように制御を行います。


CharaBallスクリプトを修正する


 新しい変数の宣言を行い、3つの変数を追加します。新しいメソッドを4つ追加します。既存の内容には変更ありませんので、追記のみしていきます。


CharaBall.cs

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



CharaBall ゲームオブジェクトの設定を行い、プレファブにする


 ヒエラルキーにある CharaBall ゲームオブジェクトを選択し、新しいアサイン情報を設定します。
CapsuleCol 変数が表示されますので、こちらに CharaBall ゲームオブジェクトのCapsuleCollider2D コンポーネントをアサインします。


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



 その後、プレファブにします。プレファブ後はヒエラルキーからは削除してください。
このプレファブになった CharaBallゲームオブジェクトを利用して、BattleManagerクラスから生成してもらうようにします。


手順動画 CharaBall ゲームオブジェクトをプレファブにし、ヒエラルキーからは削除
https://gyazo.com/2103fbf6f64eaca1ee1759f4168f6a71


28.BattleManagerを修正し、手球の生成処理と手球が障害物に接触した際の制御処理を追加する

設計


 プレファブを元に、CharaBallを生成する処理を追加します。障害物に接触した際のCharaBallの制御処理も追加します。


BattleManagerスクリプトを修正する


 新しい変数を3つ宣言して追加します。すべてCharaBallを生成するために必要な変数になります。

 新しいメソッドも2つ追加します。CharaBallの生成メソッドと、障害物に接触した際の処理を行うメソッドになります。
また、Initializeメソッドを修正し、新しく作成するCharaBallを生成するメソッドの呼び出しを追記します。


BattleManager.cs

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



<GameObject型ではない、自作クラスを用いたゲームオブジェクトのインスタンス方法>


 ゲームオブジェクトをスクリプトから生成する際にはGameObject型で宣言した変数にGameObjectであるプレファブをアサインして利用することが多いです。
このとき、親ゲームオブジェクトに自作したクラス(今回はCharaBallクラス)がアタッチされている場合には、GameObject型ではなく、そのクラスを宣言して
同じようにプレファブをアサインしてインスタンスすることが出来ます。

 // 手球を生成。生成する際にCharaBall型のプレファブを使用するので、左辺に用意する変数の型もCharaBall型としている
  CharaBall chara = Instantiate(charaBallPrefab, startCharaTran, false);

 // CharaBall型で生成して変数に代入しているので、すぐにメソッドの呼び出しができる
 chara.SetUpCharaBall(this);

 利点はコメントにもあるように、GameObject型ではなく、CharaBallクラスで生成をしているので、その変数を使うとすぐにメソッドの呼び出しができます。
つまり、GameObject型で生成していた際に、メソッドの呼び出しに必要になっていたクラス取得をするGetComponetの処理が不要になっています。

 // GameObject型で生成
 GameObject charaObj = Instantiate(charaBallPrefab, startCharaTran, false);

 // Enemyクラスのメソッドを呼び出すには、GameObject型では呼び出せないので、Enemyクラスを取得する必要がある
 CharaBall charaBall = charaObj.GetComponent<CharaBall>()

 // メソッドの呼び出し
 chara.SetUpCharaBall(this);

 GetComponentメソッドの処理はあまり軽い処理ではありません。またGameObject型の変数もGetComponent用にわざわざ用意している変数です。
可能であればこのように余分な変数やGetComponentをしないで済む方法で設計し、実装しておいた方がよいでしょう。


Canvas内に空のゲームオブジェクトを作成し、名前を StartCharaTran に変更する


 プレファブ化した CharaBall ゲームオブジェクトを生成する位置を設定するため、生成位置をCanvas内に用意しておきます。
この情報は障害物に接触した際にも利用します。

 位置情報だけを持つゲームオブジェクトを用意しておくことで、このゲームオブジェクトの位置を生成位置として指定することが出来ます。
またアサインしておくことで変数として利用も可能です。

 Canvas上で右クリックをしてメニューを表示し、Create Empty を選択して、名前を StartCharaTran に変更します。
StartCharaTran ゲームオブジェクトの RectTransform コンポーネントを確認して、このゲームオブジェクトが画面の中央に来るように調整してください。
下記のインスペクター画像も参考にしてください。


ヒエラルキー画像



インスペクター画像



Sceneビュー画像



BattleManagerゲームオブジェクトの設定を行う


 BattleManagerクラスを修正しましたので、BattleManagerゲームオブジェクトのインスペクターを確認し、新しく追加した変数へのアサイン情報を設定します。

 charaBallPrefab 変数にはプレファブにした CharaBall ゲームオブジェクトを Prefabs フォルダよりドラッグアンドドロップしてアサインします。
この情報を設計図とし、CharaBallゲームオブジェクトを生成します。

 startCharaTran 変数には先ほど作成した、Canvas内にある StartCharaTran ゲームオブジェクトをドラッグアンドドロップしてアサインします。
このゲームオブジェクトの位置情報を、CharaBallゲームオブジェクトの生成位置と、後程用意する、障害物に接触した際のリスタート地点として利用します。


Obstacle_Holeクラスを修正し、コメントアウトを削除する


 メソッドの準備が整いましたので、先ほどの手順で作成した Obstacle_Holeクラスのコメントアウトを削除します。


public class Obstacle_Hole : ObstacleBase
{
  // オーバーライドして利用する
    protected override void BeforeTriggerEffect(CharaBall charaBall) {

        // 手球を1つ減らす
        charaBall.UpdateHp(-power);                               // <= コメントアウト 削除

        // スタート位置へ戻す
        StartCoroutine(battleManager.RestartCharaPosition(2.0f));       // <= コメントアウト 削除
    }
}


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


 ゲームを実行し、手球が生成されるか確認しましょう。


実行動画 手球が生成される
https://gyazo.com/eca85fb9e6edf2f166e44c758396efa5


 その後、手球と障害物とが接触した際に

ー蟲紊了朕堯CharaBallクラス)と手球アイコンの数が減るか
⊆蟲紊生成された位置まで自動的に移動をするか
L瓩辰討い覺屬魯ューラインで弾けないかどうか
ぅ螢好拭璽箸靴晋紊砲郎討喘討韻襪茲Δ砲覆辰討い襪

 これらも一緒に確認してください。もしも正常に動かない機能があれば、手順13から順番に見なおしをしてみてください。


実行動画
https://gyazo.com/e864b7abc95c32bfe342053ec618ce7f


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

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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