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」を付けて分類できます
- 衝突判定や検索の際に便利
- Player や Enemy など、あらかじめ定義されたものを使ったり、自作したりできます
🛠 弾を撃つ機能を作成する
① Bullet.cs を作成
Assets/_Workspace/Scripts/Bullet/
にBullet.cs
を作成- 衝突したら消える処理を追加
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 を使って弾を発射方向に移動
🌟 実装手順
- Player.prefabに PlayerShooting.cs をアタッチ
- Player.prefabの子オブジェクトに「Muzzle」を作成 位置:プレイヤーの少し前(弾の発射口)
- Bullet.prefab をPlayer.prefabのインスペクター上のPlayeShootingコンポーネントにアサイン(設定)
- ゲームを再生し、Spaceキー を押して弾が発射されるか確認
✅ 動作確認
- 弾が発射され、"Wall" タグ を持つオブジェクトに当たった時に消えるかを確認
- 弾の速度や大きさを調整し、違和感がないか確認
⚠️ よくあるミス
- Tag の設定漏れ:Bullet や Wall にタグが設定されていない
- Collider2D が Trigger になっていない:すり抜けない場合はチェック
- Input の押しっぱなし:GetKeyDown() でなく GetKey() を使うと連射になる
🧠 OnTriggerEnter2D と OnCollisionEnter2D の違い
関数名 | 特徴 | 用途 |
---|---|---|
OnTriggerEnter2D | Trigger と衝突した時に呼ばれる | 当たり判定のみ、すり抜け |
OnCollisionEnter2D | Collider と衝突した時に呼ばれる | 衝突が発生し、力が加わる |
📌 使い分けポイント
- 壁や床など「物理的に止まる」オブジェクトは Collider2D
- 弾丸やアイテムなど「すり抜ける」オブジェクトは Trigger
📝 課題
- Spaceキーを押している間、弾を連続して発射できるようにする
- ヒント:Input.GetKey() を利用して一定間隔で連射する
- 同時に3方向に弾を発射するPlayerを作成してみる
- ヒント:Muzzleを複製して、3方向に向けてみる。 *PlayerShooting.csを複製するのはなし。
+α課題:2を配列やListを使って実装してみましょう!