
マイケル
みなさんこんばんは!
マイケルです!!
マイケルです!!

エレキベア
クマ〜〜〜〜

マイケル
今こんなシューティングゲームを作ってるんだけど、
何が足りないか分かるかい?
何が足りないか分かるかい?

エレキベア
いろいろ足りない気がするクマ

マイケル
そう、迫力さ・・・!!
このゲームには迫力が足りないんだ!
このゲームには迫力が足りないんだ!

エレキベア
(言ってないクマ・・・)

エレキベア
でも確かに何か物足りないクマね
敵を倒した時の振動 とかあれば迫力出るのクマかね〜〜
敵を倒した時の振動 とかあれば迫力出るのクマかね〜〜

マイケル
そ、それだーーー!!!

エレキベア
(まさかの的中クマ・・・)
揺らす方法3選

マイケル
というわけで今回は、Unityで物を揺らす方法
についていくつか試していくよ!
についていくつか試していくよ!

エレキベア
どうやって実装するのがいいのクマかね〜〜

マイケル
調べた感じ、
・乱数を使用する方法
・パーリンノイズを使用する方法
・DOTweenを使用する方法
の3つが有名みたいだから、実装して比較してみます!
・乱数を使用する方法
・パーリンノイズを使用する方法
・DOTweenを使用する方法
の3つが有名みたいだから、実装して比較してみます!

マイケル
ちなみに今回のサンプルもGitHubに上げてるので
よかったらこちらも見てみてくださいね
よかったらこちらも見てみてくださいね

エレキベア
やったるクマ〜〜〜〜
1. 乱数を使用した実装

マイケル
まずは乱数を使用した実装から!
こちらは Random.Range() で乱数を取得して揺らす方法になります。
こちらは Random.Range() で乱数を取得して揺らす方法になります。

エレキベア
意外と長いクマね

マイケル
簡単に内容について解説するよ!

マイケル
まず揺らす情報として
・時間(duration)
・揺れの強さ(strength)
・どのくらい振動するか(vibrato)
を構造体として定義します。
・時間(duration)
・揺れの強さ(strength)
・どのくらい振動するか(vibrato)
を構造体として定義します。
↑揺らす情報の構造体定義

マイケル
そしてこの情報を元に位置を更新するのが下記処理になります。
現在の位置に乱数を加える 形で位置を調整しています。
現在の位置に乱数を加える 形で位置を調整しています。
↑位置を調整する

マイケル
徐々に振動を少なくするため、経過時間により減衰させるようにもしています。

マイケル
あとはこの処理をUpdate文の中で呼ぶだけ!
揺らすのが終わったら初期位置に戻す必要がある 点にはご注意ください。
揺らすのが終わったら初期位置に戻す必要がある 点にはご注意ください。
↑Update内で呼び出す

マイケル
実行するとこのように揺らすことができました!

エレキベア
ちゃんと揺れたクマ〜〜〜〜
2. パーリンノイズを使用した実装

マイケル
次にパーリンノイズ値を使用した実装について!
こちらはChinemachineでのカメラ揺れでも使われている方法です。
こちらはChinemachineでのカメラ揺れでも使われている方法です。

エレキベア
パーリンノイズって何クマ?

マイケル
パーリンノイズは 完全にランダムでなく入力値によって徐々に変化する値
を生成するのに適しているんだ!
Unityに Mathf.PerlinNoise で搭載されていて、XYの入力値から値を生成することができるよ。
を生成するのに適しているんだ!
Unityに Mathf.PerlinNoise で搭載されていて、XYの入力値から値を生成することができるよ。
Mathf.PerlinNoise – Unityスクリプトリファレンス

エレキベア
完全なランダムではなくなるクマね

マイケル
揺らす処理の他にも、地形生成やざらざら質感の表現 等にもよく用いられているんだ!
これを使えば乱数よりは自然な揺れを作ることができそうだ。
これを使えば乱数よりは自然な揺れを作ることができそうだ。

マイケル
これを用いた実装は以下になります。

マイケル
先ほどと全体的な構成は変わりありませんが、
主に下記の部分に違いがあります。
主に下記の部分に違いがあります。
↑パーリンノイズ値を使用した位置更新

マイケル
「速度*時間」をパーリンノイズの入力値とすることで変動させています。
また、ノイズ値を-1.0〜1.0の値に変換するため、初期位置に加える形 で設定することができます。
また、ノイズ値を-1.0〜1.0の値に変換するため、初期位置に加える形 で設定することができます。

エレキベア
これは期待できそうクマね

マイケル
また揺れの情報としても、新たにランダムなオフセット値を追加しています。
↑オフセット値の追加

マイケル
実行結果は下記の通り!

エレキベア
さっきより自然な気がするクマ〜〜〜
3. DOTWeenを使用した実装

マイケル
最後はDOTweenを使用した揺れの実装について!

エレキベア
DOTweenは有名なアセットクマね

マイケル
揺れの処理は用意されていて、DOShakePositionを使用することで実装できます!
アセット版には有償版もありますが、無償版で使用することができます。
アセット版には有償版もありますが、無償版で使用することができます。

マイケル
実装は下記の通り!

エレキベア
簡単クマ〜〜〜
今までの苦労はいかに・・・
今までの苦労はいかに・・・

マイケル
これまで定義していた時間、揺れの強さ、どのくらい振動するか
の他に、ランダム度合い、フェードアウトするかも指定することができます!
の他に、ランダム度合い、フェードアウトするかも指定することができます!

エレキベア
多機能すぎて勝てないクマ・・・

マイケル
ちなみに、揺らされる度に前回の処理を停止させないと、
連打されたら位置がどんどん変わってしまう ため注意です!
連打されたら位置がどんどん変わってしまう ため注意です!

マイケル
実行結果は下記の通り!

エレキベア
揺れもしっかりしてるクマ〜〜〜
揺れ方比較

マイケル
それでは実装した3種類の揺れを比較してみましょう!
下記のような4パターンのテスト実行スクリプトを書いて動かしてみます!
下記のような4パターンのテスト実行スクリプトを書いて動かしてみます!
↑テスト4パターン

エレキベア
楽しみクマ〜〜〜

マイケル
ちなみにDOTween使用については、
「ランダム度合い」は90、「フェードアウトするか」はtrueに設定してあります。
「ランダム度合い」は90、「フェードアウトするか」はtrueに設定してあります。
短めの揺れ

マイケル
まずは短めの揺れ(1秒)を実行!

エレキベア
動きは違えどさほど大きな違いはないように見えるクマね
長めの揺れ

マイケル
次に長めの揺れ(3秒)!

エレキベア
違いが大きくなってきたクマね
ランダム使用のはかなりカクカクしてるクマ
ランダム使用のはかなりカクカクしてるクマ
大きめの振動

マイケル
時間はそのままに振動を大きくしてみます。

エレキベア
ランダムのはガックガククマ
そしてDOTweenのは動きが落ち着いてるように見えるクマね
そしてDOTweenのは動きが落ち着いてるように見えるクマね
強めの揺れ

マイケル
最後に揺れを強くしてみます!

エレキベア
並べてみるとDOTweenのはやっぱりどこか落ち着いている感じはあるクマね
パーリンノイズの方が衝撃感はありそうクマ
パーリンノイズの方が衝撃感はありそうクマ
まとめ

マイケル
というわけで、それぞれの使用シーンをまとめると
下記のようになると思います!
下記のようになると思います!
[揺れ使用シーンまとめ]
・乱数を使用
→ガクガクな揺れにしたい時
・パーリンノイズを使用
→衝撃感のある揺れにしたい時
・DOTweenを使用
→落ち着いた感じの揺れにしたい時

マイケル
とはいえ、細かい実装や値によっても変わってくると思うので
この限りではありません・・・!
みなさん自分に合った揺れを見つけていきましょう!
この限りではありません・・・!
みなさん自分に合った揺れを見つけていきましょう!

エレキベア
楽しかったクマ〜〜〜〜
おわりに

マイケル
じゃーーん!!
早速ゲームに取り入れてみたぞ!!
早速ゲームに取り入れてみたぞ!!

マイケル
今回はUI部分にパーリンノイズを採用しました!
これだけでもだいぶ迫力が出たんじゃないかな!
これだけでもだいぶ迫力が出たんじゃないかな!

エレキベア
クオリティが高くなった気がするクマ〜〜〜

マイケル
今後パーリンノイズもDOTweenも、
それぞれ取り上げてみるのも面白そうだね!
また触ってみよう!!
それぞれ取り上げてみるのも面白そうだね!
また触ってみよう!!

マイケル
というわけで今日はこの辺で!
アデューー!!
アデューー!!

エレキベア
クマ〜〜〜〜
【Unity】揺らす方法3選!それぞれの揺れ方を比較してみた 〜完〜
[参考]
Mathf.PerlinNoise – Unityスクリプトリファレンス
DOTween – Documentation
【Unity】パーリンノイズで様々な物を揺らす | ねこじゃらシティ
DOTween でオブジェクトまたは画面全体をゆらす | ねぎたまらぼ