UnityUnityメモ

Unityでマウスドラッグの距離の長さでオブジェクトに力を加える方法【初心者向け】

Unity

はじめに

Unityでクリックした地点の座標を取得し、その数値を利用してCubeに力を加える方法を解説します。今回は、マウスを押した地点と離した地点のX座標情報の差をパワーに変換し、Cubeに力を加える仕組みを作ります。Unityを使ったことがないという方はコチラの記事から見てみてください!

1. Cubeオブジェクトを作成しよう

  1. Hierarchyウィンドウで右クリックし、「3D Object」→「Cube」を選択します。
  2. 位置やサイズを見やすいように配置してください。

物理特性を追加する

このCubeに物理的な力を加えるため、Rigidbodyコンポーネントを追加します。

  1. ヒエラルキーでCubeを選択します。
  2. Inspectorウィンドウで「Add Component」ボタンをクリック
  3. 「Rigidbody」と入力して、Rigidbodyコンポーネントを追加



2. スクリプトを作成しよう

それでは「Cube」を動かすスクリプトを作成していきましょう!

  1. Projectウィンドウで右クリックし、「Create」→「C# Script」を選択します。
  2. スクリプト名を「DragToMove」に変更します。
  3. DragToMoveスクリプトをダブルクリックして開き、以下のコードを追加します。

コード全体の説明

このスクリプトは、マウスドラッグによってオブジェクトを動かすためのものです。具体的には、マウスをドラッグして放したときに、その距離に応じてオブジェクトを前方に動かします。

各部分の説明

  1. 変数の定義:
    • power: オブジェクトに与える力の量を格納します。
    • rb: オブジェクトの物理特性を制御するための Rigidbody コンポーネントを格納します。
    • startPos: マウスドラッグの開始位置を格納します。
    • endPos: マウスドラッグの終了位置を格納します。
    • pos: 現在のマウスの位置を格納します。
  2. Start関数:
    • この関数は、ゲームが開始されたときに一度だけ呼ばれます。ここでは、 power を0に初期化します。
  3. Update関数:
    • Update 関数は、毎フレーム呼ばれます。
    • pos は現在のマウスの位置を取得します。
    • Input.GetMouseButtonDown(0) は左クリックが押された瞬間を検出し、その時のマウス位置(X座標)を startPos に保存します。
    • Input.GetMouseButtonUp(0) は左クリックが離された瞬間を検出し、その時のマウス位置(X座標)を endPos に保存します。
    • power は、 endPos から startPos を引いた値になります。これがオブジェクトに与える力の大きさです。
    • rb は、このスクリプトがアタッチされているオブジェクトの Rigidbody コンポーネントを取得します。
    • rb.AddForce(0, 0, power * 0.05f, ForceMode.Impulse) で、オブジェクトに前方方向(Z軸方向)に力を加えます。power * 0.05f は力の大きさで、ForceMode.Impulse は一瞬の力を与えるモードです。

全体の動き

  1. ゲーム開始時に power を0に初期化します。
  2. 毎フレーム、マウスの位置を取得します。
  3. 左クリックが押された瞬間に、その位置を startPos に保存します。
  4. 左クリックが離された瞬間に、その位置を endPos に保存します。
  5. ドラッグされた距離を power として計算し、その値を使ってオブジェクトに前方方向に力を加えます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DragToMove : MonoBehaviour
{
    private float power;
    public Rigidbody rb;
    private float startPos;
    private float endPos;
    private Vector3 pos;

    void Start()
    {
        power = 0;
    }

    void Update()
    {
        pos = Input.mousePosition;

        if (Input.GetMouseButtonDown(0))
        {
            startPos = pos.x;
        }

        if (Input.GetMouseButtonUp(0))
        {
            endPos = pos.x;
            power = endPos - startPos;

            rb = GetComponent<Rigidbody>();
            rb.AddForce(0, 0, power * 0.05f, ForceMode.Impulse);
        }
    }
}

スクリプトをアタッチ

  • 「DragToMove」スクリプトをドラッグして、作成しておいた「Cube」オブジェクトにドロップしてアタッチします。



テストプレイ

これで準備は完了です。プレイボタンを押してゲームを開始し、マウスでドラッグしてみてください。ドラッグの距離に応じてCubeが動くのを見ることができます。

これで、マウスをドラッグした地点の座標情報を使って、Cubeに力を加える仕組みが完成しました。

簡単な操作で物理的な動きを楽しんでみましょう!



よくある質問

Q
マウスの押下位置や離した位置のY座標やZ座標も利用できますか?
A

はい、スクリプトを少し変更すれば、Y座標やZ座標も利用できます。例えば、Y座標の差を力として加える場合は、startPos = pos.yendPos = pos.yを使って計算します。

Q
力の大きさを調整する方法はありますか?
A

力の大きさを調整したい場合は、powerに掛ける係数を変更します。例えば、rb.AddForce(0, 0, power * 0.1f, ForceMode.Impulse);とすれば、力の大きさが2倍になります。

Q
他のオブジェクトにも同じスクリプトを使えますか?
A

はい、このスクリプトは他のオブジェクトにも適用可能です。ただし、対象オブジェクトにRigidbodyコンポーネントが追加されていることを確認してください。