弾を作る
自機を動かせるようになったので、動かして遊んでいましたが、段々と虚しくなってきました。今度は弾を撃てるようにしましょう。
弾の移動処理を作る
まずは、撃つべき弾を作成します。メニューの
→ → → を選択します。
これが弾です。でかい、でかすぎる!そこで、サイズを小さくしましょう。インスペクタでTransformのサイズをちょちょいといじります。


うん。いい感じになりました。
弾が上に動くようにする
RigidBody2Dを取り付ける
RigidBody2Dはスプライトなどに物理的な動作をさせるためのコンポーネントです。慣性や重力の影響などをシミュレートするためのものですが、今回は弾に上向きの速度を与えるために使用します。メニューの → → を選びます。
2Dリジッドボディが装着できたら、インスペクタで重力スケールを0にします。

スクリプトを取り付ける
弾が動くようにするためにスクリプトを作ります。Scriptsフォルダの中で右クリックして、Bulletに変えてから、スクリプトをダブルクリックして開きます。できたスクリプトの中身は、以下のようになっているはずです。
→ の順に選びます。できたスクリプトの名前をusing UnityEngine;
public class Bullet : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
public class Bullet : MonoBehaviour
{
//このクラスの変数など
Rigidbody2D rb;
float speed = 20f;
クラスのはじめの方に、このように追加します。Rigidbody2D型の変数rbと浮動小数点型の変数speedを宣言します。ついでにspeedの方は20fで初期化しておきます。
次にStart関数の中身を書きます。
void Start()
{
rb = GetComponent<Rigidbody2D>();
rb.linearVelocity = Vector2.up * speed;
}
rb = GetComponent<Rigidbody2D>()というのは、 の変数rbに、このゲームオブジェクトに取り付けてあるRigidbody2Dの情報を結びつける処理です。こうすることによって、このゲームオブジェクトに取り付けてあるRigidbody2Dをスクリプトで操作できるようになります。
rb.linearVelocity = Vector2.up * speed
変数rbを通して、弾のゲームオブジェクトに取り付けたRigidbody2Dの速度を変更します。Vector2.upはVector2(0, 1)と同じ意味です。それにspeedを掛けることで、Vector2(0*speed, 1*speed)=Vector2(0,speed)となります。Vector2のxの値が0なので、横方向には動かず縦方向に動きます。
ここまでできたら、弾のゲームオブジェクトに取り付けます。弾のゲームオブジェクトはsquareのままだと分かりにくいので、Bulletに変更しておきます。
画面から見えなくなった弾を消す
取り付けたら、実行してみます。すると、画面に配置した弾が上に行きました。インスペクタで位置を見てみると、どこまでも上に行っているようです。弾が見えなくなっても、Unityは律儀に弾の移動処理をしてくれています。でも、これは無駄な処理です。今後弾が100発200発と増えるごとに、無駄な処理が増えてきて、その分PCに負荷がかかり、異常な動作を引き起こすでしょう。そこで、画面から見えなくなったら弾を消してしまいましょう。
Update関数の中身を次のようにします。
void Update()
{
if (transform.position.y > 6)
{
Destroy(gameObject);
}
}
弾のゲームオブジェクトのY座標が6を超えた場合、このゲームオブジェクトを消すようにしました。gameObjectはこのスクリプトが取り付けられているゲームオブジェクトのことを指します。これをDestroyすることで、スクリプトごと消し去ってくれます。その結果、無駄な移動処理はそこで止まるというわけです。
実行してヒエラルキーで見てみると、弾が画面から消えたときに弾のゲームオブジェクトも消えました。


最終的なコードは以下の通りになりました。
using UnityEngine;
public class Bullet : MonoBehaviour
{
//このクラスの変数など
Rigidbody2D rb;
const float speed = 20f;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
rb = GetComponent<Rigidbody2D>();
rb.linearVelocity = Vector2.up * speed;
}
// Update is called once per frame
void Update()
{
if (transform.position.y > 6)
{
Destroy(gameObject);
}
}
}
今回はここまでです。お疲れ様でした。
コメント