はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】手ブレをDoTweenを用いて簡単に実装する

はじめに

今回は手ブレをDoTweenというアセットを用いて実装してみようという記事になります!

実際にやってみた例はこんな感じ。

f:id:hanaaaaaachiru:20200316005053g:plain


これは開発中のゲームの一場面ですが、DoTweenというアセットを用いることでたった一行で作ることができます。

では早速みていきましょう。

作り方

手ブレに用いるメソッドはこちら。

DOShakePosition(float duration, float/Vector3 strength, int vibrato, float randomness, bool fadeOut)
名前 意味
duration 持続時間
strength 揺れの強さ
vibrato どのくらい振動するか
randomness どれくらいランダムにするか(0 ~ 180)
fadeOut 持続時間が終わるときに自動的にフェードアウトするかどうか

DOTween - Documentation


これはTransformもしくはCameraなどの拡張メソッドとして定義されており,大差ありませんがCameraに対して今回は使ってみたいと思います。

using UnityEngine;
using DG.Tweening;

public class CameraShaker : MonoBehaviour
{
    // インペクターから設定する
    [SerializeField] private Camera _camera;

    private void Start()
    {
        _camera.DOShakePosition(duration: 10, strength: 1, vibrato: 1, fadeOut: false)
            .SetLoops(-1);
    }
}


デフォルトでは結構元気にカメラが動くので、vibratoを小さい値にすることでゆっくりにできます。

さらにfadOutはデフォルトでtrueですが、ループさせる場合はフェードアウトさせない方が良いでしょう。

SetLoop(-1)をすることで永遠にループするようになります。

ちなみに最初の頃はSetLoopメソッドの位置に驚かれる方もいるかもしれませんが、これはメソッドチェーンと呼ばれるものでどんどん後ろにメソッドを追加することができます。



また手ブレを止めたい場合は、返り値のTweenerからKillメソッドを呼びます。

using System.Threading.Tasks;
using DG.Tweening;
using UnityEngine;

public class CameraShaker : MonoBehaviour
{
    // インペクターからを設定する
    [SerializeField] private Camera _camera;

    private async Task Start()
    {
        var tweener = _camera.DOShakePosition(duration: 10, strength: 1, vibrato: 1, fadeOut: false)
            .SetLoops(-1);

        // 10ms秒待つ
        await Task.Delay(10);

        tweener.Kill();
    }
}


またDoTweenに詳しい方はCompleteがいいんじゃないかと思われるかもしれませんが、確かループだとダメだったような気がします。

さいごに

画面がずっと静止しているよりは少し動きがあったほうが、見た目がよくなるような気がします。

このアセットを用いればお手軽にできるので、是非試してみてください。

ではまた。