[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以下になったらオブジェクトを静止させます。
減速運動の計算処理は等加速度直線運動になっています。
それ以外は特に何の変哲も無いコードです。