5.敵の作成
Mobシーンの作成
プレイヤー側を作成しましたので、次は敵側を作成します。作るのはMobシーンです。
まずは画面の表示を戻しておきましょう。画面上部のタブから「2d」を選び、2Dビューにします。また、右側のサイドパネルで「ノード」ドックを選んでいたものを「インスペクター」ドックに戻します。
まずはMobシーンを作ります。トップメニューの「シーン」から「新規シーン」を選択します。
まだ何もノードがない空のシーンが表示されます。
シーンの「ルートノードを生成」の「その他のノード」ボタンをクリックして、「RigidBody2D」を追加します。
そして、「RigidBody2D」の名前を「Mob」に変更します。
2Dビューの上部にあるアイコンの中で、鍵マークの右隣にあるアイコン
「選択したノードをグループ化」をクリックします。「Player」シーンと同じ作業です。
この設定をおこなうことで、ビューで子グループをクリックしたときに、自動で親が選択されます。誤って子ノードを移動してしまうというミスを防げます。
ここでいったん「Ctrl+S」でシーンを保存しておきましょう。名前がmob.tscnとなっているので、そのまま保存ボタンを押します。
「ファイルシステム」ドックにmob.tscnが追加されました。
子ノードの追加
続いて「Mob」を右クリックして「子ノードを追加」を選び、次の3つのノードを追加します。追加したら「Ctrl+S」で保存します。
-
Mob(RigidBody2D)
- AnimatedSprite2D
- CollisionShape2D
- VisibleOnScreenNotifier2D
それぞれのノードが、どのようなノードなのかを簡単に説明します。
RigidBody2Dを直訳すると「硬い体2D」です。PhysicsBody2D(物理シミュレーションによって動かされる2D物理ボディ)を継承しており、完全な2D物理を実装しています。
このノードは、重力や衝突などをあつかえ、変形せずに形状を保ちます。倒せる木や動かせる木箱など、環境内で相互作用するオブジェクトに向いています。
AnimatedSprite2Dは、既に出てきたノードです。アニメーションフレームとして複数のテクスチャを持ちます。アニメーションはSpriteFramesリソースを使用して作成されます。
CollisionShape2Dも、既に出てきたノードです。直訳すると「衝突形状2D」です。親にShape2Dを提供し、編集できるようにします。このノードは、Area2Dに検出シェイプを与えたり、PhysicsBody2Dをソリッド オブジェクトに変換したりできます。
VisibleOnScreenNotifier2Dを直訳すると「画面上での表示を通知する2D」です。
このノードは、2D空間の長方形領域を表しており、この領域の一部が画面上またはビューポート内に表示されるとscreen_enteredシグナルが発行されます。また、領域の一部が表示されなくなるとscreen_exitedシグナルが発行されます。
このノードを使えば、画面内に登場したり、退出したりするタイミングを知ることができます。
設定の追加
まずは重力を切ります。2D物理では、画面下に向けて重力が発生しています。これは横視点のアクションゲームのための機能です。そのままでは敵が画面下に落下してしまいます。今回作るのは上から見下ろす視点のゲームなので、下方向の重力は不要です。
「シーン」ドックで「Mob」ノードを選択します。「インスペクター」ドックの一番上にある「RigidBody2D」の「Gravity Scale」の値を0にします。そして「Ctrl+S」で保存します。
続いて「インスペクター」ドックの「CollisionObject2D」の「Collision」グループを開きます。
デフォルトでは、「Layer」の「1」、「Mask」の「1」にチェックが入っています(色が変わってアクティブになっています)。「Mask」の「1」のチェックを外して非アクティブの状態にします。そして「Ctrl+S」で保存します。
こうすることで「Mob」同士が衝突しなくなります。
アニメーションの追加
次は、「Player」の時と同じようにアニメーションを追加していきます。
「シーン」ドックで「AnimatedSprite2D」を選択します。「インスペクター」ドックの「AnimatedSprite2D」の「Animation」グループを開きます。「Sprite Frames」が「<空>」になっていますので、クリックして「新規 SpriteFrames」を選びます。
項目「Sprite Frames」に設定した「SpriteFrames」(新規に追加したもの)をクリックすると、画面下部に「アニメーション」と「アニメーション フレーム」のパネルが開きます。
「アニメーション」にあらかじめ入っている「default」の名前を「fly」に変更します。そして、「アニメーション フレーム」に、「ファイルシステム」ドックのart/enemyFlyingAlt_1.png、art/enemyFlyingAlt_2.pngを順番にドロップします。
また、「アニメーション」の「5.0 フレームレート(FPS)」という入力欄に「3」と入力します。
同じように「swim」と「walk」を作成します。それぞれ「アニメーション」の下の「ファイルに+記号のアイコン」をクリックしてアニメーションを追加します。そして名前を設定します。
「swim」には、「ファイルシステム」ドックのart/enemySwimming_1.png、art/enemySwimming_2.pngを順番にドロップします。
「walk」には、「ファイルシステム」ドックのart/enemyWalking_1.png、art/enemyWalking_22.pngを順番にドロップします。
そして、それぞれ「アニメーション」の「5.0 フレームレート(FPS)」という入力欄に「3」と入力します。また「Ctrl+S」で変更を保存します。
次に、「Player」の時と同じように「Mob」の画像を小さくします。「Node2D」の「Transform」グループを開き、「Scale」の「x」と「y」の値を「0.75」にします。そして「Ctrl+S」で変更を保存します。
CollisionShape2Dの設定
次に衝突形状を設定します。
「シーン」の「CollisionShape2D」を選択します。「インスペクター」の「CollisionShape2D」の「Shape」が「<空>」になっているのでクリックします。そして「新規 CapsuleShape2D」を選択します。
Playerの時と同じように作業をやりやすいようにビューの位置と拡大率を変えましょう。2Dビューの左上にあるUIの、左端にあるボタン(中心ビュー)をクリックします。次に、「+」ボタンを何回かクリックして見やすいサイズに拡大します。
カプセルの向きが縦長なので横向きにします。「インスペクター」ドックの「Node2D」>「Transform」グループを開き、「Rotation」を「90」にします。
赤色のハンドルを操作して、青色の領域が次のような状態になるようにします。そして「Ctrl+S」で保存します。
