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を完成させることができそうです。

UnityでNodeGarden その2

001

前回「UnityでNodeGarden その1」ではとりあえず箱を表示することしかできませんでしたが、LineRendererとカメラのImageEffectsによるBloom、ParticleSystem、オブジェクトの発光で上記の画像のように表示することができました。

まだ問題があって、LineRendererの描画が残ってしまい、ノードが移動すると、どんどん線が増えて行ってしまう状態です。これを解決するにはLineRendererを使っているサンプルなど、他人のプログラムを試す必要がありそうです。

ちなみに最初のコードは以下のような感じでした。我ながらだいぶ成長できたと感じます。

unity01

 

 

ソースコード

元々はLineを生成するためのコードだったのですが、現在はノードを50個生成するソースコードです。これは特に難しいことはしていません。

 

LineRendererで線を描画するスクリプトです。一度引いた線を消すことができていないので実装を修正する必要があります。

 

プロジェクトの配布

このプロジェクトはかなりソースコードが途中ですが配布します。

http://hajimete-program.com/games/LineRendererSandbox.zip

 

 

LineRendererを使うため資料を調べてみました。

Unityで線を引く場合は、長方形のオブジェクトを作るのではなく、LineRendererを使えばよいことがわかりました。そこでいくつか調べた情報をメモとしてのこしておきます。

LineRenderderの基礎

ただ、LineRendererを使うだけでは退屈ですが、GenerativeArtの実装をUnityで召している日本の方がいました。参考にさせていただきましょう。

Unity入門 : UnityでGenerative Artっぽい表現をしてみる。– bluschetta tomoyukim’s blog

 

レーザーを作るYoutube動画チュートリアル