[Unity] Rigidbodyを使ってオブジェクトをフリックする

Unityでマップなどをスクロールさせたい場合などに使用するフリック動作の実現方法についてのメモ書きです。
今回はRigidbodyの慣性を使ってマウスによるフリック動作を実現してみたいと思います。

1.スクロール対象のオブジェクトを配置する
まず、フリックさせるスプライトを空間上に配置します。

rigidflick-1

上記の例では、写真をスプライトとして追加しています。

2.Rigidbody2Dコンポーネントを追加する
マウスでフリックしたときに慣性で動き続ける動作をRigidbodyの物理演算で実現します。
「Add Component」より「Rigidbody 2D」を追加します。

rigidflick-2

追加したら「Gravity Scale」を0にします。
これをしないと画像が下に落ちます(笑)

「Linier Drag」はフリック時の摩擦に相当するもので、この値が大きくなるほど減速が早くなってすぐに静止します。
ひとまずここでは5に設定しておきます。

rigidflick-3

3.スクリプトの追加
マウスをドラックしたら一緒に背景をスクロールさせるためのスクリプトを追加します。
「FlickMove.cs」ファイルを作成し、以下の内容をコピペします。

rigidflick-4

FlickMove.cs

using UnityEngine;
using System.Collections;

public class FlickMove : MonoBehaviour {
	private Vector3 prevMousePos;

	// Use this for initialization
	void Start () {
		prevMousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
	}

	// Update is called once per frame
	void Update () {
		Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

		if ( Input.GetMouseButton(0) ) {
			// マウスの移動分だけ速度与える
			gameObject.rigidbody2D.velocity = (mousePos - prevMousePos) / Time.deltaTime;
		}

		prevMousePos = mousePos;
	}
}

これで実行し、画面上でマウスをドラックしてみてください。
上手くスクロールできたら成功です。

上記スクリプトのポイントは以下の部分です。

		if ( Input.GetMouseButton(0) ) {
			// マウスの移動分だけ速度与える
			gameObject.rigidbody2D.velocity = (mousePos - prevMousePos) / Time.deltaTime;
		}

マウスの左ボタンが押されていたら、スクリプトの大元のゲームオブジェクトのrigidbodyの移動速度velocityにマウスの移動速度を指定しています。
こうすることで、そのゲームオブジェクトに速度が発生します。
マウスの左ボタンを離した後は、慣性で徐々に減速しながら移動します。

今回はスクロール範囲を制限していないため、どこまででもスクロールできてしまいます。
これはまた追々書き記すとして、基本的なフリック動作はRigidbodyを使えば簡単に実現できます。

上はあくまでも一例で、Rigidbodyを使わなくても実現は可能です。
ご参考にしていただけたら幸いです。