UnityUnityメモ

Unity初心者向け!オブジェクトに触れるとスピードアップする仕組みを作ろう

Unity

1. はじめに

Unityを使ってゲームを作るとき、プレイヤーキャラクターの動きを工夫することでゲームの面白さがぐっと増しますよね。今回の記事では、プレイヤーが特定のオブジェクト(Sphere)に触れると、3秒間だけスピードアップする仕組みを作る方法をご紹介します。

この仕組みは、アクションゲームやレースゲームで使われることが多く、プレイヤーに一時的なメリットを与えることで、ゲームプレイに緊張感や達成感をもたらす要素として活用されています。

この記事では、Unity初心者でも簡単に実装できるよう、準備からスクリプトの書き方、テストプレイまで丁寧に解説します!スクリプトを書くのが初めての方でも安心して挑戦できるように、コード例や操作手順を具体的に説明しますので、一緒に作っていきましょう。

では、Unityプロジェクトのセットアップから始めます!

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



2. 準備:プロジェクトのセットアップ

ここでは、プロジェクトの基本的なセットアップ手順を説明します。Unity初心者でも簡単に進められるように、ステップごとに解説します。


1. Unityプロジェクトの新規作成

まず、Unityを起動して新しいプロジェクトを作成しましょう。

  1. Unity Hubを開く
    Unity Hubで「新しいプロジェクト」をクリックします。
  2. テンプレートを選択
    「3D」を選択してプロジェクトを作成します。プロジェクト名を「SpeedBoostTutorial」などわかりやすい名前にしましょう。
  3. プロジェクトを開く
    作成したプロジェクトがUnityエディターに表示されます。

2. ヒエラルキーにオブジェクトを配置

ゲーム内で使用するオブジェクトを追加します。

  1. 床の配置
    • ヒエラルキーウィンドウで右クリックして「3D Object」→「Plane」を選択します。
    • Planeがシーンに追加されます。これがプレイヤーが移動する床になります。
  2. プレイヤーの追加
    • 再びヒエラルキーウィンドウで右クリックし、「3D Object」→「Cube」を選択します。
    • Cubeを選択した状態で、インスペクターウィンドウの「Add Component」ボタンをクリックし、「Rigidbody」を検索して追加します。これにより、Cubeに物理演算が適用されます。
    • Cubeの名前を「Player」に変更しておくと管理がしやすいです。
  3. Sphere(スピードアップアイテム)の追加
    • ヒエラルキーウィンドウで右クリックし、「3D Object」→「Sphere」を選択します。

3. オブジェクトの配置を調整

次に、オブジェクトをシーン内で見やすい位置に配置します。

  • Plane
    • Transformの「Position」を(0, 0, 0)に設定します。
  • Player(Cube)
    • Transformの「Position」を(0, 0.5, 0)に設定します。床の上に少し浮いている状態です。
  • Sphere
    • Transformの「Position」を好きな位置に設定します(例:(2, 0.5, 2))。プレイヤーが動いて触れることができる位置に配置しましょう。

これで、基本的なセットアップは完了です!次はプレイヤーの動きをスクリプトで実装していきます。



3. C#スクリプトでプレイヤーの動きを実装

ここでは、プレイヤー(Cube)を上下左右に動かす基本的なスクリプトを作成します。作業を進めながら、Unityのスクリプト作成とアタッチの基本的な流れを学びましょう。


スクリプトを作成する

  1. プロジェクトウィンドウを開きます。
    (画面下部または左下にある「Assets」フォルダのことです。)
  2. プロジェクトウィンドウを右クリックして、
    「Create」→「C# Script」を選びます。
  3. 作成されたスクリプトの名前を「PlayerController」に変更します。

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

  1. ヒエラルキーウィンドウで「Cube」を選択します。
  2. インスペクターウィンドウで、「Add Component」をクリックします。
  3. 検索バーに「PlayerController」と入力し、作成したスクリプトを選択してアタッチします。

スクリプトにコードを記述する

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

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 5f;  // プレイヤーの移動速度

    void Update()
    {
        // キーボード入力による移動
        float moveX = Input.GetAxis("Horizontal"); // 左右キーの入力
        float moveZ = Input.GetAxis("Vertical");   // 上下キーの入力

        // 入力に基づく移動計算
        Vector3 movement = new Vector3(moveX, 0, moveZ);

        // プレイヤーを移動させる
        transform.Translate(movement * speed * Time.deltaTime);
    }
}

コードの解説

  • Input.GetAxis("Horizontal")Input.GetAxis("Vertical")
    キーボードの矢印キーまたはWASDキーの入力を取得します。
    • "Horizontal":左右の入力
    • "Vertical":上下の入力
  • Vector3 movement
    移動方向を計算するための3D座標を作成します。今回は上下左右だけなのでy成分は0にしています。
  • transform.Translate
    オブジェクトを指定した方向に動かす関数です。Time.deltaTimeを掛けることで、フレームレートに依存しないスムーズな動きを実現しています。

スクリプトの保存とUnityでの確認

スクリプトを入力したら、ファイルを保存します(Ctrl + SまたはCommand + S)。
Unityエディターに戻ると、スクリプトの変更が自動的に反映されます。


これで、プレイヤーが上下左右に動けるようになりました!次は、Sphereに触れたときのスピードアップ機能を実装していきましょう。



4. スピードアップ機能の追加

ここでは、Sphere(球体)に触れたときにプレイヤーのスピードが一時的にアップする仕組みを作ります。以下の手順に沿って実装してみましょう!


1. Sphereにタグを設定

まず、プレイヤーがぶつかる対象となるSphereに「SpeedBoost」というタグを設定します。

  1. ヒエラルキーウィンドウでSphereを選択します。
  2. インスペクターの上部にある「Tag」をクリックし、プルダウンメニューから「SpeedBoost」を選択します。
  3. 「SpeedBoost」がリストにない場合は、「Add Tag」をクリックして新しいタグを作成します。
    • 「Tags & Layers」ウィンドウが開くので、「+」ボタンを押して「SpeedBoost」と入力し、保存します。
  4. 再度Sphereを選択し、設定した「SpeedBoost」タグを適用します。

2. プレイヤーのスクリプトを更新

次に、プレイヤーのスクリプトにスピードアップの処理を追加します。以下のコードを参考にしてください。

コード例

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 5f;  // 通常の移動速度
    private float moveSpeed; // 現在の移動速度
    private float boostDuration = 3f;  // スピードアップの持続時間
    private bool isSpeedBoosted = false; // スピードアップ中かどうか

    private void Start()
    {
        moveSpeed = speed;  // 初期速度を設定
    }

    void Update()
    {
        // プレイヤーの移動
        float moveX = Input.GetAxis("Horizontal");
        float moveZ = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveX, 0, moveZ);
        transform.Translate(movement * moveSpeed * Time.deltaTime);
    }

    public void SpeedBoost()
    {
        if (!isSpeedBoosted)  // スピードアップ中でない場合のみ実行
        {
            isSpeedBoosted = true;
            moveSpeed = speed * 2;  // 移動速度を2倍に設定
            Invoke("ResetSpeed", boostDuration);  // boostDuration後に速度をリセット
        }
    }

    private void ResetSpeed()
    {
        moveSpeed = speed;  // 通常速度に戻す
        isSpeedBoosted = false; // スピードアップ解除
    }

    void OnCollisionEnter(Collision collision)
    {
        // 衝突したオブジェクトのタグが"SpeedBoost"ならスピードアップ
        if (collision.gameObject.CompareTag("SpeedBoost"))
        {
            SpeedBoost();
        }
    }
}

これで、スピードアップ機能の追加は完了です!次は、全体をテストして動作を確認してみましょう。



5. テストプレイ

実装が完了したら、Unityエディターで動作を確認してみましょう。以下の手順に従ってテストプレイを行い、スピードアップの機能が正しく動作するかチェックしてください。

手順 1: 再生ボタンをクリック

Unityエディターの上部にある再生ボタン(▶)をクリックして、ゲームを開始します。

手順 2: プレイヤーを操作

  • キーボードの上下左右キー(または W, A, S, D キー)を使ってプレイヤー(Cube)を動かします。
  • Sphere(球体)に向かって移動してみましょう。

手順 3: スピードアップを確認

  • プレイヤーがSphereに触れた瞬間、移動速度が上がることを確認します。
  • 3秒後に速度が元に戻るかをチェックします。

手順 4: 想定外の動作がないか確認

  • Sphere以外のオブジェクトに触れてもスピードアップしないか確認します。
  • スピードアップの持続時間が正確に3秒かどうか確認します。

手順 5: エラーや問題の確認

再生を停止したら、Unityエディターの Console ウィンドウを確認して、エラーメッセージが表示されていないかをチェックしてください。もしエラーが出ている場合は、以下の点を見直しましょう。

  • Sphereに正しいタグ(”SpeedBoost”)が設定されているか。
  • スクリプトがCube(プレイヤー)に正しくアタッチされているか。
  • タイポやコードミスがないか。

テストが成功したら、あなたのゲームにスピードアップ機能がしっかり実装されています! この仕組みをさらに応用して、別の効果を持つアイテムやオブジェクトを追加してみるのも楽しいですよ。

次は、ゲームをより魅力的にするためのアイデアを考えてみましょう!



よくある質問(FAQ)

Q
Sphereに触れてもスピードが上がりません。原因は何ですか?
A

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

  • Sphereに正しいタグが設定されていない: Sphereのインスペクターで「SpeedBoost」タグが設定されているか確認してください。タグが作成されていない場合は、「Add Tag」で新しいタグを作成し、適用してください。
  • スクリプトがCubeにアタッチされていない: 「PlayerController」スクリプトがCube(プレイヤー)にアタッチされていることを確認してください。
  • Collision判定が正しく行われていない: SphereとCubeの両方にColliderがアタッチされ、少なくとも一方に「Is Trigger」がオフになっている必要があります。
Q
スピードアップ効果が無期限に続いてしまいます。どうすればいいですか?
A

スピードアップ効果がリセットされない原因として、以下を確認してください:

  • Invokeメソッドの設定ミス: スクリプト内のInvoke("ResetSpeed", boostDuration);が正しく記述されているか確認してください。
  • ResetSpeedメソッドが呼び出されない: スクリプト内でmoveSpeedが元の速度に戻る処理が正確に実装されているか再確認しましょう。
Q
プレイヤーが動きません。どうすればいいですか?
A

プレイヤーが動かない場合、以下をチェックしてください:

  • Rigidbodyが正しく設定されているか: Cubeに「Rigidbody」コンポーネントがアタッチされているか確認してください。
  • Input設定: Unityの「Edit」→「Project Settings」→「Input Manager」で、HorizontalVerticalの設定がデフォルト状態になっているか確認してください。
  • スクリプト内のUpdateメソッド: 移動処理がUpdate()メソッド内に正しく記述されているか確認してください。

おすすめのアセット

「Pickup Items Fantasy Collection」は、ファンタジーゲームに最適な3Dアイテムパックです。剣やポーション、宝石など、ゲーム内でのアイテム収集や報酬システムに使用できる、低ポリゴンでカラフルなアイテムが多数揃っています。カートゥーン風のスタイルで、可愛らしいデザインが特徴です。Unity 2019.1.10以降のバージョンに対応しており、初心者でも簡単に組み込めます。ファンタジーや冒険系ゲームを作る方にぴったりのアセットです。