概要

Unityのスクリプトを使ってクリックやタッチした場所をめがけて弾などのオブジェクトを打ち出す方法を紹介します。

環境

  • Unity 2021.3.14f1

内容

Unityでシューティングゲームのようなものを作成する際に、ユーザーがマウスでクリックしたりスマホやタブレットでタップしたりした場所に、弾などのオブジェクトを発射したいということがあります。

ここでは、C#のスクリプトを用いてこの機能を実装する方法を紹介します。

実装

Unityでは、画面上のクリックやタップの位置を取得することができ、さらに画面の中央からその位置までのベクトルを計算できる関数が用意されています。

今回は、これらの機能を用いて実装します。弾を生成するのには、Addressablesを用いています。

Camera cam; // カメラ

// 弾のオブジェクト準備
var op = Addressables.LoadAssetAsync<GameObject>("Assets/Prefabs/Bullet.prefab");
var bulletPrefab = op.WaitForCompletion();
Addressables.Release(op);

if (Input.GetMouseButtonDown(0)) // クリックやタップをしたとき
{
    // カメラの位置をもとにその場所に弾を生成
    var cameraPos = cam.transform.position;
    var bulletPos = new Vector3(cameraPos.x, cameraPos.y, cameraPos.z);
    var bullet = Instantiate(bulletPrefab, bulletPos, Quaternion.identity);

    // カメラの位置からクリックやタップをした位置までのベクトルを計算
    var ray = cam.ScreenPointToRay(Input.mousePosition);
    var worldDir = ray.direction;

    // 弾のリジットボディに対して力を加えて打ち出す
    var bulletRb = bullet.GetComponent<Rigidbody>();
    bulletRb.AddForce(worldDir * 0.3f, ForceMode.Impulse);
}

ScreenPointToRayを用いて、クリックやタップをされたスクリーン上の位置までのベクトルを計算しています。さらに、そのベクトルへAddForceにより力を加えて打ち出すという流れになります。このような処理のため、たまにはRigidbodyのコンポーネントを付与する必要があります。

さいごに

処理自体は複雑でありませんが、弾を生成するなどの処理が含まれるため、少し複雑になっています。