UnityUnityメモ

Unityでボールを発射!飛距離を測定する方法を初心者向けに解説

Unity

はじめに

この記事では、クリック操作でボールを発射し、そのボールが飛んだ距離を測定する方法を解説します。今回のチュートリアルでは、Unityの基本操作に加え、物理演算の活用方法や簡単なスクリプトの作成方法を学ぶことができます。

「どうやってボールを飛ばすの?」「飛距離を測定するにはどんなスクリプトが必要?」といった疑問を解消しながら、実際に動くプログラムを作っていきましょう!初心者でもわかりやすく解説していくので、ぜひ一緒に試してみてくださいね。

Unityを触ったことがないという方はコチラの記事から見てみてください!



2. ボールのPrefabを作成しよう

ボールを発射するためには、まずボールのPrefab(テンプレートオブジェクト)を作成する必要があります。以下の手順に従って進めましょう。


1. ヒエラルキーから球体を作成する

  1. Unityのヒエラルキーウィンドウを右クリックします。
  2. 表示されたメニューから「3D Object」→「Sphere」を選択します。
  3. 作成された球体にわかりやすい名前をつけましょう。「Ball」と名前を変更します。

2. Rigidbodyを追加する

次に、ボールに物理演算の要素を追加します。

  1. 作成した「Ball」を選択します。
  2. インスペクターウィンドウにある「Add Component」ボタンをクリックします。
  3. Rigidbody」と検索して選択し、ボールに追加します。
    • この操作により、ボールは重力の影響を受けて落下したり、発射時に力を加えることができるようになります。

3. Prefab化する

最後に、このボールをPrefab化して使い回しやすくします。

  1. ヒエラルキーウィンドウの「Ball」をプロジェクトウィンドウのAssetsフォルダにドラッグ&ドロップします。
  2. プロジェクトウィンドウに「Ball」のPrefabが作成されます。
    • これで、シーンに複数のボールを簡単に配置したり、プログラムで動的に生成できるようになりました。

ここまででボールのPrefabが完成です!次のステップでは、このボールを発射して飛距離を測定するスクリプトを作成します。引き続き進めましょう!



3.飛距離測定スクリプトの作成

このセクションでは、ボールの飛距離を測定するスクリプト「BallDistance」を作成します。このスクリプトは、ボールが発射された位置と地面に落下した位置の差を計算し、その距離をコンソールに表示します。

スクリプト作成の手順

  1. スクリプトの作成
    • プロジェクトウィンドウを右クリックして、「Create」→「C# Script」を選択します。
    • 新しいスクリプトに「BallDistance」という名前を付けて、エディタで開きます。
  2. コードを記述 以下のコードをスクリプトにコピーして貼り付けてください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallDistance : MonoBehaviour
{
    private float startPos;  // ボールの発射地点を記録する変数
    private float endPos;    // ボールの落下地点を記録する変数
    private float distance;  // 発射地点と落下地点の距離を計算する変数

    // ボールが発射されたときに初期位置を記録するメソッド
    public void StartSet()
    {
        startPos = this.transform.position.z; // ボールのz座標を記録
    }

    void Update()
    {
        // ボールがY座標0(地面)以下に落ちた場合
        if (transform.position.y <= 0.0f)
        {
            // ボールをシーンから消去
            Destroy(gameObject);

            // 落下地点のz座標を記録
            endPos = this.transform.position.z;

            // 発射地点と落下地点の距離を計算
            distance = endPos - startPos;

            // コンソールに飛距離を表示
            Debug.Log("飛距離: " + distance + "メートル");
        }
    }
}

コードのポイント解説

  • startPos と endPos の役割
    startPos はボールが発射された地点の z 座標を記録します。一方、endPos はボールが地面に落ちた時点の z 座標を記録します。この2つの値の差分を計算することで、ボールの飛距離を求めます。
  • Update メソッドでの監視
    ボールが地面に接触(Y座標が0以下)したかどうかをリアルタイムで監視します。
  • Destroy メソッドの使用
    ボールが地面に到達したら、ゲームオブジェクトとしてのボールを削除します。
  • Debug.Log を使った出力
    計算された飛距離をコンソールに表示し、簡単に結果を確認できるようにしています。

スクリプトを保存したら、次のステップでボール発射スクリプトを作成し、ボールにこのスクリプトをアタッチする手順を進めていきます。



4. ボール発射スクリプトの作成

このステップでは、クリック操作でボールを発射するスクリプト「BallShot」を作成します。このスクリプトを使うことで、マウスの左クリックでボールを好きな方向に飛ばせるようになります。

スクリプトを作成する手順

  1. 新しいスクリプトの作成
    プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選びます。名前を「BallShot」とします。
  2. スクリプトの編集
    作成した「BallShot」スクリプトをダブルクリックして、エディタ(Visual StudioやRiderなど)で開きます。以下のコードを入力してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallShot : MonoBehaviour
{
    public GameObject ball;  // ボールのPrefabを設定

    void Update()
    {
        // マウスの左クリックでボールを発射
        if (Input.GetMouseButtonDown(0))
        {
            // ボールのインスタンスを生成
            GameObject obj = Instantiate(ball) as GameObject;

            // Rayを飛ばして、クリックした方向にボールを発射
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Vector3 dir = ray.direction;

            // ボールに力を加えて発射
            obj.GetComponent<Rigidbody>().AddForce(dir * 1000);

            // 飛距離測定のための初期位置をセット
            obj.GetComponent<BallDistance>().StartSet();
        }
    }
}

コードのポイント

  • Instantiate を使用
    マウスクリック時にボールのPrefab(事前に作成した「Ball」)を複製してシーンに生成します。
  • Rayを使用した方向取得
    Camera.main.ScreenPointToRay(Input.mousePosition) で、クリックした画面上の位置を基準に発射方向を取得しています。
  • 力を加える
    AddForce を使用して、ボールに物理的な力を加え、発射しています。このときの力の大きさ(1000)は必要に応じて調整可能です。
  • 飛距離測定の準備
    ボールにアタッチされた「BallDistance」スクリプトの StartSet() メソッドを呼び出して、飛距離測定の初期設定を行っています。



5. シーンへのスクリプト設定

このステップでは、作成したスクリプトをシーン内のオブジェクトにアタッチし、ボールを発射できる環境を整えます。以下の手順に従って設定を進めてください。

1. 空のオブジェクトを作成する

  1. ヒエラルキーウィンドウを右クリックします。
  2. メニューから「Create Empty」を選択します。
  3. 作成された空のオブジェクトに名前を付けます(例:「BallLauncher」)。

2. BallShotスクリプトをアタッチする

  1. BallLauncherオブジェクトを選択します。
  2. インスペクターウィンドウで「Add Component」をクリックします。
  3. BallShot」と検索し、作成したスクリプトを追加します。

3. ボールPrefabを設定する

  1. BallLauncherオブジェクトを選択したまま、インスペクターウィンドウを確認します。
  2. BallShot」スクリプトの中にある「Ball」というフィールドを見つけます。
  3. プロジェクトウィンドウの「Assets」フォルダから、作成したボールのPrefabをこのフィールドにドラッグ&ドロップします。

4. ボールにBallDistanceスクリプトをアタッチする

  1. プロジェクトウィンドウで、ボールのPrefabをダブルクリックして開きます。
  2. インスペクターウィンドウで「Add Component」をクリックします。
  3. BallDistance」と検索し、作成したスクリプトを追加します。
  4. 変更を保存して、Prefabウィンドウを閉じます。

5. カメラの位置を調整する(必要に応じて)

ボールが画面外に飛び出さないように、カメラの位置を調整して、発射シーン全体が見えるようにします。

  1. ヒエラルキーウィンドウで「Main Camera」を選択します。
  2. インスペクターウィンドウで、カメラの位置(TransformのPosition)や向き(Rotation)を調整します。

これで、スクリプトが正しくシーンに設定され、ボールを発射する準備が整いました!次のステップでは、テストプレイを実行して、正常に動作するか確認してみましょう。



6. テストプレイ

さあ、スクリプトと設定が完了したら、いよいよテストプレイの時間です!以下の手順に従って、正しく動作しているか確認しましょう。

テストプレイの手順

  1. シーンを保存する
    万が一のトラブルに備えて、今のシーンを保存しておきましょう。
    • メニューバーから「File」→「Save As」を選び、シーンにわかりやすい名前を付けて保存します。例:「BallLaunchTestScene」。
  2. ゲームを実行する
    Unityエディターの上部にある「▶(再生)」ボタンをクリックして、ゲームを実行します。
  3. ボールを発射してみる
    • ゲームウィンドウをクリックしてアクティブにします。
    • マウスの左クリックを押すと、ボールが発射されます。ボールがクリックした方向に飛んでいくことを確認してください。
  4. 飛距離をコンソールで確認する
    • ボールが地面に落ちると、Unityのコンソールに飛距離が表示されます。
    • 表示例:makefileコードをコピーする飛距離: 15.3メートル

動作確認ポイント

  • ボールが正しい方向に飛んでいるか
    マウスクリックした位置に応じてボールが発射されていることを確認してください。
  • 飛距離が正しく計算されているか
    ボールが落下すると、発射地点と落下地点の距離が正しく表示されているか確認しましょう。
  • エラーが出ていないか
    Unityのコンソールに赤いエラーが出ていないか確認してください。もしエラーがある場合は、スクリプトや設定を見直してみましょう。

問題が発生した場合

もし以下のような問題が発生した場合は、設定やスクリプトを再確認してください:

  • ボールが発射されない
    → 「BallShot」スクリプトの ball フィールドに正しいPrefabが設定されているか確認。
  • コンソールに飛距離が表示されない
    → 「BallDistance」スクリプトがPrefabのボールにアタッチされているか確認。

問題なく動作したら、ボール発射と飛距離測定のプログラムは成功です!お疲れさまでした。さらに応用して、得点を表示したり、ボールの種類を変える機能を追加してみましょう。楽しみながらUnityを学んでいってくださいね! 🚀



よくある質問

Q
ボールが発射されない場合はどうすればいいですか?
A

以下のポイントを確認してください:

  • 「BallShot」スクリプトの ball フィールドに正しいPrefabが設定されているか確認します。
  • カメラが正しく配置され、マウスクリック時に適切な位置にRayを飛ばしているか確認します。
  • RigidbodyがボールのPrefabに追加されているか確認してください。
Q
コンソールに飛距離が表示されないのですが、原因は何ですか?
A

飛距離が表示されない場合、以下を確認してください:

  • 「BallDistance」スクリプトがボールのPrefabにアタッチされていることを確認します。
  • ボールが地面に落ちた際にY座標が0以下になることを確認してください(地面の高さが異なる場合、条件を調整してください)。
  • 「BallDistance」スクリプトの StartSet メソッドがボール生成時に正しく呼び出されていることを確認します。
Q
ボールが正しい方向に飛ばない場合はどうすればいいですか?
A

以下を試してみてください:

  • カメラの位置と方向を調整し、Rayの飛ばし先が正確になるように設定します。
  • 「BallShot」スクリプト内の AddForce メソッドで適切な力を加えているか確認してください(値を調整してみるのも有効です)。
  • 地形や障害物がボールの飛行を妨げていないか確認します。

おすすめのアセット

「Shoot Pong – Complete Game Template」は、シンプルかつ楽しいゲームをすぐに作成できるテンプレートです。このアセットでは、シューティングとピンポンを融合させたゲームを簡単に作成でき、カスタマイズもしやすい仕様になっています。コードのソースも含まれているため、必要に応じて調整しやすく、初心者から経験者まで幅広い層に対応します。