Unity 6|手に持ったアイテムを投げる
本記事では、Unity 6(6000系)+新Input System を使って「手に持っているアイテムを前方に投げる」仕組みを最小構成で実装します。
ポイントは次の 5 つ:
- 手に持つ=子オブジェクト化
- 投げる時に親子関係を解除
- Rigidbody2D.AddForce で初速を与える
- gravity を ON/OFF で投擲挙動を切替
- linearVelocity による等速弾の作成
放物線(投げ物)と等速(弾丸)の使い分けをUnity 6 の最新仕様で解説します。
完成イメージ
- Player が Item を手に持つ
- Space キーで前へ投げる
- gravity ON → 放物線で落下
- gravity OFF → 直進速度維持(linearVelocity)
- 一定時間後に自動消滅
シーン準備
① Player
- GameObject「Player」右方向(+X)を前方とする
② Item
Player の子として作成し、以下を付けます:
| Component | 設定 |
|---|---|
| Rigidbody2D | BodyType = Dynamic gravityScale = 0(手に持っている間は落ちない) |
| Collider2D | Box or Circle |
重力は 投げた時に有効化します。
1枚のスプライトシートからアニメーションを作る手順から手順になります
今回は、弾の代わりにコインのスプライトを使います
後に回転のアニメーションをつけることもできます
スプライトの切り出し
手順は省略しています

弾をプレイヤーの子オブジェクトにします

子オブジェクトに必要なコンポーネントをアタッチ

プレイヤーに後述のスクリプトをアタッチ

(補足)子オブジェクトの名前を変更

スクリプト:基本版
(投擲・放物線+線形速度対応)
using UnityEngine;
using UnityEngine.InputSystem; // Input System(簡易)
public class ThrowItem2D_Simple : MonoBehaviour
{
[SerializeField] Transform item; // 手に持っているアイテム(子)
[SerializeField] float throwForce = 5f; // AddForce 用
[SerializeField] float linearSpeed = 5f; // linearVelocity 用
[SerializeField] bool useGravity = true; // 投げ方切替
void Update()
{
if (Keyboard.current != null && Keyboard.current.spaceKey.wasPressedThisFrame)
{
Throw();
}
}
void Throw()
{
if (item == null) return;
// 親から切り離し(ワールド座標維持)
item.SetParent(null, true);
var rb = item.GetComponent<Rigidbody2D>();
if (rb != null)
{
if (useGravity)
{
// ① 重力あり → 放物線
rb.gravityScale = 1f;
rb.AddForce(transform.right * throwForce, ForceMode2D.Impulse);
}
else
{
// ② 重力なし → 等速直進(Unity6推奨=linearVelocity)
rb.gravityScale = 0f;
rb.linearVelocity = transform.right * linearSpeed;
}
}
// 後処理
Destroy(item.gameObject, 2f);
item = null;
}
}
コード解説
◆ 手に持つ間
Item は Player の子でありTransform によって位置が維持されるため、gravityScale = 0 にしておくのが自然です。
落下しない=重力OFF
◆ 投げる瞬間
item.SetParent(null, true);
で子から外し、独立させます。
① 放物線で飛ばす(投げ物)
- gravityScale = 1
- AddForce により初速を付与
rb.gravityScale = 1f;
rb.AddForce(transform.right * throwForce, ForceMode2D.Impulse);
- 石や槍など「投げる」動作向き
② 等速で直進させる(弾丸)
Unity 6 では velocity 代入は非推奨 のため、代わりに linearVelocity を使用します。
rb.gravityScale = 0f;
rb.linearVelocity = transform.right * linearSpeed;
※ drag = 0 の場合、速度が落ちない
※ collider による衝突判定は有効
AddForce vs linearVelocity(比較)
| 項目 | AddForce | linearVelocity |
|---|---|---|
| Unity推奨度 | ○ | ◎ |
| 動作 | 力を加える → 初速 | 速度を直接設定 |
| 初速安定性 | 低い | 高い |
| 等速運動 | △ dragで変化 | ◎ |
| 放物線 | ◎ | △ |
| 操作性 | 普通 | 簡単 |
| 用途 | 投擲物 | 弾丸/魔法弾 |
投げ物 → AddForce
弾丸 → linearVelocity
gravity の整理
| 状態 | gravityScale | 挙動 |
|---|---|---|
| 手に持っている間 | 0 | 落ちない |
| 投げる(投擲) | 1 | 放物線 |
| 投げる(弾丸) | 0 | 直進 |
よくあるトラブル
| 症状 | 原因 |
|---|---|
| 落ちない | gravityScale が 0 |
| 速度が落ちる | drag が大きい |
| 当たり判定がない | Collider2D がない |
| 投げ方向が変 | transform の向きがずれている |
| key反応なし | GameViewフォーカス不足 |
Tips
Kinematic で固定しても良い?
手に持つ間 isKinematic = true でもOK。ただし「投げる瞬間に再び Dynamic に戻す」制御が必要になるためgravityScale の切替の方が簡単です。
どっちを使うべき?
| 目的 | 実装 |
|---|---|
| 投げ物(石・槍・斧) | AddForce + gravity |
| 弾丸・ビーム | linearVelocity |
| 魔法 | linearVelocity or AddForce |
悩んだら
放物線 → AddForce
直進 → linearVelocity
まとめ
| 状態 | gravityScale | 力学 | API |
|---|---|---|---|
| 手に持つ | 0 | 物理無視 | – |
| 投げる(放物線) | 1 | 物理有効 | AddForce |
| 投げる(等速) | 0 | 物理軽め | linearVelocity |
- 手に持つ間は gravityScale = 0
- 投げたら AddForce or linearVelocity
- 弾丸なら linearVelocity(Unity6推奨)
- 投擲なら AddForce + gravity
おわりに
本記事では手に持ったアイテムを投げる基本システムを Unity 6 の仕様に沿って整理しました。
- 子オブジェクト → 独立
- 重力の ON/OFF
- AddForce / linearVelocity 使い分け
- 放物線 vs 等速
これらを押さえると
- ボム
- 弾丸
- 拾い直し
- オブジェクトプールなどにも発展できます。




ディスカッション
コメント一覧
まだ、コメントがありません