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」
  • SpriteRenderer(任意)
  • 右方向(+X)を前方とする

② Item

Player の子として作成し、以下を付けます:

Component設定
SpriteRenderer任意
Rigidbody2DBodyType = Dynamic, gravityScale:0(手に持っている間は落ちない)
Collider2DBox or Circle

重力は 投げた時に有効化します。


スクリプト:基本版

(投擲・放物線+線形速度対応)

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(比較)

項目AddForcelinearVelocity
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 等速

これらを押さえると

  • ボム
  • 弾丸
  • 拾い直し
  • オブジェクトプールなどにも発展できます。

訪問数 4 回, 今日の訪問数 4回

Unity,Unity6

Posted by hidepon