UnityUnityメモ

Unity初心者向け:ジャンプ&壁に張り付く機能を簡単実装!

Unity

1. はじめに

この記事では、クリックでジャンプし、壁に触れているときに一時的に張り付く動きをCubeで簡単に実現する方法を解説します。初心者の方でも安心して進められるよう、Unityの基本操作からスクリプトの作成までをステップバイステップでご紹介します。

「ジャンプ機能を作りたいけど、どこから手をつけたらいいのかわからない」「壁に張り付く処理って難しそう…」と思っている方にピッタリの内容です。サンプルコードや設定のポイントもわかりやすく解説しますので、ぜひ最後まで読んで試してみてくださいね!

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



2. 準備:シーンのセットアップ

この記事では、ジャンプして壁に張り付く機能を実装するための準備として、Unityシーンをセットアップする方法を説明します。ここでは、床となるPlaneとプレイヤー用のCubeを配置し、それに必要な設定を行います。


1. 床(Plane)の配置

まず、キャラクターが動くための床を配置します。

  1. UnityのHierarchyウィンドウで右クリックします。
  2. **「3D Object」→「Plane」**を選択します。
  3. 配置されたPlaneがシーン内に表示されるので、適切な位置に移動します(デフォルト位置のままでOKです)。

ポイント: Planeは床として使うため、特にサイズ変更は不要ですが、大きくしたい場合は、Scaleを調整してください。


2. プレイヤー用のCubeを配置

次に、ジャンプするプレイヤーオブジェクトとしてCubeを配置します。

  1. Hierarchyウィンドウで再び右クリックし、**「3D Object」→「Cube」**を選択します。
  2. Cubeが床の中央付近に配置されます。
  3. Inspectorウィンドウで、CubeのPositionを以下のように設定して浮かせます:
    • X: 0, Y: 0.5, Z: 0
    • これにより、Cubeが床から少し浮いた状態になります。

3. Rigidbodyを追加

Cubeが物理的な動きを持つようにするために、Rigidbodyコンポーネントを追加します。

  1. Cubeを選択した状態で、Inspectorウィンドウを確認します。
  2. 「Add Component」ボタンをクリックします。
  3. 検索バーに「Rigidbody」と入力し、選択して追加します。
  4. Rigidbodyの設定はデフォルトのままでOKです。

4. Cubeの見た目を調整

Cubeを見やすくするために、カスタムマテリアルを作成して色を変更しましょう。

  1. Projectウィンドウで右クリックし、**「Create」→「Material」**を選択します。
  2. 作成されたMaterialにわかりやすい名前を付けます(例: “PlayerMaterial”)。
  3. Inspectorウィンドウで、Materialの**Albedo(色設定)**を変更して好きな色にします。
  4. 作成したMaterialをCubeにドラッグ&ドロップして適用します。

5. Cubeの回転を固定

物理演算でCubeが意図せず回転しないように、Rigidbodyの設定を変更します。

  1. CubeのInspectorウィンドウでRigidbodyコンポーネントを探します。
  2. 「Constraints」セクションを展開します。
  3. 「Rotation」のX、Y、Zにチェックを入れます。

これでシーンの基本的なセットアップは完了です!次のステップでは、壁の作成と配置を行い、プレイヤーがジャンプして壁に張り付く機能を追加していきます。



3. 壁の作成と配置

このセクションでは、ジャンプ機能に必要な壁を作成し、シーンに配置する方法を説明します。壁の役割は、ジャンプしたCubeが接触した際に「張り付く」動作を検出するためです。

1. 壁用のCubeを作成

  1. Hierarchyウィンドウで右クリックし、「3D Object」→「Cube」を選択します。
  2. 新しく作成されたCubeの名前を「Wall」に変更しましょう。名前を付けることで、後でスクリプトで特定しやすくなります。

2. 壁の位置とサイズを調整

  1. Wallを選択し、Inspectorウィンドウで以下のように位置(Position)とサイズ(Scale)を設定してください。
    • Position: X = 3, Y = 0, Z = 0
      → これにより壁が床の右側に配置されます。
    • Scale: X = 0.5, Y = 10, Z = 10
      → 壁を縦に長くし、Cubeがジャンプして張り付けるようにします。

3. 壁を見やすくする

  1. 壁を視認しやすくするため、新しいマテリアルを作成して適用しましょう。
    • Projectウィンドウで右クリックし、「Create」→「Material」を選択します。
    • 作成されたマテリアルの名前を「WallMaterial」に変更します。
    • Inspectorウィンドウで「Albedo」の色を変更して、壁の色を分かりやすい色(例えば青)に設定します。
    • Wallに新しいマテリアルをドラッグ&ドロップして適用します。

4. 配置を確認

  1. シーンビューで、Wallが正しい位置に配置され、Cubeと接触できることを確認してください。
  2. 必要に応じて壁の高さや位置を微調整し、テストプレイに備えましょう。

これで、壁の作成と配置が完了しました!次は、Cubeが壁に触れた際に「張り付く」動作を実現するスクリプトを作成していきます。



4. スクリプトの作成:ジャンプ&壁張り付き機能

この記事では、Cubeがクリックでジャンプし、壁に触れた際に張り付く動きを作るスクリプトを作成します。以下の手順に従ってスクリプトを作りましょう!


1. 新しいスクリプトの作成

まず、Unityエディターの「Project」ウィンドウで右クリックし、「Create」→「C# Script」を選択します。このスクリプトに CubeJump という名前を付けてください。


2. スクリプトの編集

スクリプトをダブルクリックして、エディターで開きます。以下のコードを入力してください。

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

public class CubeJump : MonoBehaviour
{
    private Rigidbody rb;
    private int upForce;
    private Vector3 mousePosition;
    private Vector3 objPosition;
    private float rayDistance;

    void Start()
    {
        // Rigidbodyを取得
        rb = GetComponent<Rigidbody>();
        // ジャンプ力を設定
        upForce = 300;
        // Raycastの距離を設定
        rayDistance = 0.5f;
        rb.isKinematic = false;
    }

    void Update()
    {
        // 現在の位置から右方向にRayを飛ばす
        Vector3 rayPosition = transform.position;
        Ray ray1 = new Ray(rayPosition, Vector3.right);
        Debug.DrawRay(rayPosition, Vector3.right * rayDistance, Color.red);

        RaycastHit hit;
        // Rayが壁に当たった場合
        if (Physics.Raycast(ray1, out hit, rayDistance))
        {
            if (hit.collider.name == "Wall" && Input.GetKey(KeyCode.Space))
            {
                // 壁に張り付く
                rb.isKinematic = true;
            }
            else
            {
                rb.isKinematic = false;
            }
        }

        // 左クリックでジャンプ
        if (Input.GetMouseButtonDown(0))
        {
            rb.isKinematic = false;
            mousePosition = Input.mousePosition;
            mousePosition.z = 10.0f;
            objPosition = Camera.main.ScreenToWorldPoint(mousePosition);
            rb.AddForce(new Vector3(objPosition.x * 30, upForce, 0));
        }
    }
}

3. コードのポイント解説

  • Rigidbodyを制御
    rb.isKinematic を使い、動きを固定するかどうかを制御しています。壁に触れているときにスペースキーを押すと、動きを固定して張り付く仕組みです。
  • Raycastを利用した壁の検出
    Ray を使ってCubeの前方に赤い光線(Debug.DrawRay)を飛ばし、壁を検知します。この仕組みで、Cubeが「Wall」という名前のオブジェクトに触れたことを確認しています。
  • クリックでジャンプ
    Input.GetMouseButtonDown(0) で左クリックを検出し、クリック時にジャンプします。クリックした場所に応じてCubeが移動します。

これでスクリプトの準備は完了です!次に、ゲームを再生して正しく動作するか確認しましょう。



5.スクリプトのアタッチとテストプレイ

ここまでで、シーンのセットアップやスクリプトの作成が完了しましたね!それでは、作成したスクリプトをCubeにアタッチして、動作確認を行ってみましょう。


スクリプトをCubeにアタッチする方法

  1. Cubeを選択
    Hierarchyウィンドウでジャンプ機能を持たせたいCubeをクリックして選択します。
  2. スクリプトをアタッチ
    • Projectウィンドウで先ほど作成した「CubeJump.cs」スクリプトを探します。
    • スクリプトをドラッグして、InspectorウィンドウのCubeにドロップします。
  3. スクリプトの確認
    Cubeを選択した状態で、Inspectorウィンドウを確認します。
    「CubeJump」コンポーネントがCubeに追加されていれば成功です!

テストプレイの手順

  1. 再生ボタンをクリック
    Unityエディターの上部にある再生ボタン(三角形のアイコン)をクリックしてゲームを再生します。
  2. ジャンプの動作確認
    • ゲームウィンドウでCubeをクリックしてジャンプするか確認しましょう。
    • ジャンプの挙動に問題がないか、適切な高さに飛べるかを確認してください。
  3. 壁張り付きの確認
    • Cubeを壁(Wall)に向かって移動させます。
    • 壁に触れたときに「スペースキー」を押して、Cubeが壁に張り付いて止まるか確認してください。

テスト中に発生しやすい問題と確認ポイント

  • ジャンプしない場合
    Rigidbodyコンポーネントが追加されているか、Inspectorウィンドウで確認してください。特にisKinematicが適切に制御されているかが重要です。
  • 壁に張り付かない場合
    • 壁の名前が「Wall」になっているか確認します(スクリプトで名前を参照しています)。
    • 壁との距離がRaycastの範囲内かどうか、rayDistanceの値を調整してみてください。

これで、スクリプトをアタッチしてテストプレイを行う方法はバッチリです!うまくいかない場合でも焦らず、上記の確認ポイントを順番に見直してみてくださいね。



よくある質問(FAQ)

Q
Cubeがジャンプしないのはなぜですか?
A

主な原因として以下が考えられます:

  • Rigidbodyが設定されていない:CubeにRigidbodyコンポーネントが正しく追加されているか確認してください。
  • スクリプトのアタッチ漏れ:作成した「CubeJump」スクリプトがCubeにアタッチされているか確認してください。
  • 物理演算が無効化されている:Rigidbodyの「isKinematic」オプションが誤って有効化されている場合は、無効化してみてください。
Q
壁に張り付かないのはなぜですか?
A

壁に張り付かない場合、以下を確認してください:

  • Raycastの設定:スクリプト内で設定したRaycastの方向や距離が、壁に正しく届いているか確認してください。コード内のrayDistanceが短すぎる場合、壁を検出できない可能性があります。
  • 壁の名前が「Wall」でない:Raycastは「Wall」という名前のオブジェクトを検出するよう設定されています。Hierarchyウィンドウで壁の名前が「Wall」になっているか確認してください。
  • 壁の位置やサイズ:壁がCubeのRaycastの範囲内に正しく配置されているか確認してください。
Q
ジャンプの挙動が不自然(高さが足りない・高すぎる)場合、どうすればいいですか?
A

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

  • スクリプト内のupForceの値を調整:ジャンプの高さを変更したい場合は、upForceの値を増減してください。
  • Cubeの質量(Mass)の確認:Rigidbodyの「Mass」の値が大きすぎると、力が十分に加わらずジャンプが低くなる可能性があります。
  • コード内の力の方向rb.AddForceの値が適切か確認し、必要に応じて力の方向や大きさを調整してください。

おすすめのアセット

「Corgi Engine」は、Unityで2Dおよび2.5Dのプラットフォーマーゲームを簡単に作成できる強力なツールです。このエンジンを使用することで、複雑なプログラミングなしに、高品質なアクションゲームを開発できます。

主な特徴:

  • 多彩なキャラクター操作: ジャンプ、ダッシュ、壁登りなど、豊富なアクションを簡単に実装可能です。
  • 非物理ベースのコントロール: 物理エンジンに依存しないため、タイトでレスポンシブな操作感を実現します。
  • モバイル対応: スマートフォンやタブレットでも快適に動作し、幅広いプラットフォームでの展開が可能です。

おすすめポイント:

  • 初心者でも使いやすい: 複雑なコードを書く必要がなく、直感的な操作でゲーム開発が進められます。
  • 時間の節約: 基本的なゲームシステムが揃っているため、開発時間を大幅に短縮できます。
  • 高品質なサポート: 開発者からのサポートがあり、安心して利用できます。