#5 弾を発射できるようにする(前編)

2Dシューティング
このブログは、趣味でプログラミングを勉強中の筆者が、実験を繰り返しながら、WordPressの使い方の練習も兼ねて、備忘録のように記事を残していくものです。Unityのバージョンは6000.0.32f1です。

弾を作る

自機を動かせるようになったので、動かして遊んでいましたが、段々と虚しくなってきました。今度は弾を撃てるようにしましょう。

今回のゴール

弾の移動処理を作る

まずは、撃つべき弾を作成します。メニューのゲームオブジェクト2Dオブジェクトスプライト正方形を選択します。

これが弾です。でかい、でかすぎる!そこで、サイズを小さくしましょう。インスペクタでTransformのサイズをちょちょいといじります。

うん。いい感じになりました。

弾が上に動くようにする

RigidBody2Dを取り付ける

RigidBody2Dはスプライトなどに物理的な動作をさせるためのコンポーネントです。慣性や重力の影響などをシミュレートするためのものですが、今回は弾に上向きの速度を与えるために使用します。メニューのコンポーネント2D物理2Dリジッドボディを選びます。

取り付ける対象のゲームオブジェクトを選択した状態になっているか確認してください。

2Dリジッドボディが装着できたら、インスペクタで重力スケールを0にします。

重力スケールが大きいと重力の影響を大きく受けて速く落下するようになります。マイナスにすると上に浮かんでいきます(上に落下する感じ?)。

スクリプトを取り付ける

弾が動くようにするためにスクリプトを作ります。Scriptsフォルダの中で右クリックして、作成MonoBehaviourスクリプトの順に選びます。できたスクリプトの名前をBulletに変えてから、スクリプトをダブルクリックして開きます。できたスクリプトの中身は、以下のようになっているはずです。

Bullet.cs

以前も書きましたが、クラス名とファイル名が合っていないと正常に動作しないので、クラス名がBulletになっていない場合は、修正します。

クラスのはじめの方に、このように追加します。Rigidbody2D型の変数rbと浮動小数点型の変数speedを宣言します。ついでにspeedの方は20fで初期化しておきます。

次にStart関数の中身を書きます。

rb = GetComponent<Rigidbody2D>()というのは、Rigidbody2D型の変数rbに、このゲームオブジェクトに取り付けてあるRigidbody2Dの情報を結びつける処理です。こうすることによって、このゲームオブジェクトに取り付けてあるRigidbody2Dをスクリプトで操作できるようになります。

rb.linearVelocity = Vector2.up * speed

変数rbを通して、弾のゲームオブジェクトに取り付けたRigidbody2Dの速度を変更します。Vector2.upVector2(0, 1)と同じ意味です。それにspeedを掛けることで、Vector2(0*speed, 1*speed)=Vector2(0,speed)となります。Vector2xの値が0なので、横方向には動かず縦方向に動きます。

ちなみに、yの値を負の値にすると、下に向かって動くようになります。今後、下に向かって移動する物に使えそうですね。

ここまでできたら、弾のゲームオブジェクトに取り付けます。弾のゲームオブジェクトはsquareのままだと分かりにくいので、Bulletに変更しておきます。

画面から見えなくなった弾を消す

取り付けたら、実行してみます。すると、画面に配置した弾が上に行きました。インスペクタで位置を見てみると、どこまでも上に行っているようです。弾が見えなくなっても、Unityは律儀に弾の移動処理をしてくれています。でも、これは無駄な処理です。今後弾が100発200発と増えるごとに、無駄な処理が増えてきて、その分PCに負荷がかかり、異常な動作を引き起こすでしょう。そこで、画面から見えなくなったら弾を消してしまいましょう。

Update関数の中身を次のようにします。

弾のゲームオブジェクトのY座標が6を超えた場合、このゲームオブジェクトを消すようにしました。gameObjectはこのスクリプトが取り付けられているゲームオブジェクトのことを指します。これをDestroyすることで、スクリプトごと消し去ってくれます。その結果、無駄な移動処理はそこで止まるというわけです。

実際は画面の解像度やカメラの設定によって、座標が6でもゲームオブジェクトが画面内に残っているかも知れません。雑な処理ですが、現段階ではこのままにしておきます。

実行してヒエラルキーで見てみると、弾が画面から消えたときに弾のゲームオブジェクトも消えました。

最終的なコードは以下の通りになりました。

Bullet.cs

今回はここまでです。お疲れ様でした。

コメント

タイトルとURLをコピーしました