Unityメモ

Unityでクリックした方向にジャンプ!簡単スクリプトで実装する方法

Unityメモ

1. はじめに

Unityでオブジェクトを動かす方法はたくさんありますが、その中でも「クリックした方向にジャンプする」仕組みは、簡単なゲームメカニクスとしてよく使われます。例えば、キャラクターを操作して障害物を越えたり、的に向かって飛び込ませたりと、さまざまなゲームで応用できます。

この記事では、Unity初心者の方でも理解しやすいように、マウスでクリックした位置をワールド座標に変換し、その方向にジャンプする方法を丁寧に解説します。物理演算を活用しながら、実践的なC#スクリプトを一緒に作成していきましょう。

最終的には、Unityの基本操作とスクリプトの作成方法をしっかりマスターできるようになりますので、ぜひチャレンジしてみてください!それでは早速始めましょう!

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



2. オブジェクトの準備

この記事では、クリックした方向にジャンプする仕組みを作るために必要な3Dオブジェクトと物理演算の準備を行います。まずは基本となる「キューブ」と「床」を作成し、物理挙動を適用する方法を説明します。


1. キューブと床の作成

  1. キューブを作成
    • Unityのヒエラルキー(Hierarchy)ウィンドウを右クリックします。
    • メニューから「3D Object」→「Cube」を選択します。
    • シーンにキューブが作成されます。このキューブがジャンプするオブジェクトになります。
  2. 床を作成
    • 同じくヒエラルキーを右クリックします。
    • 3D Object」→「Plane」を選択します。
    • シーンに床が作成されます。この床はキューブがジャンプする基盤となります。
  3. 配置の調整
    • 作成したキューブと床を見やすい位置に配置しましょう。
      • **床(Plane)**は、Position(0, 0, 0)に設定します。
      • **キューブ(Cube)**は、Position(0, 1, 0)に設定します。
    • この設定で、キューブが床の上に浮いている状態になります。

2. Rigidbodyを追加

キューブに物理演算を適用するために、「Rigidbody」コンポーネントを追加します。

  1. キューブを選択
    • ヒエラルキーウィンドウでキューブをクリックして選択します。
  2. Rigidbodyをアタッチ
    • インスペクター(Inspector)ウィンドウの「Add Component」ボタンをクリックします。
    • 検索ボックスに「Rigidbody」と入力し、リストから選択します。
    • これでキューブにRigidbodyが追加され、物理挙動が適用されます。
  3. Rigidbodyの確認
    • Rigidbodyコンポーネントのデフォルト設定で進めますが、以下の点を確認しておくと良いでしょう:
      • Mass(質量):デフォルトの1でOKです。
      • Drag(空気抵抗)とAngular Drag(回転の抵抗):デフォルト値のままで問題ありません。
      • Use Gravity:チェックが入っていることを確認してください(重力を適用します)。

これでオブジェクトの準備は完了です。次のステップでは、ジャンプの動きを制御するC#スクリプトを作成していきましょう!



3. スクリプトの作成

ここでは、クリックした方向にジャンプさせるスクリプトを作成します。初めてスクリプトを書く方でも安心して取り組めるように、手順を詳しく解説します!


1. スクリプトを作成する

まず、Unityエディターで新しいC#スクリプトを作成しましょう。

  1. プロジェクトウィンドウを右クリック
    プロジェクトウィンドウ内の空白部分を右クリックして、コンテキストメニューを表示します。
  2. 「Create」→「C# Script」を選択
    メニューから「Create」を選択し、その中にある「C# Script」をクリックします。
  3. スクリプトに名前を付ける
    スクリプトの名前を「CubeJump」に変更してください(ファイル名がそのままクラス名になるので、わかりやすい名前を付けるのがポイントです)。

2. スクリプトをキューブにアタッチする

作成したスクリプトを、ジャンプさせたいキューブに適用します。

  1. ヒエラルキーウィンドウでキューブを選択
    ヒエラルキーウィンドウで、ジャンプさせたいキューブをクリックして選択します。
  2. スクリプトをドラッグ&ドロップ
    作成した「CubeJump」スクリプトをプロジェクトウィンドウからヒエラルキーウィンドウのキューブにドラッグ&ドロップします。

これでスクリプトがキューブにアタッチされました。


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

次に、作成したスクリプトをダブルクリックして、コードエディター(Visual Studioなど)で開きます。そして以下のコードを入力してください。

各部分の説明

  1. 変数の宣言
    • Rigidbody rb: オブジェクトに付いているRigidbodyコンポーネントを取得して使います。Rigidbodyを使うと物理的な動きを管理できます。
    • int upForce: オブジェクトを上にジャンプさせるための力の大きさを格納します。300という値が設定されており、これはかなり強い力を意味します。
    • Vector3 mousePosition: マウスがクリックされた位置を保存するための変数です。マウスの座標はX, Y, Zの3次元ベクトルで表します。
    • Vector3 objPosition: マウスのスクリーン座標(2D)をワールド座標(3D)に変換した位置を格納するための変数です。
  2. Startメソッド
    • このメソッドは、ゲームが始まったときに最初に呼び出されます。ここで、オブジェクトに付いているRigidbodyコンポーネントを取得し、それをrb変数に格納します。これで、後でこのRigidbodyに力を加えたり操作ができるようになります。
    • upForceには、ジャンプする際に上向きに加える力の値として300を設定しています。
  3. Updateメソッド
    • Updateメソッドは、毎フレームごとに呼ばれます。つまり、ゲーム中に常に実行されているメソッドです。
    • **Input.GetMouseButtonDown(0)**は、マウスの左ボタン(0番目のボタン)が押されたときにtrueを返します。左クリックが確認されると、以下の処理が行われます。
    • **mousePosition = Input.mousePosition**で、マウスの現在のスクリーン座標を取得します。この値は2Dの画面上の位置です。
    • **mousePosition.z = 10.0f**では、スクリーン座標をワールド座標に変換するために、Z軸の位置を設定します。ここでは、カメラから10ユニット離れた位置に設定しています。
    • **objPosition = Camera.main.ScreenToWorldPoint(mousePosition)**では、2Dのスクリーン座標を3Dのワールド座標に変換します。これにより、クリックされた位置がゲーム内の3D空間のどこかが分かるようになります。
    • **rb.AddForce(new Vector3(objPosition.x * 20, upForce, 0))**では、オブジェクトに力を加えます。具体的には、objPosition.xの値を20倍してX方向に、upForceをY方向(上方向)に、それぞれ力を加えます。

全体の動き

このスクリプトの動作は以下の通りです:

  1. ゲームが始まると、オブジェクトに付いているRigidbodyを取得します。
  2. 毎フレームごとに、マウスの左クリックを監視します。
  3. マウスがクリックされた位置に基づいて、そのオブジェクトにX軸方向とY軸(上方向)に力を加えます。その結果、オブジェクトはクリックされた方向にジャンプするように見えます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeJump : MonoBehaviour
{
    private Rigidbody rb;           // Rigidbodyコンポーネントを格納する変数
    private int upForce;            // 上向きの力
    private Vector3 mousePosition;  // マウスのクリック位置
    private Vector3 objPosition;    // 変換されたオブジェクトの位置

    void Start()
    {
        rb = GetComponent<Rigidbody>();  // Rigidbodyコンポーネントを取得
        upForce = 300;                   // 上向きにかかる力の値を設定
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))  // 左クリックが押された時
        {
            mousePosition = Input.mousePosition;  // マウスのスクリーン座標を取得
            mousePosition.z = 10.0f;  // Z軸の値を設定(カメラからの距離)
            objPosition = Camera.main.ScreenToWorldPoint(mousePosition);  // スクリーン座標をワールド座標に変換
            rb.AddForce(new Vector3(objPosition.x * 20, upForce, 0));  // X軸方向と上向きに力を加える
        }
    }
}

4. スクリプトを保存する

コードの入力が完了したら、忘れずに保存してください。

  1. 保存のショートカットキーを使う
    • Windows: Ctrl + S
    • Mac: Command + S
  2. 保存後、Unityエディターに戻ると、スクリプトが自動的にコンパイルされます(少し時間がかかる場合があります)。

次は作成したスクリプトが正しく動作するか、テストプレイを行いましょう!スクリプトの細かい仕組みについては次のセクションで詳しく解説します。



4. テストプレイ

さて、ここまででシーンの準備とスクリプトの設定が完了しました。それでは、実際にプレイモードで動作を確認してみましょう!


1. プレイモードに切り替える

Unityのエディターで、上部にある「▶」ボタンをクリックしてプレイモードに切り替えます。


2. 動作確認

ゲーム画面が表示されたら、画面内の任意の場所を左クリックしてみましょう。キューブがクリックした方向に向かってジャンプするはずです!

ジャンプする際に、キューブが次のような動きをすることを確認してください:

  • マウスでクリックした方向にジャンプする
  • 上方向(Y軸)にもしっかり動く

3. 動作しない場合のデバッグ

もし期待通りに動作しない場合、以下のポイントをチェックしてみてください。

  1. Rigidbodyがアタッチされているか確認
    • キューブにRigidbodyコンポーネントが正しく追加されているかを確認します。
    • Rigidbodyが追加されていない場合、物理演算が適用されず、力が加わりません。
  2. スクリプトがキューブにアタッチされているか確認
    • 「CubeJump」スクリプトがキューブにドラッグ&ドロップされているかを確認します。
  3. コンソールエラーをチェック
    • プレイモード中にエラーが発生している場合、Unityの「Console」ウィンドウにエラーが表示されます。
    • 例えば、「NullReferenceException」というエラーが出ている場合、Rigidbodyコンポーネントの取得に問題がある可能性があります。
  4. コードを確認
    • コードの記述に誤りがないか確認します。
    • 特に以下の行が正しく記述されているかをチェックしてください:
    csharpコードをコピーするrb = GetComponent<Rigidbody>();
    • ここが誤っていると、スクリプトがRigidbodyを認識できず、力を加えることができません。

4. ジャンプの力を調整する

もしジャンプの動きが速すぎたり遅すぎたりする場合、スクリプト内のupForceAddForceの値を調整してみてください。

例:

  • upForceの値を増やす:より高くジャンプ
  • AddForceのX方向の値を減らす:よりゆっくりとした横移動

5. 完成した動作を楽しむ

修正が完了したら、もう一度テストプレイして、キューブが滑らかにクリックした方向にジャンプする動作を楽しみましょう!しっかり動作すれば、次は応用や演出の追加に挑戦できます。


以上でテストプレイのステップは終了です!動作を確認できたら、次のステップでさらに進化させてみましょう。



5. 応用:動きを改良するには

この記事では、クリックした方向にジャンプする基本的な仕組みを実装しましたが、さらに動きを改良することで、より自然で楽しい動きを作ることができます。このセクションでは、いくつかのアイデアとその実装方法を紹介します。


1. ジャンプ力を調整する

現在のスクリプトでは、upForceの値が固定されていますが、これを可変にして、プレイヤーが調整できるようにしましょう。

方法: Inspectorでジャンプ力を調整できるよう、[SerializeField]を使用します。

[SerializeField] private int upForce = 300;

こうすることで、Unityエディター上で数値を簡単に変更でき、ゲームのバランス調整がしやすくなります。


2. クリック位置に基づく力の大きさを変える

ジャンプの方向だけでなく、クリックした位置に応じて力の大きさを変えることで、さらにダイナミックな動きを実現できます。

: カメラに近い位置のクリックでは小さなジャンプ、遠い位置では大きなジャンプをするようにします。

以下のように、クリック位置とオブジェクトの現在位置との距離を計算し、それに応じて力を調整します。

float distance = Vector3.Distance(objPosition, transform.position);
rb.AddForce(new Vector3(objPosition.x * 20, upForce + distance * 10, objPosition.z * 20));

これにより、クリックする位置が遠いほど、力が大きくなるようになります。


3. 空中での制御を追加する

現在のスクリプトでは、ジャンプ中のオブジェクトは重力に従うだけですが、空中での方向制御を追加することで、操作性を向上させられます。

方法: キーボード入力を検出し、ジャンプ中でもわずかに力を加えるようにします。

例:

void FixedUpdate()
{
if (!IsGrounded()) // 着地していない場合
{
float moveX = Input.GetAxis("Horizontal") * 5f;
float moveZ = Input.GetAxis("Vertical") * 5f;
rb.AddForce(new Vector3(moveX, 0, moveZ));
}
}

// 着地状態を判定するヘルパーメソッド
private bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}

これにより、空中でも微調整でき、ジャンプの動きがより柔軟になります。


4. スムーズなジャンプの実現

現在のジャンプでは、AddForceを一度だけ適用していますが、これを少しずつ増やすことで滑らかな動きを実現できます。

方法: Coroutineを使って、徐々に力を加える処理を実装します。

IEnumerator SmoothJump(Vector3 direction, float duration)
{
float time = 0;
while (time < duration)
{
rb.AddForce(direction * Time.deltaTime * 100);
time += Time.deltaTime;
yield return null;
}
}

ジャンプ時にこのSmoothJumpメソッドを呼び出すようにします。


これらの改良を組み合わせることで、ジャンプの挙動をカスタマイズし、プレイヤーの操作性を向上させることができます。自分のゲームに合った設定を見つけて、楽しいジャンプアクションを作ってみてください!



よくある質問(FAQ)

Q
クリックしてもキューブが動きません。原因は何ですか?
A

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

  • Rigidbodyが正しく追加されているか
    キューブにRigidbodyコンポーネントがアタッチされていないと、物理演算が機能しません。インスペクターで確認し、必要に応じて追加してください。
  • スクリプトが正しくアタッチされているか
    作成したスクリプト「CubeJump.cs」をキューブにドラッグ&ドロップしてアタッチしてください。
  • エラーが出ていないか
    Unityのコンソールにエラーが表示されていないか確認してください。スクリプトのコードにミスがある場合、動作しません。
Q
ジャンプの力が弱すぎたり強すぎたりします。どうすれば調整できますか?
A

ジャンプ力を調整するには、スクリプト内のupForceの値を変更してください。例えば:

upForce = 300; // 現在の値

この数値を増やすとジャンプ力が強くなり、減らすと弱くなります。シーンのサイズやゲームの仕様に合わせて調整しましょう。

Q
ジャンプ方向をもっと正確に制御したい場合はどうすればいいですか?
A

ジャンプ方向を制御するためには、以下のような調整が可能です:

  • Z軸方向への力を追加
    スクリプト内のAddForce部分にZ軸方向の力を加えるコードを追加できます。rb.AddForce(new Vector3(objPosition.x * 20, upForce, objPosition.z * 20));
  • マウス位置の調整
    mousePosition.zの値を変更することで、ワールド座標への変換精度が変わります。シーンやカメラの位置に応じて適切に設定してください。

おすすめのアセット

「Sky Jump」は、Unityで簡単にジャンプ系ゲームを作成できるテンプレートアセットです。初心者でも使いやすく、キャラクターが障害物を避けながらジャンプしていくゲームの基本的なシステムがすでに組み込まれています。シンプルなコントロール、無限に進むゲーム設計、スコア管理が特徴です。また、カスタマイズも可能で、グラフィックやキャラクターの動きを自分好みに変更できます。小規模なプロジェクトや、練習用としても最適なアセットです。