UnityUnityメモ

Unity初心者でもできる!ランダム位置にボールを発射する方法を解説

Unity

1. はじめに

こんにちは!今回の記事では、指定されたエリア内でターゲットをランダムに移動させ、そのターゲットに向けてボールを発射する方法を解説します。

この記事では、Unity初心者でも安心して取り組めるように、具体的なステップを丁寧に説明します。ターゲットの作成からスクリプトの設定、テストプレイまでを順を追って説明するので、一緒に進めてみましょう!

完成後は、Unityの基本操作だけでなく、スクリプトを使ったオブジェクト操作の楽しさも感じられるはずです。さっそく始めていきましょう!

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



2.ターゲットを作成する

まずは、ボールを発射するターゲットを作成しましょう。このターゲットは、ボールが向かう目標になります。以下の手順に従って作業を進めてください。

1. ターゲットオブジェクトの作成

  1. ヒエラルキーウィンドウを右クリックします。
  2. 表示されるメニューから「3Dオブジェクト」→「Cube」を選択します。
  3. 作成されたCubeを選択し、Inspectorウィンドウの上部で名前を「Target」に変更します。

2. ターゲットの位置を調整

  1. 「Target」を選択した状態で、Inspectorウィンドウの「Transform」セクションを確認します。
  2. Positionの値を以下のように設定します。
    • X: 0
    • Y: 0
    • Z: -10

3. ボックスコライダーの設定を外す

  1. Inspectorウィンドウで「Box Collider」のセクションを探します。
  2. 右側にあるチェックボックスをクリックして、ボックスコライダーを無効にします。

ポイント
ボックスコライダーを無効にすることで、ターゲットが物理的な衝突判定を持たなくなります。この操作は必須です!

4. メインカメラの位置を調整

次に、カメラがターゲットをしっかり映すように位置を調整します。

  1. ヒエラルキーウィンドウで「Main Camera」を選択します。
  2. Inspectorウィンドウの「Transform」セクションで、以下のように設定します。
    • X: 0
    • Y: 0
    • Z: -15

これで、メインカメラがターゲットを正しく映すようになります。自分のプロジェクトで見やすいように調整してみてください!


これでターゲットオブジェクトの作成と配置は完了です!次のステップでは、ボールを発射するための位置を設定していきます。



3.ボール発射位置を作成する

次に、ボールを発射するための位置を設定します。ここでは空のオブジェクトを使用して、ボールが発射される基準となる場所を作成します。

手順

  1. ヒエラルキーウィンドウで作成
    • ヒエラルキーウィンドウを右クリックします。
    • Create Empty(空のオブジェクトを作成)」を選択します。
    • 作成されたオブジェクトを選択し、名前を「ShotManager」に変更してください。
  2. オブジェクトの位置を設定
    • 「ShotManager」を選択した状態で、インスペクターウィンドウを確認します。
    • Transform」コンポーネント内のPositionを以下のように設定してください:
      • X: 0
      • Y: 0
      • Z: 0
  3. 発射方向を調整
    • 「ShotManager」がターゲットを向くように調整します。
    • 必要に応じて、TransformのRotationを調整してターゲット(「Target」オブジェクト)が正面に来るようにしてください。

注意ポイント

  • 「ShotManager」は目に見えないオブジェクトですが、ボールを発射する基準となる重要な役割を持ちます。
  • 「Transform」のPositionが正しく設定されていないと、ボールの発射位置がズレてしまうため、確認を忘れずに行いましょう。

これでボール発射位置の作成は完了です!次は、ボールを実際に発射するためのPrefabを作成していきます。



4. ボールのPrefabを作成する

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


1. Sphere(球体)の作成

  1. ヒエラルキーウィンドウを右クリックします。
  2. **「3Dオブジェクト」→「Sphere」**を選択して、シーン内に球体を作成します。
  3. 作成した球体の名前を「Ball」に変更してください。
    • 名前の変更は、ヒエラルキーウィンドウ内でオブジェクトを選択し、F2キーを押して行います。

2. Rigidbody(リジッドボディ)の追加

ボールに物理演算を適用するため、Rigidbodyコンポーネントを追加します。

  1. ヒエラルキーウィンドウで「Ball」を選択します。
  2. インスペクターウィンドウで「Add Component」ボタンをクリックします。
  3. Rigidbody」と入力して検索し、選択して追加します。
  4. 必要に応じて以下の設定を確認または変更してください:
    • Mass(質量): デフォルト値(1.0)で問題ありません。
    • Use Gravity(重力を使用): チェックが付いていることを確認してください。

3. BallをPrefabにする

Prefabとは、再利用可能なオブジェクトのテンプレートです。これを作成しておくと、同じボールを何度も使い回すことができます。

  1. ヒエラルキーウィンドウから「Ball」を選択します。
  2. プロジェクトウィンドウ内の空いているスペースに「Ball」をドラッグ&ドロップします。
    • これで「Ball」がPrefabとしてプロジェクトウィンドウに登録されます。
  3. Prefab化した後、ヒエラルキー内の元の「Ball」オブジェクトは削除して構いません。
    • 削除するには、ヒエラルキーウィンドウで「Ball」を右クリックし、**「Delete」**を選択します。

これで、ボールのPrefab作成が完了しました!このPrefabは、後ほどスクリプトで生成され、ターゲットに向けて発射されます。次のステップでは、ボールを発射するためのスクリプトを作成していきます。続けて取り組んでみましょう!



5. ボールを発射するスクリプトの作成

ここでは、ボールを指定したターゲットに向けて発射するスクリプト「BallShot」を作成します。このスクリプトを使えば、指定したターゲットにボールを簡単に発射することができます!


1. スクリプトの作成

まずはスクリプトを作成しましょう。

  1. プロジェクトウィンドウを右クリックして「Create」→「C# Script」を選択します。
  2. 新しいスクリプトの名前を「BallShot」に変更します。

2. スクリプトを編集する

「BallShot」スクリプトをダブルクリックして、以下のコードを入力してください。

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

public class BallShot : MonoBehaviour
{
    public GameObject target; // 発射するターゲット
    public GameObject ball; // 発射するボール
    public float ballSpeed; // ボールの速度

    void Start()
    {
        // スクリプトを開始したときにターゲットを向く
        transform.LookAt(target.transform);
    }

    void Update()
    {
        // 毎フレームターゲットの方向を向き続ける
        transform.LookAt(target.transform);
    }

    public void BallThrow()
    {
        // ボールを発射するコルーチンを実行
        StartCoroutine("Throwing");
    }

    IEnumerator Throwing()
    {
        // ボールを生成して発射
        var shot = Instantiate(ball, transform.position, Quaternion.identity);
        shot.GetComponent<Rigidbody>().velocity = transform.forward.normalized * ballSpeed;
        yield return new WaitForSeconds(1.0f); // 1秒待機
    }
}

3. スクリプトをオブジェクトにアタッチする

  1. 作成したスクリプト「BallShot」を**「ShotManager」**オブジェクトにドラッグ&ドロップしてアタッチします。

4. Inspectorで設定を行う

次に、Inspectorウィンドウで以下の設定を行います。

  1. Target: ヒエラルキー内の「Target」オブジェクトをドラッグ&ドロップします。
  2. Ball: 作成したボールPrefabをドラッグ&ドロップします。
  3. Ball Speed: ボールの発射速度を設定します(例: 5.0)。

5. コードの動作を確認

設定が完了したら、ボールがターゲットに向かって発射されるか確認しましょう。

  • ターゲットの方向にボールが発射され、物理挙動で進んでいれば成功です。
  • もし動作しない場合は、コードやInspectorの設定を確認してください。

これでボールを発射するスクリプトの作成は完了です!次はターゲットをランダムに移動させるスクリプトを作成して、ゲームに動きを加えましょう!



6. ターゲットをランダムに移動するスクリプトの作成

この記事では、ターゲットの位置をランダムに変更するスクリプトを作成します。このスクリプトにより、ターゲットが定期的にランダムな位置に移動し、そこへボールを発射できるようになります。以下の手順に従って進めてください!


スクリプトを作成する

  1. プロジェクトウィンドウを右クリック
    • 「Create」→「C# Script」を選択します。
    • スクリプト名を TargetMove にします。
  2. 作成したスクリプトを Target オブジェクトにアタッチします。
    • ヒエラルキーで「Target」を選択し、Inspectorにスクリプトをドラッグ&ドロップします。

コードを記述する

以下のコードを「TargetMove」スクリプトに入力してください。

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

public class TargetMove : MonoBehaviour
{
    private float time;         // タイマー
    private float vecX;         // X座標のランダム値
    private float vecY;         // Y座標のランダム値
    private bool isShot;        // ボールが発射されたかどうかのフラグ
    public GameObject shotManager; // ボールを発射するスクリプトの参照

    void Start()
    {
        isShot = false; // 最初はボール未発射
        time = 1.0f;    // タイマーを初期化
    }

    void Update()
    {
        // タイマーを減少させる
        time -= Time.deltaTime;

        // タイマーがゼロ以下になった場合
        if (time <= 0)
        {
            isShot = false; // フラグをリセット

            // ランダムな位置を計算
            vecX = Random.Range(-2.0f, 2.0f); // X軸の範囲
            vecY = Random.Range(0.0f, 3.0f);  // Y軸の範囲
            this.transform.position = new Vector3(vecX, vecY, -10); // ターゲットの新しい位置を設定

            // タイマーをリセット
            time = 1.0f;

            // ボールがまだ発射されていない場合のみ発射
            if (!isShot)
            {
                shotManager.GetComponent<BallShot>().BallThrow(); // ボールを発射
                isShot = true; // 発射フラグを立てる
            }
        }
    }
}

コードのポイント解説

  1. ランダムな位置の生成
    • Random.Range(-2.0f, 2.0f) はX軸の範囲をランダムに選びます。
    • Random.Range(0.0f, 3.0f) はY軸の範囲をランダムに選びます。
    • transform.position を使ってターゲットの位置を更新します。
  2. タイマーの設定
    • time -= Time.deltaTime で毎フレームタイマーを減少させます。
    • タイマーがゼロ以下になったらランダムな位置に移動し、再度タイマーをリセットします。
  3. ボールの発射
    • shotManager.GetComponent<BallShot>().BallThrow() を呼び出してボールを発射します。
    • isShot フラグで、1回のランダム移動ごとにボールが1回しか発射されないよう制御します。

Inspectorでの設定

  1. 「Target」を選択します。
  2. Inspectorの「ShotManager」フィールドに「ShotManager」オブジェクトをドラッグ&ドロップして設定します。

これで、ターゲットが一定間隔でランダムな位置に移動し、ボールを発射する仕組みが完成しました!次はテストプレイを行い、正しく動作するか確認してみましょう。



7. テストプレイ

最後に、今回作成した仕組みを実際に動かしてみましょう。以下の手順でテストプレイを行います。


ステップ 1: シーンを保存する

まず、Unityのシーンを保存します。これにより、進行中の作業を失わずに済みます。

  1. メニューバーの「File」→「Save As」をクリックします。
  2. 任意の名前(例: “RandomBallTest”)を付けて保存します。

ステップ 2: 再生ボタンを押す

  1. Unityエディターの上部中央にある「再生ボタン(三角形のアイコン)」をクリックします。
  2. ゲームビューに切り替わり、シーンが実行されます。

ステップ 3: 動作を確認する

次のポイントを確認してみましょう。

  • ターゲットが1秒ごとにランダムな位置に移動するか。
  • ボールがターゲットに向けて発射されるか。
  • ボールがターゲットに到達する速度や動きが適切か。

もし思った通りに動作しない場合は、以下をチェックしてください。

  • スクリプトの設定: 「ShotManager」や「Target」のInspectorで、必要なオブジェクトや値が正しく設定されているか確認します。
  • エラーメッセージ: Unityのコンソールウィンドウに表示されるエラーを確認し、問題を特定します。

ステップ 4: 発射速度を調整する

発射されたボールの速度が速すぎたり遅すぎたりする場合は、「BallShot」スクリプトの Ball Speed の値を変更してみてください。

  1. 「ShotManager」を選択します。
  2. Inspectorの「Ball Speed」フィールドを見つけます。
  3. 数値を調整して適切な速度を設定します。(例: デフォルト値が10の場合、5や15に変更)

ステップ 5: 最終確認

すべての動作が正しいことを確認したら、テストプレイを終了します。

  1. 「再生ボタン」をもう一度クリックして停止します。
  2. 必要に応じて調整を行い、シーンを再度保存します。

テストプレイをしながらスクリプトやオブジェクトの調整を進めることで、より完成度の高い動きを実現できます。ぜひ試してみてください!



よくある質問

Q
スクリプトが動かない場合はどうすればいいですか?
A

スクリプトが動かない場合、以下を確認してください。

  • スクリプトが正しいオブジェクトにアタッチされているか。
  • スクリプト内で必要なオブジェクト(ターゲットやPrefab)がInspectorで設定されているか。
  • コンソールにエラーが表示されている場合、そのエラー内容を読み、原因を特定してください。 もしエラーの内容がわからない場合は、エラー内容を検索して解決策を探してみましょう。
Q
ターゲットがランダムに動かない場合、どこを確認すればいいですか?
A

ターゲットが動かない場合、以下を確認してください。

  • 「TargetMove」スクリプトが「Target」オブジェクトに正しくアタッチされているか。
  • タイマーやランダム値を設定するコードが正しく記述されているか。
  • ランダム範囲が適切かどうか(例: Random.Range(-2.0f, 2.0f) が極端に狭くないか)。
  • Unityのプレイモード中に「Target」の位置が更新されているか、Inspectorで確認してください。
Q
ボールの発射速度を調整したい場合はどうすればいいですか?
A

ボールの発射速度は「BallShot」スクリプトのballSpeed変数で調整できます。

  1. 「ShotManager」オブジェクトを選択し、Inspectorを開きます。
  2. 「BallShot」スクリプトのBall Speedフィールドを見つけます。
  3. 数値を変更して、速くしたい場合は大きな値、遅くしたい場合は小さな値を設定してください。 変更後にプレイモードで動作を確認し、希望の速度になるよう微調整してください。

おすすめのアセット

この「Baseball Stadium」アセットは、リアルで高品質な3Dの野球場を提供します。スタジアム全体が詳細にモデリングされており、観客席やフィールド、バックネットなど、すべての要素が揃っています。Unityの標準レンダリングパイプライン(Built-in)、URP、HDRPに対応しており、幅広いプラットフォームで利用可能です。スポーツゲームやシミュレーションの制作に最適で、プロジェクトにリアリティを追加します。使いやすさと柔軟性が特徴で、様々なシーンに応用できます。