Week02_Shooting - M-634/unity-game-dev-tutorial GitHub Wiki

🎯 今回のゴール

  • 弾を発射し、壁に衝突したら弾が消えるようにする
  • GameObject.Instantiate() でオブジェクトを生成する方法を理解する
  • 当たり判定の基本(OnTriggerEnter2D / OnCollisionEnter2D の違い)
  • UnityEngine の Tag の使い方を学ぶ

🧭 準備・導入

① Unityプロジェクトを開く

  • 前回と同様に、unity-game-dev-tutorial プロジェクトを開きます

② 必要なオブジェクトの準備

  • Assets/_Workspace/Prefabs/ に新規で Bullet プレハブを作成

  • 弾の見た目には小さな 丸型スプライト を使う

  • 前回作成したWallオブジェクトに”Wall” Tagを設定しておく

③ Bullet プレハブに必要なコンポーネント

  • Rigidbody2D
    • Gravity Scale: 0
  • CircleCollider2D
    • Is Trigger にチェックを入れる

💡 UnityのTagとは?

  • Unity ではオブジェクトに「Tag」を付けて分類できます
  • 衝突判定や検索の際に便利
  • PlayerEnemy など、あらかじめ定義されたものを使ったり、自作したりできます

🛠 弾を撃つ機能を作成する

① Bullet.cs を作成

  1. Assets/_Workspace/Scripts/Bullet/Bullet.cs を作成
  2. 衝突したら消える処理を追加
using UnityEngine;

[RequireComponent(typeof(Rigidbody2D), typeof(BoxCollider2D))]
public class Bullet : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Wall"))
        {
            Destroy(gameObject);  // 弾を消す
        }
    }
}

② PlayerShooting.cs を作成 Assets/_Workspace/Scripts/Player/ に PlayerShooting.cs を作成

Spaceキーで弾を発射する処理を追加


using UnityEngine;

public class PlayerShooting : MonoBehaviour
{
     [SerializeField]
     private Transform _muzzle;
        
     [SerializeField]
     private GameObject _bulletPrefab;
        
     [SerializeField]
     private float _bulletSpeed = 10f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Shoot();
        }
    }

    void Shoot()
    {
        // 弾を生成
        GameObject bullet = Instantiate(_bulletPrefab, _muzzle.position, Quaternion.identity);
            
        if(bullet.TryGetComponent(out Rigidbody2D rigidBody2D))
        {
            Vector2 velocity = _muzzle.up * _bulletSpeed;
            rigidBody2D.velocity = velocity;
        }
        else
        {
            Debug.LogWarning($"Bullet.prefabにRigidBody2Dコンポーネントがありません。");
        }
    }
}

###📝 ポイント解説 Instantiate()メソッドで指定位置・回転で弾を生成

Instantiate()メソッドの引数の説明

  • Instantiate(生成したいもの, 生成したい場所, 生成したものの向き)

Rigidbody2D の velocity を使って弾を発射方向に移動

🌟 実装手順

  1. Player.prefabに PlayerShooting.cs をアタッチ
  2. Player.prefabの子オブジェクトに「Muzzle」を作成 位置:プレイヤーの少し前(弾の発射口)
  3. Bullet.prefab をPlayer.prefabのインスペクター上のPlayeShootingコンポーネントにアサイン(設定)
  4. ゲームを再生し、Spaceキー を押して弾が発射されるか確認

✅ 動作確認

  • 弾が発射され、"Wall" タグ を持つオブジェクトに当たった時に消えるかを確認
  • 弾の速度や大きさを調整し、違和感がないか確認

⚠️ よくあるミス

  • Tag の設定漏れ:Bullet や Wall にタグが設定されていない
  • Collider2D が Trigger になっていない:すり抜けない場合はチェック
  • Input の押しっぱなし:GetKeyDown() でなく GetKey() を使うと連射になる

🧠 OnTriggerEnter2D と OnCollisionEnter2D の違い

関数名 特徴 用途
OnTriggerEnter2D Trigger と衝突した時に呼ばれる 当たり判定のみ、すり抜け
OnCollisionEnter2D Collider と衝突した時に呼ばれる 衝突が発生し、力が加わる

📌 使い分けポイント

  • 壁や床など「物理的に止まる」オブジェクトは Collider2D
  • 弾丸やアイテムなど「すり抜ける」オブジェクトは Trigger

📝 課題

  1. Spaceキーを押している間、弾を連続して発射できるようにする
  • ヒント:Input.GetKey() を利用して一定間隔で連射する
  1. 同時に3方向に弾を発射するPlayerを作成してみる
  • ヒント:Muzzleを複製して、3方向に向けてみる。 *PlayerShooting.csを複製するのはなし。

+α課題:2を配列やListを使って実装してみましょう!

🔗 参考リンク

Unity公式ドキュメント:Instantiate

Unity公式ドキュメント:OnTriggerEnter2D

Unity公式ドキュメント:Tag