UnityUnityメモ

Unityで簡単! プレイヤーの向いている方向に弾を発射する方法

Unity

はじめに

Unityでプレーヤーが向いている方向にボールを発射する方法について、初心者向けにわかりやすく説明します。今回は、左右のキーでプレーヤーを回転させ、スペースキーを押すとその向きにボールを撃つ仕組みを作ります。

ステップ1:プレーヤーオブジェクトの作成

まず、シーンにプレーヤーオブジェクトを作成します。これは簡単なキューブで構いません。

Cubeを配置する

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリックし、「3D Object」→「Cube」を選びます。
  2. 作成したキューブを「Player」などに名前を変更しておくとわかりやすいです。

Planeを配置する

  1. 同じように「3D Object」→「Plane」を選び床を作成します。
  2. 任意でMaterialを作成してわかりやすい色に変更します。(この記事では青に変更)



ステップ2:ボールオブジェクトの作成

次に、発射するボールを作成していきます。

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリックし、「3D Object」→「Sphere」を選びます。
  2. 作成したスフィアを「Ball」などに名前を変更します。
  3. 任意でMaterialを作成してわかりやすい色に変更します。(この記事では赤に変更)

物理特性を追加する

  1. inspector画面の「AddComponent」から「Rigidbody」を検索して追加します。
  2. 「Ball」オブジェクトをプレハブ(Prefab)に変換します。プロジェクトウィンドウにドラッグ&ドロップして、プレハブを作成します。



ステップ3:発射ポイントの設定

プレーヤーの少し前方にボールが発射されるポイントを設定します。

  1. ヒエラルキー(Hierarchy)ウィンドウで「Player」を右クリックし、「Create Empty」を選び子オブジェクトに空のオブジェクトを作成します。
  2. 作成された空のオブジェクトを「ShootPoint」と名前を変更します。
  3. 「ShootPoint」オブジェクトを「Player」の前方に移動させます。

ステップ4:スクリプトの作成と設定

次に、プレーヤーが回転し、ボールを発射するスクリプトを作成し、「Player」に設定します。

  1. 「Player」オブジェクトを選択し、「Add Component」ボタンをクリックします。
  2. 「New Script」を選び、「BallShot」と名前を付けます。
  3. 作成したスクリプトをダブルクリックして開き、以下のコードを入力します。

全体の説明

このスクリプトはUnityで動くもので、BallShotという名前のクラスです。このスクリプトを使うことで、スペースキーを押すと球(ボール)が前方に飛び出し、左右の矢印キーを押すとオブジェクトが回転します。

各部分の説明

  1. 変数の宣言
    • GameObject sphere: この変数は、飛び出す球のプレハブ(事前に用意されたオブジェクト)を指定するために使います。
    • GameObject childObj: この変数は、スクリプトがアタッチされたオブジェクトの子オブジェクトを指します。
    • float speed = 300: この変数は、球が飛び出すときの速度を指定します。
  2. Start関数
    • Start関数は、ゲームが始まったときに一度だけ呼び出されます。
    • transform.GetChild(0).gameObjectは、スクリプトがアタッチされたオブジェクトの最初の子オブジェクトを取得して、それをchildObjに代入します。
  3. Update関数
    • Update関数は、毎フレーム(ゲームの更新サイクルごと)に呼び出されます。
    • Input.GetKeyDown("space"): スペースキーが押された瞬間を検知します。
      • Instantiate(sphere, childObj.transform.position, Quaternion.identity): sphere(プレハブ)をchildObjの位置に生成します。
      • ball.GetComponent<Rigidbody>(): 生成された球のRigidbodyコンポーネントを取得します。
      • ballRigidbody.AddForce(transform.forward * speed): 取得したRigidbodyに力を加えて前方に飛ばします。
    • Input.GetKey("right"): 右矢印キーが押されている間、オブジェクトを右に回転させます。
      • transform.Rotate(0,2,0): Y軸周りに2度回転させます。
    • Input.GetKey("left"): 左矢印キーが押されている間、オブジェクトを左に回転させます。
      • transform.Rotate(0,-2,0): Y軸周りに-2度回転させます。

全体の動き

  1. ゲームが始まると、スクリプトがアタッチされたオブジェクトの最初の子オブジェクトを見つけて、childObjに保存します。
  2. 毎フレーム、プレイヤーがスペースキーを押したら、球を生成して前方に飛ばします。
  3. 右矢印キーを押すとオブジェクトが右に、左矢印キーを押すとオブジェクトが左に回転します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallShot : MonoBehaviour
{
    [SerializeField] GameObject sphere;
    [SerializeField] GameObject childObj;
    private float speed = 300;

    void Start()
    {
        childObj = transform.GetChild(0).gameObject;
    }

    void Update()
    {
        if(Input.GetKeyDown("space"))
        {
            GameObject ball =  (GameObject)Instantiate(sphere, childObj.transform.position, Quaternion.identity);
            Rigidbody ballRigidbody = ball.GetComponent<Rigidbody>();
            ballRigidbody.AddForce(transform.forward * speed);
        }

        if(Input.GetKey("right"))
        {
            transform.Rotate(0,2,0);
        }

        if(Input.GetKey("left"))
        {
            transform.Rotate(0,-2,0);
        }
    }
}

スクリプトを適用する

  • 「Player」オブジェクトを選択し、インスペクターウィンドウで「BallShot」スクリプトの「Sphere」フィールドに「Ball」プレハブをドラッグ&ドロップします。
  • 「ChildObj」フィールドに先ほど作成した「ShootPoint」オブジェクトをドラッグ&ドロップします。



テストプレイ

最後に、実際にゲームを実行して、プレイヤーが向いている方向に弾が正しく発射されるかを確認します。

これで、プレーヤーが向いている方向にボールを発射する方法が完成です。楽しくコーディングして、素晴らしいゲームを作ってくださいね!

おすすめのアセット

Unityでトップダウン視点のゲームを作りたいなら、**「TopDown Engine」**が超おすすめです!このアセットなら、難しいコーディングなしでRPGやシューティングゲームが簡単に作れます。

魅力ポイント

  • 豊富な機能: キャラクターコントローラー、戦闘システム、AIエネミーなど、必要な機能が揃っている!
  • カスタマイズ性: 自分のアイデアに合わせて自由に拡張可能。
  • 時間短縮: ゲーム開発にかかる時間を大幅に削減。

よくある質問

Q
ボールが発射されません。どうすればいいですか?
A

「BallShooter」スクリプトの「Ball Prefab」フィールドに「Ball」プレハブが正しく設定されているか確認してください。また、「Shoot Point」が「Player」の前方に正しく配置されているかもチェックしてください。

Q
ボールがプレーヤーに当たってしまいます。どうしたらいいですか?
A

「Shoot Point」がプレーヤーから少し前方に離れているか確認してください。プレーヤーのすぐ近くにあると、発射されたボールが当たってしまうことがあります。

Q
スクリプトにエラーが出ています。どう直せばいいですか?
A

エラーメッセージをよく読んで、スクリプト内のスペルミスや構文エラーを確認してください。必要に応じてUnityのドキュメントやフォーラムを参照してください。