目次
はじめに
どうもこんにちは、情熱開発部の今井です。
今年ももう半ばまで来て、蒸し暑さが徐々に出てきました。
エアコン無しで過ごせるのも後少しになりそうです。
今回は蒸し暑さを吹き飛ばすジェットコースターのようなレールに沿った動きを作成できるCinemachineの各機能を紹介していきます。
オブジェクトをレールに沿って移動させたいシチュエーション
カメラやキャラクターを決められた道筋上を移動させたいシチュエーションとして、プレイヤーをトロッコに乗せて移動させたい場合の実装手順を紹介していきます。
プレイヤーをトロッコ移動させたい

使用バージョン
※Unity 2021.3.16f1
※Cinemachine 2.8.9
Cinemachineとは
CinemachineはUnityの公式アセットの1つで、様々なカメラワークをスクリプトを組まずに作成できるとても便利なツールです。今回はこのCinemachineに含まれているPath機能に焦点を当てて紹介していきます。
使用する機能について
CinemachinePath
各WayPointに設定された座標やレールの向き、ひねりの値からオブジェクトを移動させるためのレールを作成できます。厳密なレールにしたい場合に使われます。
Cinemachine Path マニュアル

CinemachineSmoothPath
こちらもレールを作成する機能ですが、CinemachinePathと異なりレールの向きを自動で補正してくれます。大まかな形で良い場合はこちらの方が簡単にできます。
Cinemachine Smooth Path マニュアル

CinemachineDollyCart
上記の機能で作成したレールに沿って、オブジェクトを移動させることができます。移動速度は一定で、CinemachineDollyCart単体の場合はオブジェクトがレールの向きと同じになります。
Cinemachine Dolly Cart マニュアル
レールに沿って移動し、常に指定したオブジェクトを映すカメラワーク作成手順

実装手順
プレイヤーをレールに沿って移動させる
まずはCinemachineSmoothPassを使用してレールを作成します。

次に移動させたいプレイヤーオブジェクトにCinemachineDollyCartをアタッチして、作成したレールや移動速度を設定します。

一度実行してみましょう。
上記の手順でレールに沿って移動できましたが、現在の処理だと坂道や下り坂でも一定の速度で移動するので、CinemachineDollyCartに少し変更を加えて加減速するようにします。
CinemachineDollyCartが持つ速度の値に対して、加減速の更新を行うスクリプトを追加します。
using Cinemachine;
using UnityEngine;
public class SpeedAccelerator : MonoBehaviour
{
[SerializeField] private CinemachineDollyCart dollyCart = null;
[SerializeField] private float Min_Speed = 1.0f;
[SerializeField] private float Max_Speed = 5.0f;
[SerializeField] private float SpeedAdjustment = 0.005f;
private void Update()
{
UpdateSpeed();
}
void UpdateSpeed()
{
float speed = dollyCart.m_Speed;
// 加減速
float acceleration = 1 + (SpeedAdjustment * -gameObject.transform.forward.normalized.y);
speed *= acceleration;
// 速度制限
if (speed < Min_Speed) speed = Min_Speed;
else if (speed > Max_Speed) speed = Max_Speed;
dollyCart.m_Speed = speed;
}
}
厳密ではありませんが、gameObject.transform.forward.normalized.yで上下への傾き具合を取得して加速度計算に使用しています。
速度更新処理の後にCinemachineDollyCartの処理を行わせるためにUpdateMethodをLateUpdateにして、このスクリプトをアタッチし、動作を確認していきましょう。
坂道で減速し、下り坂で加速するようになりスピード感が出ましたね。
終わりに
Cinemachineは追加のスクリプト無しでも色々できるとても便利なツールですが、スクリプトの内部処理を把握することで実装できる幅が広がるのでオススメです。
最後までご覧いただきありがとうございました!
参考サイト
【Unity】【Cinemachine】Virtual CameraのTracked Dollyでパスに沿ってカメラを動かす
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。