Unityでグレネードを投げる #1 爆発させて周りのオブジェクトを吹き飛ばす - Unityの使い方



Unity -> 物理 -> Unityでグレネードを投げる #1 爆発させて周りのオブジェクトを吹き飛ばす

Unityでグレネードを投げる #1 爆発させて周りのオブジェクトを吹き飛ばす

Rigidbody.AddExplosionForceを使って、手榴弾を作ってみます。前の記事では、常にシーンの中心で爆破させていましたが、今回は投げたグレネードからの爆発の力を加えます。

力を周りのオブジェクトに加えるには、スクリプトを使って、タグによって周りのオブジェクトを検索して、一つ一つのオブジェクトのRigidbodyを取得します。

まずシーンにたくさん配置したCubeのプレハブに「Cube」タグを付けます。


グレネードのプレハブを作り、コライダーとRigidbody、新しいスクリプトを付けます。




スクリプトで、グレネードが生成されて数秒後にグレネードを爆発させます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GrenadeScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Invoke("Explode", 1.5f); // グレネードが作られてから1.5秒後に爆発させる
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    void Explode()
    {
        GameObject[] cubes = GameObject.FindGameObjectsWithTag("Cube"); //「Cube」タグのついたオブジェクトを全て検索して配列にいれる

        if (cubes.Length == 0) return; // 「Cube」タグがついたオブジェクトがなければ何もしない。

        foreach (GameObject cube in cubes) // 配列に入れた一つひとつのオブジェクト
        {
            if (cube.GetComponent<Rigidbody>()) // Rigidbodyがあれば、グレネードを中心とした爆発の力を加える
            {
                cube.GetComponent<Rigidbody>().AddExplosionForce(100f, transform.position, 30f, 5f, ForceMode.Impulse);
            }
        }
    }
}

FindGameObjectsWithTag()で、「Cube」タグのついたオブジェクトを全て検索し、foreachで一つひとつのオブジェクトに爆発の力を加えています。

以前の記事で使ったボールを投げるスクリプトを新規の空のゲームオブジェクトにつけてグレネードを投げてみます。




「Cube」タグの付いていないオブジェクトには爆発の力を与えません。

赤いオブジェクトは「Cube」タグが付いていないので、白いオブジェクトとぶつかって動いているだけで、直接爆発の力を受けて上に飛んでいくことはありません。

FPSコントローラからグレネードを投げることもできます。


FPSコントローラのカメラのついたオブジェクトに新規スクリプトを付けています。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ThrowGrenadeScript : MonoBehaviour
{

    public float thrust = 20f;
    public GameObject grenade;
    Rigidbody rb_grenade;

    // Start is called before the first frame update
    void Start()
    {
        rb_grenade = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) // マウスの左クリックをしたとき
        {
            rb_grenade = Instantiate(grenade, transform.position, transform.rotation).GetComponent<Rigidbody>(); // グレネードを生成
            rb_grenade.AddForce(Vector3.Lerp(transform.forward,transform.up, 0.5f) * thrust, ForceMode.Impulse); // グレネードに力を一度加える
        }
    }
}

Vector3.Lerp()を使えば、2つの点の中間の点の座標が得られます。FPSコントローラの視線と頭上への座標を引数にしているので、カメラが向いている方向の斜め上へグレネードが飛びます。

トップページへ


tags: グレネード, 爆発, Rigidbody, 物理