Unityに関連する記事です

 2Dゲームにおいて、プレイヤーを軸にして公転する弾の機能の応用例です。

 公転する弾がプレイヤーの周囲にあるとき、ボタンを押すことで、
プレイヤーの向いている方向に弾をまとめて投射する機能を作成します。


<応用例 ーボタンを押すとプレイヤーの進行方向に弾をまとめて投射するー>
動画ファイルへのリンク


 事前に前回の手順の実装が必要になります。

  => 【2D】プレイヤーを軸にして公転する弾の機能

 この機能の実装にあたっても、ゲームオブジェクトの親子関係を活用します。



1.公転する弾をまとめるための ThrowingBullet ゲームオブジェクトの作成とプレハブ化


 公転する弾を投射するにあたり、弾1つずつを制御するのではなく、
それらを束ねるためのゲームオブジェクトを作成し、その子オブジェクトとして公転する弾をセットします。

 そのための親役となるゲームオブジェクトを作成し、プレハブにします。
Create Empty で新しいゲームオブジェクトを作成します。ThrowingBullet に名前を変更します。

 親オブジェクトの Transform の設定は初期値(Position と Rotation は両方とも(0,0,0)、Scale は(1,1,1)) に設定してください。

 また、Rigidbody2D コンポーネントをアタッチし、Gravity Scale を 0 にして重力の影響を受けない状態にします。
合わせて、Constraint の Freeze Rotation Z にチェックを入れて回転しないようにします。


構成




 下記は各オブジェクトの参考値です。


<親オブジェクト インスペクター画像>



 外見上はなにもないゲームオブジェクトになります。

 完成したらプレハブにしてください

 プレハブ後はヒエラルキーから削除してください。


2.<弾を投射させるクラスのサンプルコード>


 公転する弾を束ねて、プレイヤーの向いている方向に投射する制御クラスを作成します。

 先ほど作成した ThrowingBullet プレハブにアタッチして利用します。



ThrowingBullet.cs

<= クリックしたら開きます。


 今回のケースも、ゲームオブジェクトの親子関係を上手く活用した機能になっています。


3.ThrowingBullet プレハブに ThrowingBullet スクリプトをアタッチする


 ThrowingBullet プレハブに ThrowingBullet スクリプトをアタッチします。



インスペクター画像



4.<弾を生成するクラスの修正用サンプルコード>


 先ほどの手順で作成した OrbitingBulletGenerator をスクリプトを修正します。

 投射する弾を生成し、初期設定する命令と発射する命令を実行する機能を追加します。



OrbitingBulletGenerator.cs

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



5.修正したスクリプトの設定を行う


 Generator スクリプトがアタッチされているゲームオブジェクトのインスペクターを確認し、新しく追加した変数の設定を行います。


インスペクター画像




 throwingBulletPrefab 変数には、投射する弾をアサインします。
今回は ThrowingBullet プレハブをドラッグアンドドロップしてアサインしてください。

 throwingSpeed 変数は投射する速度、duration は投射する弾の生存期間です。生存期間後に破壊されます。

 下記は参考値です。


インスペクター画像



6.攻撃処理用のスクリプトを修正する


 前回の修正内容はそのまま利用します。
そのほかに、ボタンを押したときに公転する弾を投射させる処理の命令と、公転する弾の再生成の処理の命令を追加します。

 抜粋しますので、自分のプロジェクトに合わせて実装してください。



 仮に CharaController としています。

CharaController.cs


 スクリプトを修正したらセーブします。 


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


 ゲームを実行して動作を確認しましょう。

 漠然と動かすのではなく、自分が作成したスクリプトの内容を確認し、処理が正常に動作しているかを見極める力をつけていってください。

 インスペクターで生成する弾の数を指定できますので、値を変更しながらデバッグして確認する必要があります
弾の数に応じて等間隔で配置されるかを確認しましょう。


<確認動画 ーボタンを押すとプレイヤーの進行方向に弾をまとめて投射するー>
動画ファイルへのリンク


 上手く動かない場合には、Unity 内の設定や、スクリプトの内容を見直してください。

・Rigidbody2D コンポーネントが、子オブジェクト(OrbitingBullet オブジェクト)にアタッチされている
  → 親子のオブジェクトの両方に Rigidbody2D がアタッチされていると競合してしまい、物理演算が正常に行われなくなる。投射せず停止するなど

・子オブジェクト(OrbitingBullet オブジェクト)に OrbitingBullet スクリプトがアタッチされている
  → プレイヤーの位置で公転を繰り替えそうとするため、回転しながら予期しない方向に飛んでいく

 これらによって、正常に動作しなくなりますので、当てはまる場合にはチェックしてみてください。
 


 以上で完成です。

 次は発展編です。弾に関連する処理について、いくつかのリファクタリング手法を学習しましょう。

 インターフェースと抽象クラスを活用し、弾を抽象化して設計する方法や、
弾を毎回生成/削除する方法ではなく、オブジェクトプールの機能を利用してリサイクルできる方法などです。

 弾の機能を抽象化することで、処理の共通化や、異なる弾の制作を効率化することが出来ます。
またオブジェクトプールを利用することで、生成/削除処理を効率化し、不用意な生成と削除の処理を予防することで処理の負荷軽減が行えます。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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