オブジェクトを行ったり来たりゆらゆらと動かしたい

投稿者: | 2019-03-25

コサインを使う

オブジェクトをうねうねと上下や左右に行ったり来たり動かしたいときは、とにかく、一定の範囲で増減するような値があるといいです。
そういうときは学校で習った三角関数(コサイン)を使います。


コサインはb/aですね。Cosinの「C」の書き方で覚えました。

なんか面倒くさそうですが、もしこの分母のaが1だったら、コサインの値はbです。

aを1に固定したまま角度を変えると、0度から90度までなら、bの長さは短くなっていくとわかります。

では90度より大きいとどうなるでしょうか。

これは高校でも、とにかくこう定義するんだよと教わるところでしたね。

鋭角の場合はさっきと同じで、半径が1なので、ちょうどx座標の値(中心から、緑の縦線がX軸とぶつかるところまでの長さ)がコサインの値であるのがわかります。
これを90度以上に拡張できます。もっと角度を開いて、230度くらい(ピンクの線)になっても、そのx座標がコサインの値です。ここはマイナスの値ですね。
とにかく半径が1の円では、x座標がコサインの値です。

すると、角度が0の時はコサインの値は1でそこからだんだん値が小さくなっていき、90度では0になって、そこからマイナスになり、180度で-1になって、それ以降はまた値が上昇していって、360度ではまた値は1に戻ります。

Unityで使う

360度を超えても、この円をくるくる回り続けるだけなので、角度を際限なく広げていけば、1から-1を行ったり来たりするような値が得られます。

コサインの値を得るには、Unityでは、Mathf.Cos() をつかいます。このカッコの中に角度を入れるとコサインの値が出ますが、角度の単位は「〇〇度」ではなくラジアンを使います。
聞きなれないかもしれませんが、要するに、0度=0(ラジアン)で、360(度)=2π(ラジアン)です。πは3.14..ですから、 0~6.28…で円を一周します。

ラジアンの値が6.28…を超えても、さっきの円の2周目、3周目に突入していくだけで、コサインの値は -1~1を延々と行ったり来たりしてくれるわけなので、Mathf.Cos()の()に入れる値は、ずっと増えたり減ったりしてくれる値なら何でもよいのです。
なので、ゲーム開始からの秒数や、経過したフレーム数である、「Time.time」や「Time.frameCount」を入れたりします。

例えば、動いているオブジェクトに、横へゆらゆらと動きながら進んでほしいと思ったときは、そのオブジェクトの真横の方向にこのコサインの値をかけたものを、オブジェクトの位置に足し続けてあげたりすればよいですね。
足した分だけオブジェクトはその方向へ移動します。transform.right はそのオブジェクトがどっちへ向いていようと常に右の方向を示すので便利です。transform.up だと真上の方向です。

コメントを残す

メールアドレスが公開されることはありません。