(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

パーリンノイズを使ってアニメーションにランダムなゆらぎを与える【Unity】


このエントリーをはてなブックマークに追加

この記事はUnity #2 Advent Calendar 2018の3日目の記事です。


この記事でのバージョン
Unity 2018.2.17f1


はじめに

【Unity道場 京都スペシャル2 2017】乱数完全マスターという講演の動画を見ていたら、

パーリンノイズを使って全ての関節にゆらぎを与え、ランダムかつ自然な待機アニメを作る

という面白そうな事をやっていました。


f:id:kan_kikuchi:20181201180531g:plain
【Unity道場 京都スペシャル2 2017】乱数完全マスター - YouTube


これを使えば「違うキャラなのに全く同じアニメをする」「全く同じアニメをリピートし続ける」

というゲームではよくある不自然さをなくせます。


今回はこれを応用して、アニメにゆらぎを追加し

「基本的には同じだけど、ちょっと違うし、ランダムなアニメ」を作ってみました!


イメージとしては以下のような感じ。


f:id:kan_kikuchi:20181201193621g:plain


なお、本記事に出てくる3Dモデルは以下のものを使っています。





パーリンノイズとは

そもそもパーリンノイズとは、なんぞやという事ですが、

Unityのリファレンスには以下のように説明されています。

Perlin noise is a pseudo-random pattern of float values generated across a 2D plane (although the technique does generalise to three or more dimensions, this is not implemented in Unity). The noise does not contain a completely random value at each point but rather consists of "waves" whose values gradually increase and decrease across the pattern. The noise can be used as the basis for texture effects but also for animation, generating terrain heightmaps and many other things.

Google翻訳

Perlinノイズは、2D平面全体で生成される浮動小数点値の擬似ランダムパターンです(3つ以上の次元に一般化されますが、Unityでは実装されていません)。 ノイズは、各点で完全にランダムな値を含むのではなく、その値がパターン全体にわたって徐々に増加および減少する「波」からなる。 ノイズは、テクスチャエフェクトの基礎として使用されるだけでなく、アニメーション、地形の高さマップなど多くのものの生成にも使用できます。

f:id:kan_kikuchi:20181201162348p:plain


つまり、単純にランダムな値を返すのではなく、

入力値(xとy)の変化に合わせて徐々に変化するような乱数という事です。

端的に言えば、変化がなだらなかな乱数と言った感じでしょうか。


これが何に使えるかと言えば、ランダムだけど値の変化が急激だと困るものです。

例えばマイクラのマップ生成のようなものです。





PerlinNoiseAnimeRandomizer

では本題の、パーリンノイズを使ってアニメーションにランダムなゆらぎを与える

PerlinNoiseAnimeRandomizer(以下Randomizer)のプログラムです。



RandomizerはAddされたオブジェクトのRotationを

パーリンノイズを使って(アニメーション後に)にランダムなゆらぎを与えます。

例えばCubeにAddしてみると以下のような感じ。


f:id:kan_kikuchi:20181201180150g:plain


これをキャラクターに使いたい場合は、体の各部位のオブジェクトに設定しなきゃいけないので、

PerlinNoiseAnimeRandomizerSetter(以下Setter)というものも作りました



Setterはゲーム開始(Awake)時に、子以下にある全てオブジェクトにRandomizerを設定します。

なお、既に設定されているものには設定しません。


f:id:kan_kikuchi:20181201181349j:plain


また、エディタ上で設定したり、削除したりすることも可能です。

こちらも、既に設定されているものには設定しません。


f:id:kan_kikuchi:20181201181358j:plain


Setterを使えば、一つ一つの部位にRandomizerを設定しなくてすみますが、

顔のパーツや足など、場合によっては必要ない部分にも設定してしまいます。

f:id:kan_kikuchi:20181201181845g:plain


そういう時はIgnore Listを使います。

上のParentだと設定したものとその子以下全てに設定しなくなり、

下のTransformだとその対象だけ設定しなくなります。


f:id:kan_kikuchi:20181201181826j:plain


実際にゆらぎを与えてみたものが以下のような感じ。

1番左が何もしてない通常のアニメーションで、

真ん中がデフォルトのゆらぎ、右が強め&早めのゆらぎを設定したものです。


f:id:kan_kikuchi:20181201183338g:plain


パラメータ

Inspector上にも説明は出していますが、一応パラメータの説明もしておきます。


まずWhole Scaleで全体のゆらぎの大きさを設定します。


f:id:kan_kikuchi:20181201183002j:plain


試しに値を変えて比較してみると以下のような感じ。(左から10, 30, 60)


f:id:kan_kikuchi:20181201183818g:plain


次にXyz ScaleでXYZごとのゆらぎの大きさを設定します。


f:id:kan_kikuchi:20181201183019j:plain


試しに値を変えて比較してみると以下のような感じ。

(左から[10, 1, 1] [1, 10, 1] [1, 1, 10] )


f:id:kan_kikuchi:20181201184210g:plain


最後にFrequency RateでXYZごとのゆらぎの速さを設定します。


f:id:kan_kikuchi:20181201183028j:plain


試しに値を変えて比較してみると以下のような感じ。(左から1, 5, 10 )


f:id:kan_kikuchi:20181201184621g:plain


なお、各パラメータはSetterでの設定時に全部同じ値になりますし、

Randomizer設定後も更新ボタンを押すことで一気に更新することも可能です。


f:id:kan_kikuchi:20181201185111g:plain


逆にゲーム開始前にRandomizerを設定し、

Randomizerの方の値を変えればパーツごとに値を変える事も可能です。

例えばスカートだけに大きなゆらぎを与えると以下のような感じ。(風を受けてるイメージ)


f:id:kan_kikuchi:20181201185354j:plain
f:id:kan_kikuchi:20181201185604g:plain


おわりに

記事中では待機アニメだけでしたが、もちろん他のアニメに使うことも出来ます。


f:id:kan_kikuchi:20181202063017g:plain


それなりに調整は必要になりますが、

RPGの状態異常を待機アニメで表現したり、歩く場所によって微妙に歩行アニメを変えたりと

工夫次第で色々と面白い事が出来そうです。


ただし、今回紹介したのは試しに作ったもので、

アニメごとの設定などは出来ないので、このまま実際に使うのは難しいかもしれません。