その1に引き続き2Dシューティングを作るチュートリアルです。
前回は自機の作成と十字キーでの操作までやったので次はそこから弾を出してみます。
弾を発射できるようにする
弾の作成
まず弾のオブジェクトを作成します。形はなんでも良いんですけど、Cylinder か Sphere を細長くしたようなものが弾っぽいと思います。ここでは Sphere を引き伸ばして弾とします。
作ったらこれを動かす為に物理挙動で動くようにします。選択した状態で Component -> Physics -> Rigidbody を選択し、Rigidbody コンポーネントを付けます。
したら弾の Inspector 画面に Rigidbody が表示されるのでゲームの仕様に合うように変更します。2Dのゲームなので Use Gravity はオフ, Freeze Position の Y にチェック, そして弾は回転させる必要が無いので Freeze Rotation の x,y,z にそれぞれチェックを入れます。
設定が終わったらこれをプレハブ化します。Project画面にドラッグするだけです。プレハブ化したら Hierarchy 画面からは消して大丈夫です。
弾を自機から出す
何かボタンを押したら自機から弾が出るようにしましょう。前回作成した Player スクリプトに追記していきます。
var bulletPrefab : GameObject;
var bulletInterval : float = 0.2;
var bulletEnable : boolean = true;
var bulletVelocity : float = 100;
var bulletTime : float = 0.0;
(省略)
function Update () {
(省略)
// Jumpボタン(通常はSpaceキー)で弾を発射する
if (Input.GetButton("Jump") && bulletEnable) {
bulletEnable = false;
// 弾をプレハブから作成する。
var bullet = Instantiate(bulletPrefab, transform.position, transform.rotation);
// 弾の発射方向を指定, z軸を真っ直ぐ飛ぶようにした。
var direction : Vector3 = Vector3(0,0,1);
// 弾に対して力を加えてやると真っ直ぐ飛ぶ。
bullet.rigidbody.AddForce(direction * bulletVelocity, ForceMode.VelocityChange);
}
// 弾の発射間隔を調節する。大体秒間5発ぐらい。
bulletTime += Time.deltaTime;
if (bulletTime > bulletInterval) {
bulletTime = 0.0;
bulletEnable = true;
}
}
スクリプトを書いたら Player の Inspector でスクリプト内に bulletPrefab という項目が現れるのでここに弾のプレハブをドラッグします。何も問題なければこれで動きます。
が、ぱっと見正常に動いてないです。これは、弾が別の弾や自機に衝突してしまってるからです。なので弾同士や自機と弾はぶつからないように設定を行う必要があります。
そのためにはレイヤーを使用します。
レイヤー別に当たり判定を設定する
Edit -> Project Settings -> Tags を選択すると Inspector 画面に Tag と Layer の一覧が表示されます。
Builtin Layer は Unity が用意しているレイヤーで、その下にある User Layer に自分の好きなように追加できます。とりあえず Player と Bullet を追加しておきましょう。
追加したら Edit -> Project Settings -> Physics を選択します。
Layer Collision Matrix というのが下にあるのでそこで各レイヤー毎に当たり判定を行うかを設定します。Player と Bullet がぶつからなければ良いので以下のようになってればOKです。
設定したら hierarchy 画面で Player を選択し、Inspector 画面で Layer の値を Player に、同様に Project 画面で Bulletのプレハブを選択し、 Layer を Bullet とします。
この状態で再生ボタンを押すと、真っ直ぐ飛ぶはずです。
で、この状態だと残念な事に自機の後ろから弾が出ています...。弾をマイナス方面に発射するのはわかりにくいので Inspector 画面 Transform -> Rotation で Y を180としてから自機の向きを180度回転させましょう。
続く...。
コメント
初めまして
先日からここを見て作らせて戴いている者です
このページの自機から弾を出す、のプログラムを書くと、
if (Input.GetButton("Jump") && bulletEnable) {
この文が間違っているとエラーが出ます
どうすれば良いのでしょうか?
それだけではどのようなエラーが出ているのかわかりませんが、ダブルクォートなどが文字参照になってませんか?コピペするとおそらく動かないと思います。