UnityUnityメモ

初心者必見!Unityでプレイヤーがクリックした位置から弾を発射するスクリプト

Unity

はじめに

Unityを使ったゲーム開発では、「クリックすると弾を発射する」機能は非常に基本的なスキルです。特に、シューティングゲームやアクションゲームでは欠かせない要素ですよね。

でも、初めてスクリプトを書く初心者にとっては、「どうやってスクリプトを作るのか」や「オブジェクトを動かす仕組み」が少し難しく感じるかもしれません。

そこで今回は、Unity初心者でも簡単に理解できるように、クリックで弾を発射するスクリプトを一から作る方法を詳しく解説します!Unityに触ったことがないという方はコチラの記事から見てみてください!




弾のオブジェクトの作成方法

Unityで弾を発射する仕組みを作るには、いくつかの準備が必要です。以下の手順に沿って、プロジェクトを設定していきましょう。

1.新しいオブジェクトの作成

ヒエラルキー画面で右クリックし、「3D Object」から「Sphere」(または任意の形状)を選択します。これが弾の基本形状になります。

2.オブジェクトのサイズ調整

作成した球体(または選択した形状)のサイズが大きすぎる場合は、インスペクター画面で「Scale」の値を調整して、弾に適した大きさにします。

3.物理特性の追加

弾に物理的な挙動を持たせるために、オブジェクトに「Rigidbody」コンポーネントを追加します。これを追加すると、弾が重力の影響を受けたり、他のオブジェクトと衝突したりするようになります。「Add Component」ボタンをクリックし、「Rigidbody」を選択して追加します。  

4.色を変更する

弾の見た目を変更するには、マテリアルを作成して適用します。

プロジェクト画面で右クリックし、「Create」→「Material」を選択して新しいマテリアルを作成します。

作成したマテリアルを弾のオブジェクトにドラッグ&ドロップし、色やテクスチャをカスタマイズします。 

5.Prefabにする

弾のオブジェクトが完成したら、再利用しやすくするためにプレハブ化します。プロジェクト画面に弾のオブジェクトをドラッグ&ドロップして、プレハブを作成します。

 




スクリプトの作成

それでは、弾を発射するためのスクリプトを作成していきましょう!Unityでスクリプトを書くのが初めての方はコチラの記事から見てみてください!

弾のprefabにアタッチするスクリプト

コード全体の説明

このスクリプトは、Unityで弾丸(bullet)が常に前方に飛ぶようにするものです。弾丸に力を加えて、前に進む動きを作っています。

各部分の説明

  1. ライブラリのインポート
    • using System.Collectionsusing System.Collections.Generic は、コレクション(リストや配列など)を使うためのものです。ここでは使っていませんが、標準で書かれています。
    • using UnityEngine は、Unityの機能を使うために必要です。
  2. クラスの宣言
    • public class bullet で新しいクラス(設計図)を作っています。
    • MonoBehaviour を継承することで、Unityのゲームオブジェクトとして振る舞います。
  3. 変数の宣言
    • public float bulletForce = 1.0f; は、弾丸に加える力の大きさを決める変数です。
    • public Rigidbody rb; は、弾丸に物理的な動きを与えるためのRigidbodyコンポーネントを格納する変数です。
  4. Updateメソッド
    • void Update() は、毎フレーム(1秒間に何回も)呼ばれるメソッドです。
    • rb = GetComponent<Rigidbody>(); で、ゲームオブジェクトにアタッチされたRigidbodyコンポーネントを取得しています。
    • rb.AddForce(0, 0, bulletForce, ForceMode.Impulse); で、弾丸に前方向(Z軸方向)へ力を加えています。この力は瞬間的なもので、弾丸を前に押し出す働きをします。

全体の動き

  1. このスクリプトがアタッチされた弾丸オブジェクトは、常に前方に力を受け続けます。
  2. 毎フレーム、Rigidbodyコンポーネントを取得し、前方に力を加えることで、弾丸が前に進みます。

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

public class bullet : MonoBehaviour
{
    public float bulletForce = 1.0f;
    public Rigidbody rb;

    void Update()
    {
        rb = GetComponent<Rigidbody>();
        rb.AddForce(0, 0, bulletForce, ForceMode.Impulse);
    }
}

空のオブジェクトにアタッチするスクリプト

全体の説明

このスクリプトは、Unityで弾を撃つためのものです。マウスの左ボタンをクリックすると、画面上に弾が発射されます。

各部分の説明

  1. public GameObject bulletPrefab;
    • これは弾のテンプレート(プレハブ)を指定するための変数です。Unityのエディタでこのスクリプトが付いたオブジェクトに、弾のプレハブをドラッグ&ドロップします。
  2. private Vector3 mousePosition;
    • これはマウスの位置を保存するための変数です。クリックした位置を取得して、弾をその方向に飛ばすのに使います。
  3. void Update()
    • Update関数は毎フレーム(1秒間に何十回も)呼び出される関数です。ここで、マウスの入力をチェックして、弾を撃つ処理をします。
  4. if (Input.GetMouseButtonDown(0))
    • Input.GetMouseButtonDown(0)はマウスの左ボタンが押された瞬間を検知します。0は左ボタンを意味します。
  5. mousePosition = Input.mousePosition;
    • Input.mousePositionはマウスの現在の位置を取得します。画面上の2D座標(X, Y)を得ます。
  6. mousePosition.z = 10.0f;
    • mousePosition.z = 10.0f;はマウスの位置に深さを加えます。これは3D空間でどこに弾を配置するかを決めるために必要です。
  7. Instantiate(bulletPrefab, Camera.main.ScreenToWorldPoint(mousePosition), Quaternion.identity);
    • Instantiateは新しいオブジェクトを作る関数です。この場合、bulletPrefab(弾のプレハブ)を作ります。
    • Camera.main.ScreenToWorldPoint(mousePosition)は、画面上の2D座標を3D空間の座標に変換します。これで弾が正しい位置に生成されます。
    • Quaternion.identityは回転を意味します。ここでは、弾を回転させずにそのままの向きで生成します。

全体の動き

  1. ゲームが始まると、毎フレームUpdate関数が呼ばれます。
  2. マウスの左ボタンがクリックされると、マウスの位置を取得します。
  3. その位置に基づいて、弾のプレハブを生成し、指定された位置に配置します。
using UnityEngine;

public class BulletShooter : MonoBehaviour
{
    public GameObject bulletPrefab;
    private Vector3 mousePosition;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            mousePosition = Input.mousePosition;
            mousePosition.z = 10.0f;
            Instantiate(bulletPrefab, Camera.main.ScreenToWorldPoint(mousePosition), Quaternion.identity);
        }
    }
}

このスクリプトを空のオブジェクトにアタッチしたらinspector画面から弾のprefabを設定しておきます。




動作確認

これで設定は完了です!プレイボタンを押して、シーンを実行してみましょう。画面をクリックすると、プレイヤーがクリックした位置に向かって弾を発射するはずです。

これで、プレイヤーがクリックした位置から弾を発射する方法についての説明は終わりです。お役に立てたでしょうか?次回もまた、楽しく学べるUnityの記事をお届けしますね!


おすすめのアセット

クリックで弾を発射する機能をさらに手軽に、そしてプロフェッショナルな仕上がりにするための優れたアセットを紹介します。それぞれが異なる側面でゲームのクオリティを高めるので、ぜひチェックしてみてください!

1. UFPS: Ultimate FPS

おすすめポイント
UFPSは、一人称視点(FPS)のシューティングゲームを作成するための総合ツールキットです。キャラクターの操作や武器の発射、リロードのアニメーションまで、すべてが簡単に設定可能です。複雑なプログラムを書く必要がなく、初心者でもスムーズにゲームを構築できます。
「自分で一から作るのはハードルが高い」と感じている方には最適! これ一つで、プロ級のFPSを短時間で仕上げられます。


2. PRO Effects: FPS Muzzle flashes & Impacts

おすすめポイント
弾を発射した瞬間の「マズルフラッシュ」や、弾が何かに当たった時の「インパクトエフェクト」が揃ったビジュアルエフェクトパックです。リアルな銃撃シーンを演出したい方には必須!特にFPSやアクションゲームでは、こういったディテールがプレイヤーの没入感を高めます。
「弾を発射するたびにカッコいいエフェクトが光る」…そんなワンランク上の演出を目指しませんか?


3. Gun Sound Pack

おすすめポイント
リアルで迫力のある銃声が多数収録されたサウンドパックです。シューティングゲームでの音の演出は、プレイヤーのゲーム体験を大きく左右します。このパックを使えば、発射音やリロード音までプロのようなサウンドを簡単に追加できます。
「音でゲームの雰囲気を一気に格上げしたい!」という方にぴったりです。


これらのアセットを組み合わせて使うと、ゲーム全体の完成度が格段にアップします。初心者でも、まるでプロが作ったようなクオリティを目指せるのが嬉しいポイント。ぜひ気になるアセットを試してみてください!


まとめ

今回は、Unityでクリックした場所から弾を発射する機能を作る方法を解説しました。この機能は、シューティングゲームやアクションゲームでよく使われる基本的な技術の一つです。

これで、クリックするだけで弾を発射する仕組みが完成です!今回学んだことを応用すれば、シューティングゲームをさらに発展させたり、他の面白い仕掛けを作ったりすることもできます。

ぜひこの記事を参考に、オリジナルゲーム作りにチャレンジしてみてください!一緒にUnityでのゲーム開発を楽しみましょう!

よくある質問

Q
弾が発射されないのはなぜですか?
A

いくつかの原因が考えられます。まず、Projectile Prefabが正しく設定されているか確認してください。また、スクリプトにエラーがないか、Rigidbodyコンポーネントが正しく追加されているかも確認しましょう。

Q
弾のスピードを調整するにはどうすればいいですか?
A

bulletスクリプトのbulletForce変数の値を変更することで調整できます。Inspectorウィンドウからも変更できます。

Q
弾がターゲットに当たったときに消えるようにするには?
A

弾のスクリプトにOnCollisionEnterメソッドを追加して、衝突時に弾を破壊するコードを書きます。

void OnCollisionEnter(Collision collision)
{
    Destroy(gameObject);
}