UnityUnityメモ

Unity初心者でも簡単!マウス追従オブジェクトを落下させる方法

Unity

はじめに

この記事では、Unityを使って「マウスに追従するオブジェクトをクリックで落下させる」というシステムを作成する方法を解説します。このプロジェクトは、Unity初心者でも基本的な操作やスクリプトの書き方を学べる絶好のチャンスです。

例えば、ゲームでクリックした場所にアイテムを配置したり、ターゲットを追尾するシステムを作る際に応用できます。このチュートリアルでは、シンプルなCubeを使い、マウスの動きに合わせて移動し、クリックでその場に停止して重力の影響で落下する動作を実装します。


このプロジェクトを進めるにあたり、以下の内容を順を追って説明します:

  • Unityシーンへのオブジェクト配置
  • Rigidbodyコンポーネントの活用
  • スクリプトでマウス操作を反映する方法

Unityが初めての方でも安心して進められるように、具体的な手順とコード例を丁寧に解説しますので、ぜひ一緒に挑戦してみましょう!

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



ステップ1: Cubeの配置とRigidbodyの追加

このステップでは、UnityシーンにCubeを追加し、物理演算を可能にするRigidbodyコンポーネントをアタッチする方法を説明します。ここで行う作業が、マウス追従や落下動作を実現するための基盤となります。


1. UnityシーンにCubeを追加する

まずはUnityエディタでシーンに3Dオブジェクト「Cube」を配置します。以下の手順に従ってください:

  1. ヒエラルキーウィンドウを右クリックします。
  2. 表示されるメニューから「3D Object」→「Cube」を選択します。
  3. シーンビューにCubeが追加されます。

これでCubeがシーンに配置されました!シーンビューでCubeの位置や大きさを確認してみましょう。


2. Rigidbodyコンポーネントを追加する

次に、このCubeが物理演算(重力など)の影響を受けるように、Rigidbodyコンポーネントを追加します。RigidbodyはUnityの物理エンジンを利用するために必要なコンポーネントです。

  1. ヒエラルキーウィンドウで先ほど作成したCubeを選択します。
  2. インスペクターウィンドウに移動します。
  3. Add Component」ボタンをクリックします。
  4. 検索バーに「Rigidbody」と入力し、リストから選択します。

これでCubeにRigidbodyコンポーネントが追加されました!これにより、CubeはUnityの物理エンジンを通じて重力の影響を受けるようになります。


3. 設定の確認と調整(任意)

Rigidbodyコンポーネントにはさまざまな設定がありますが、今回はデフォルトの設定のままで大丈夫です。ただし、オプションとして以下の調整も可能です:

  • Mass(質量): オブジェクトの重さを変更できます。
  • Drag(空気抵抗): 移動時の減速率を調整できます。
  • Use Gravity: チェックを外すと、重力の影響を無効にできます。

これで、Cubeが物理演算を使用する準備が整いました!次のステップでは、マウスの動きに合わせてCubeを移動させるスクリプトを作成していきます。お楽しみに!



ステップ2: マウス追従スクリプトの作成

このステップでは、マウスの動きに合わせてCubeを移動させるスクリプトを作成します。Unityの基本的なスクリプトの書き方に慣れる絶好のチャンスです!わかりやすく解説するので、初心者の方も安心して取り組んでください。


1. スクリプトの新規作成

まず、スクリプトを新しく作成しましょう。

  1. プロジェクトウィンドウで右クリックします。
  2. **「Create」→「C# Script」**を選択します。
  3. スクリプトの名前を 「FollowMouse」 としてください。

作成したスクリプトは、ダブルクリックでVisual StudioやRiderなどのコードエディタで開きます。


2. コードの記述

以下のコードをスクリプトに入力します。コードの内容を詳しく説明していくので、一つひとつ確認しながら進めてください。

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

public class FollowMouse : MonoBehaviour
{
    // マウスが離された状態かどうかを管理するフラグ
    private bool isDrop;
    // マウスの現在の座標を保持するための変数
    private Vector3 mousePosition;
    // オブジェクトの位置を保持するための変数
    private Vector3 objPosition;

    void Start()
    {
        // 初期状態では、オブジェクトがドロップされていない状態に設定
        isDrop = false;
    }

    void Update()
    {
        // オブジェクトがまだドロップされていない場合
        if (!isDrop)
        {
            // マウスの現在のスクリーン座標を取得
            mousePosition = Input.mousePosition;
            // Z軸の奥行きを設定(カメラからの距離を10に設定)
            mousePosition.z = 10.0f;
            // スクリーン座標をワールド座標に変換
            objPosition = Camera.main.ScreenToWorldPoint(mousePosition);
            // オブジェクトの位置をマウスのワールド座標に更新
            this.transform.position = objPosition;
        }

        // マウスの左ボタンが押された場合
        if (Input.GetMouseButtonDown(0))
        {
            // ドロップ状態をtrueにして、オブジェクトを動かないようにする
            isDrop = true;
        }
    }
}

3. コードの解説

  • 変数の定義
    • isDrop: 左クリックされたかどうかを管理するフラグです。クリック後にオブジェクトが追従を止めます。
    • mousePosition: マウスの現在位置を格納します。
    • objPosition: オブジェクトの新しい位置を保持します。
  • Start メソッド
    オブジェクトが初期状態でドロップされていないことを設定します。
  • Update メソッド
    フレームごとに以下を実行します:
    • マウス位置を取得し、奥行きを設定します。
    • マウス位置をワールド座標に変換し、オブジェクトの位置を更新します。
    • 左クリックが検出されると、isDroptrue に設定して追従を停止します。

4. 注意点

  • Z軸の設定
    mousePosition.z を適切に設定しないと、オブジェクトが意図しない場所に移動してしまいます。Camera.main.ScreenToWorldPoint を使う際に注意してください。
  • クリック後の動作
    フラグ isDrop を使うことで、クリック後にオブジェクトが移動を止める仕組みを実現しています。

スクリプトの作成が完了したら、次のステップに進みましょう!



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

作成した「FollowMouse」スクリプトをCubeに適用するには、以下の手順を実行します。

  1. Cubeを選択する
    ヒエラルキーウィンドウで、マウス追従と落下の動作をさせたいCubeをクリックして選択します。
  2. スクリプトをアタッチする
    プロジェクトウィンドウで作成した「FollowMouse」スクリプトを探します。スクリプトのアイコンをクリックして、Cubeにドラッグ&ドロップします。
  3. 確認する
    Cubeが選択されている状態でインスペクターウィンドウを確認してください。「FollowMouse」というスクリプトが正しく追加されていることを確認しましょう。



テストプレイを行う

スクリプトをCubeにアタッチできたら、早速動作をテストしてみましょう。

  1. プレイモードを開始する
    Unityエディターの上部にある「▶」ボタンをクリックしてプレイモードを開始します。
  2. 動作を確認する
    • マウス追従の確認
      シーンビューでマウスを動かしてみてください。Cubeがマウスの位置に追従するはずです。
    • クリックで落下の確認
      マウスの左クリックをしてみましょう。Cubeがその場に止まり、物理演算によって床に向かって落下するはずです。
  3. 問題がある場合の確認ポイント
    • Cubeがマウスに追従しない場合:スクリプトが正しくアタッチされているか確認してください。また、カメラの位置やCubeの位置が正しく設定されているかもチェックしましょう。
    • Cubeが落下しない場合:Rigidbodyコンポーネントが正しくアタッチされているか確認してください。

テスト後の調整

動作を確認した後、以下のような調整を加えるとさらに良くなります:

  • 移動速度の調整
    Cubeの追従スピードを調整したい場合、スクリプトに補間処理を加えるとスムーズな動きになります。
  • クリック後のエフェクト追加
    Cubeが落下する際にエフェクトやサウンドを追加すると、よりインタラクティブなシステムになります。

以上で、スクリプトのアタッチとテストプレイは完了です!プレイモードで思い通りに動作したら、無事成功です。



よくある質問

Q
マウス追従がうまくいかない場合の対処法は?
A

スクリプトが正しくCubeにアタッチされているか確認しましょう。また、Camera.mainが正しいカメラを指しているかも重要です。シーンに複数のカメラがある場合、使用しているメインカメラに「Main Camera」タグがついているか確認してください。

Q
Rigidbodyでエラーが出た場合の解決方法は?
A

Rigidbodyを正しく追加していない可能性があります。以下の点を確認してください:

  • CubeにRigidbodyコンポーネントがアタッチされているか。
  • コンポーネントが追加されているにもかかわらずエラーが出る場合は、スクリプトのtransform.position更新処理が干渉していないか確認してください。isKinematicプロパティを有効にすることで対処できる場合があります。
Q
複数のオブジェクトで同じ動作をさせたい場合はどうすればいいですか?
A

プレハブ(Prefab)を活用することで簡単に実現できます。

  1. Cubeをプレハブ化し、必要なスクリプトやコンポーネントを設定済みの状態にします。
  2. プレハブを複製することで、同じ動作をするオブジェクトをシーンに複数配置できます。
  3. 動作の調整が必要な場合は、スクリプトを更新するだけで全てのプレハブに変更が反映されます。

おすすめのアセット

「Dropping Box」は、簡単なタップ操作でプレイヤーが落ちる箱を操作し、障害物を避けながら進むゲームのテンプレートです。Unity初心者向けで、物理演算を使ったリアルな動きが特徴。カスタマイズも可能で、グラフィックやゲームの挙動を調整できます。軽量でシンプルな作りなので、小規模なプロジェクトやモバイルゲーム開発に最適。学習用やプロトタイプ制作にも便利です。