LineRendererでレーザーのようにアニメーションさせる

A01

UnityでNodeGarden その2 」では、LineRendererで線を引くことができましたが、ノードを動かしたときにアニメーションがうまくいきませんでした。ソースコードにいろいろ修正を加えていてシンプルに考えるのが難しくなってきたので、改めて、小さなプロジェクトを作成して、SetVertexCount関数などの挙動を確認しました。

参考資料は2014年に書かれた以下の資料で、現在でも問題なく実装できました。

ソースコード

線を引くスクリプト

画像左側のアニメーションをしないキューブ間の線を引いたスクリプトです。大きな変更はなく、キューブを3つにしたぐらいです。

 

キューブの円運動スクリプト

線を描画したときにキューブが動いたらどうなるか確認するために、キューブをMath.sinで円運動させました。Math.sin、Math.cosでTime.timeで時間が進むごとに、-1から1の範囲の値が取得できます。それをキューブの初期のX座標に足すことで円運動になります。

このソースコードを試したところ、gif画像の左側のように、キューブ間の線が追随して描画されることが確認できました。なのでこのソースコードをベースにすれば、「UnityでNodeGarden その2 」での失敗が修正できそうです。

Lineアニメーション・スクリプト

ちょっと難しそうですが、やっていることは簡単で、1をLineDrawSpeedで割って、それをcountに加算していくことで、線の長さが増えていきます。それでスフィア座標(srcTrans)-スフィア座標(destTrans)がスフィア間の距離なので、そこまで線を引くようになっています。

もし、スフィア間より、線のcountが大きくなったら、SetVertexCount(0)でLineRendererを初期化して、count=0で、線の長さも初期化しています。

ここで重要なのが、Update関数で、SetVertexCount(0)を呼び出すときは、SetVertexCount(2)を呼び出さないことです。Unityでは(DirectX、OpenGLでも同様)、Update関数から抜けた後に描画処理が実行されます。そのため、1回のUpdate関数呼び出しの時に以下のようにSetVertexCountを書いても、SetVertexCount(0)で描画がリセットされて、SetVertexCount(2)で、再設定されるというわけではありません。この場合は、SetVertexCount(2)で2が頂点数として保持されて、Update関数から抜けると、描画処理では頂点数2と判断して描画が開始されます。

 

まとめ

DirectXやOpenGLも同様で、当たり前なのですが、ノードの移動やパーティクルの調整などいろいろなコード修正をしていたら、SetVertexCountの更新と、描画処理の関係も忘れていました。今回シンプルな実装を試したことで、NodeGardenを完成させることができそうです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA