説明
UnityのLerpとSlerp関数を使って、ゲームオブジェクトを指定した秒数で、指定位置へ移動・回転させる方法を紹介します。
環境
Unity 2020.1.1f1
作成
指定した秒数で、オブジェクトを指定位置へ移動・回転させるための、MoveTest.csを作成していきます。
・指定時間:10秒
・指定位置:Lerp関数で、移動前の位置から、xを+6だけ移動させる
・指定回転:Slerp関数で、移動前の回転角度から、y軸だけ180度回転させる
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveTest : MonoBehaviour { public GameObject gameObject; public float moveTime = 10.0f; // 移動時間 float elapsedTime = 0f; // 経過時間 float rate; // 割合 // 位置 Vector3 preposition; // 移動前位置 Vector3 postposition; // 移動後位置 // 回転 Quaternion prerotation; // 回転前角度 Quaternion postrotation; // 回転後角度 bool isMoving = true; void Start() { Transform transform = gameObject.GetComponent<Transform>(); preposition = transform.position; // 移動前位置 postposition = new Vector3(preposition.x + 6.0f, preposition.y, preposition.z); // 移動後位置(xを6移動) prerotation = transform.localRotation; // 回転前位置 postrotation = Quaternion.Euler(prerotation.eulerAngles.x, prerotation.eulerAngles.y + 180f, prerotation.eulerAngles.z); // 回転後位置(y軸を180度回転) } void Update() { if (isMoving == false) return; // 経過時間を過ぎたときの処理 if (elapsedTime >= moveTime) { Debug.Log(elapsedTime); Debug.Log(moveTime); isMoving = false; return; } elapsedTime += Time.deltaTime; // 経過時間の加算 rate = Mathf.Clamp01(elapsedTime / moveTime); // 割合計算 // 移動・回転 gameObject.transform.position = Vector3.Lerp(preposition, postposition, rate); gameObject.transform.localRotation = Quaternion.Slerp(prerotation, postrotation, rate); } }
※オブジェクトに上記のスクリプトをアタッチして、gameObjectに移動させたいオブジェクトをあててください。
Lerp関数は「線形補間」で、直線的な動きに使い、Slerpは「球面線形補間」で、球体など円を描きたいときに使うらしいです。
実行
実行すると、指定した時間(10秒)で、指定ポジションに移動・回転します。
以下のようになります。(例:Unityちゃんにスクリプトをはめてみた。)
以上です。
コメント