別の記事で普通のカメラを揺らす(シェイク)方法を紹介したので、今回はそれをCinemachineで解説をしようと思います。
3Dで解説していますが2Dでも使えるものですので是非参考にしてみてください。
準備
まずは、Cinemachineを用意します。
Cinemachineをインストールしていない方はPackage Managerからインストールをしてください。
インストールの仕方はこちらの記事を参考にしてください↓
インストールができたら、ヒエラルキーウィンドウで右クリック>Cinemachine>VitualCameraの順でVitualCameraを生成しましょう。
VitualCameraのインスペクターで二つの項目を変更します。
Noiseを「Basic Multi Channel Perlin」に変更すると、いろんな項目が出てきます。
Noise Profileを「6D Shake」に。
Frequency Gainを「1」にしましょう。
それでは、スクリプトで制御していくようにします。
揺らすスクリプト
「CameraShaker」というスクリプトを作成し、このように書きましょう。
using System.Collections;
using System.Collections.Generic;
using Cinemachine;
using UnityEngine;
public class CameraShaker : MonoBehaviour
{
public static CameraShaker Instance { get; private set; }
private CinemachineVirtualCamera cam;
private float shakeTimer;
//このスクリプトをインスタンス化
private void Awake()
{
Instance = this;
cam = GetComponent<CinemachineVirtualCamera>();
}
//この関数に揺れの強さと揺れる時間の引数を渡す
public void ShakeCamera(float intensity, float time)
{
CinemachineBasicMultiChannelPerlin cinemachineBasicMultiChannelPerlin =
cam.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
cinemachineBasicMultiChannelPerlin.m_AmplitudeGain = intensity;
shakeTimer = time;
}
void Update()
{
//揺れ時間が終わったら揺れを止める
if (shakeTimer > 0)
{
shakeTimer -= Time.deltaTime;
if (shakeTimer <= 0f)
{
CinemachineBasicMultiChannelPerlin cinemachineBasicMultiChannelPerlin =
cam.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
cinemachineBasicMultiChannelPerlin.m_AmplitudeGain = 0f;
}
}
}
}
この「Camera Shaker」をVitualCameraにアタッチします。
しかし「Camera Shaker」は、「他のオブジェクトから呼び出されたら揺れる」ようになっているのでこれだけでは揺れません。
「Camera Shaker」を他のオブジェクトから呼び出してみましょう。
適当に「CameraManager」というオブジェクトを作り、カメラの揺れを呼び出すスクリプトを追加します。
「Camera Shaker」はこのように呼び出します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShakeCameraScript : MonoBehaviour
{
void Update()
{
if (Input.GetMouseButtonDown(0))
{
CameraShaker.Instance.ShakeCamera(5, 0.2f);
}
}
}
これで、左クリックで強さが「5」、持続時間が「0.2」の揺れを呼び出すことができます。
実行をするとこのようになりました!
このように揺れを簡単に呼び出すことができました!
まとめ
いかがだったでしょうか?
CameraShaker.Instance.ShakeCamera(揺れの強さ, 揺れの持続時間);
この一行で簡単に揺らしてゲームに迫力を持たせることができます!
参考にした動画↓