[Unity] Rigidbodyを使わずにオブジェクトをフリックする

前回に引き続き、今回はRigidbodyを使わずにフリック動作を実現してみたいと思います。

基本的な考え方は、「ドラッグ中はマウス位置に追従、ボタンが離されたら減速移動」させることです。
以下のスクリプトを追加するして実現できます。

FlickMove2.cs

using UnityEngine;
using System.Collections;

public class FlickMove2 : MonoBehaviour {
	private Vector3 clickStartPos;	// マウスがクリックされたときのカーソルの位置
	private Vector3 transStartPos;	// マウスがクリックされたときのゲームオブジェクトの位置
	private Vector3 prevMousePos;	// 1ループ前のマウス位置
	private Vector3 inertiaVel;		// 慣性力による速度
	private bool isDragging;		// ドラッグ中
	public float LinerDrag = 30.0f;	// 減速度合

	// Use this for initialization
	void Start(){
	}

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

		if ( Input.GetMouseButtonDown(0) ) {
			clickStartPos = mousePos;
			transStartPos = transform.position;
			isDragging = true;
		}
		if ( Input.GetMouseButtonUp(0) ) {
			// ボタンが離されたときはマウスカーソルの移動速度を慣性に反映
			inertiaVel = (mousePos - prevMousePos) / deltaTime;
			Debug.Log(inertiaVel.ToString());
			isDragging = false;
		}


		if ( isDragging ) {
			// ドラッグ中はマウスの位置に追従
			transform.position = transStartPos + mousePos - clickStartPos;
		} else {
			// 慣性による移動
			transform.position += inertiaVel * deltaTime;

			float magnitude = inertiaVel.magnitude - LinerDrag * deltaTime;
			if ( magnitude <= 0.0f ) {
				inertiaVel = Vector3.zero;
			} else {
				inertiaVel = inertiaVel.normalized * magnitude;
			}
		}

		prevMousePos = mousePos;
	}
}

今回はかなりごり押しな方法で実現しました。
マウスのボタンを離したら、離したときの速度を保存して減速運動を始めます。
オブジェクトの速さが0以下になったらオブジェクトを静止させます。

減速運動の計算処理は等加速度直線運動になっています。
それ以外は特に何の変哲も無いコードです。