Unity 5で 2Dシューティングのチュートリアルを行う際の注意点(第03回)


Unity公式チュートリアル 2Dシューティング

第03回 プレイヤーから弾を撃つ


上記チュートリアルで、私がつまずいたところ、初心者がつまずきそうなところをピックアップして解説します。

まとめへ戻る≪第02回へ第04回へ≫



3.2 プレイヤーの弾を動かす

親となるPlayerBulletの作成


空のゲームオブジェクトを作成します。作成した空のゲームオブジェクトの名前をPlayerBulletとしてください。

「(i)空のゲームオブジェクトを作る」に書かれているとおり、メニューの[Game Object] -> [Create Empty]からゲームオブジェクトを作成すると、Hierarchyに「Game Object」という名前で空のゲームオブジェクトが作成されます。
これをクリックし、F2キーを押して「PlayerBullet」にリネームします。

PlayerBulletに「Rigidbody2D」をアタッチし、Gravity Scaleを0にします。

作成した「PlayerBullet」をクリックして選択後、Inspector内に表示されるAdd Componentから、Physics 2D > Rididbody 2Dを選択し、「Rigidbody2D」を追加します。
その後、Rigidbody2D内のGravity Scaleを0にします。

Bulletを複製します。ヒエラルキーウィンドウにあるBulletゲームオブジェクトの上で右クリックをして「Duplicate」を選択します。


それぞれのBulletを以下のように配置します。


左のBullet: X -0.14 Y 0 Z 0
右のBullet: X 0.14 Y 0 Z 0

Bulletの複製自体は、記載通りにできます。
Bulletの配置は、まずどちらか片方のBulletを選択後、Inspectorに表示されるTransform内のPositionの横の値をそれぞれ書き換えます。
終わったら、もう片方のBulletを選択し、同様に書き換えます。

最後に、PlayerBulletをPrefab化しましょう。

PlayerBulletを、ProjectタブのPrefabsフォルダにドロップします。

弾を動かす

次にBullet.csファイルをScriptsフォルダの中に作成します。プレイヤーの移動と同じようにrigidbody2D.velocityを使って弾を移動させます。


今回は速度ベクトルは1度のみ変更すれば良いのでStartメソッド内で速度ベクトルの代入を行いましょう。

以前にも書きましたが、Bullet.csを作る時は、リネームまで一気に行いましょう。
ProjectタブのScriptsフォルダを右クリックして「Create -> C# Script」を選択し、生成されたものを「Bullet」にリネームします。
その後、Bulletをダブルクリックして、Bullet.csを編集しましょう。
Bulletクラスの中身は、チュートリアルのソースにまるごと置き換えて大丈夫です。
ただ、先ほどと同じように「rigidbody2D.velocity」の「velocity」が赤くエラーになるので、Crtl+Sで保存後、Unity画面に切り替えて「Go Ahead」を選択して自動修正させるか、自分で「GetComponent().velocity」に書き換えましょう。

Bullet.csをPlayerBulletにアタッチします。Bulletではないので注意してください

HierarchyタブのPlayerBulletへ、ProjectタブのScriptsフォルダ配下にあるBulletをドラッグ&ドロップします。

この段階でゲームを再生してみましょう。


再生と同時に弾が上に飛んでいきましたか?

Game画面では一瞬で画面外に出ていくのでわかりにくいかもしれませんが一応上に飛んでいます。
Scene画面で視点をグッと引くと、ちゃんと上に弾が移動しているのがわかります。
Scene上にマウスカーソルを移動し、ホイールを手前に転がすと、視点を引くことができます。

PlayerBulletのPrefabの更新を行いましょう。Applyを必ず押してください。

Prefabの更新は、HierarchyタブのPlayerBulletオブジェクトを選択し、表示されるInspectorの中で行います。
ゲームオブジェクトに対して行った変更を、Prefabの中に反映させるために、Inspectorの上の方にある「Prefab」文字のに並んでいるボタンのひとつ「Apply」ボタンを押してPrefabを更新します(チュートリアルの図の通りです)。

3.3 プレイヤーから弾を発射する

作成したPlayerBulletのPrefabを使ってスクリプト側からゲームオブジェクトを作成し、弾を発射します。


……中略……


Startメソッドをコルーチンとして呼び出し、0.05秒ごとに弾を撃つようにしてみましょう。

ここでは、Player.csをチュートリアルのソースに置き換えます。
ProjectタブのScriptsフォルダ配下にあるPlayerをダブルクリックし、Player.csを開いて編集しましょう。
ソースを置換したら、Ctrl+Sで保存してUnity画面へ戻ります。
すると、おなじみのAPIが古い云々のダイアログが出るので「Go Ahead!」を押してスクリプトを自動修正させましょう。

public GameObject bullet;というようにpublicで変数を宣言すると、インスペクター上にゲームオブジェクトを格納するための場所が表示されます。


ここにPlayerBulletのPrefabを格納しましょう。

ソースの中に変数宣言を記載すると、Unityエディタ上でもその変数の初期値を設定できるようになります。
ここでは、Player.csを置き換えた時に追加された「public GameObject bullet;」という変数宣言により、UnityエディタのHierarchy > Playerを選択した時、Inspectorに表示される「Player(Script)」の中でPlayer.cs内の変数が視覚化され、内容を書き換えることができるようになります。
「public GameObject bullet;」宣言により、変数は用意されていますが、初期値は入っていません。
よって、チュートリアルの図3.14にあるとおり、Inspector上の「Player(Script)」の変数Bullet枠の中身は「None(Game Object)」となっています。
この枠に、ProjectタブのPrefabsフォルダ配下にあるPlayerBulletをドロップすることによって、PlayerBulletのオブジェクトを初期値として設定することができます。

3.4 スプライトの描画順

Sorting Layer (ソーティングレイヤー)


スプライトの描画順を変更するにはSorting Layerを使用します。
Edit -> Project Settings -> Tags and Layersを選択してください。


「+」ボタンを押してレイヤーを追加します。レイヤー名がBulletとPlayerの2つを作成します。
必ず順序は上からDefault、Bullet、Playerにしてください。この順序が描画順になります。

Sorting LayersはTagsとLayersの間にありますが、最初は折りたたまれているので、右向き三角のアイコンをクリックして開きます。
すると、「+−」ボタンが現われるので、レイヤーを追加していきます。
まず「+」ボタンを押し、空き枠を追加してから、そこに名前を記入します。
まずは「Bullet」を追加し、次に「Player」を追加します。
この順が描画順となるので、順序には注意してください。

PlayerBulletブレハブの中のBulletを2つ選択し、インスペクターにあるSorting LayerをDefaultからBulletへ変更します。

これは、2つ同時に選択した状態で設定を変更することにより、2つのプレハブの設定要素を一度に編集するということです。
Bulletを2つ同時に選択するには、まず一つ目を普通にクリックして選択後、Ctrlを押しながら2つめをクリックします。
この後、Inspector内のSprite Renderer配下にあるSorting Layer設定を、Bulletへと切り替えます。

最後に、PlayerのPrefabを更新しましょう。

忘れずに更新しておきましょう。
HierarchyタブのPlayerを選択後、InspectorのPrefab文字横のApplyボタンを押します。


まとめへ戻る≪第02回へ第04回へ≫