読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】パーティクルシステムの粒子を発光させるLightsモジュールを使う

3D Unity5.5 Unity パーティクル おもしろ演出、演出の強化

f:id:tsubaki_t1:20161203203040j:plain

今回はUnityのパーティクルシステム(通称Shuriken)に新しく追加された、Lightモジュールを使用して色々と遊んでみます。

パーティクルに光を追加する

f:id:tsubaki_t1:20161203204252g:plain

Unity 5.5で追加されたLightモジュールは、パーティクルの生成する要素の幾つかに光の処理を追加するモジュールです。
BloomやFlareで用いるような画面効果ベースの光表現ではなく、本当にライトを追加してしまうのが、このモジュールの面白いところです。

f:id:tsubaki_t1:20161203204520j:plain

「ライト」の設定

Lightモジュールが表現するライトは、シーン内もしくはPrefabとして存在するLightコンポーネントから取得するみたいです。

LightsのLightに設定したライティング設定を「基本的に」使用します。例えばコンポーネントのIntensityを上げれば輝度が上がりますし、Rangeを上げれば光が影響する範囲が広がります。

f:id:tsubaki_t1:20161203205203j:plain

ここで「基本的に」と言うのは、Lightsコンポーネントでもある程度の値が調整出来る為です。例えば Range Multiplier で光が影響する範囲が広がりますし、 Intensity Multiplier で輝度が上昇します。
この二つの項目があるのは、Lightコンポーネントの設定を使いまわしする為じゃないかなと個人的に思います。基本的な設定はLightコンポーネントで行い、微調整をLightsモジュールで行う感じです。

 

なお上記にも書きましたが、参照するLightコンポーネントPrefabやインスタンス化前のオブジェクトでも動作します。また、Lightコンポーネントを追加しているGameObjectが非アクティブでも動作します。
要するにLightコンポーネントの設定取ってるだけっぽいです。

f:id:tsubaki_t1:20161203205932j:plain

どの程度光表現を行うか

もう一つ重要な要素が、どの程度ライティングを行うかです。

ライト表現はかなり重い処理で、特にForwardレンダリングを行っている場合にはポイントライトの数はとても強く制限されます。
Deferredレンダリングではある程度の緩和があるとは言え、少ないに越したことは無いです。

 

Lightsモジュールで光を表現する上で見るべき項目は、RatioMaximum Lightsの二つです。Ratioは出てくる粒子が光を持ってる割合、Maximum Lightsはライトを表現出来る最大数についてです。

f:id:tsubaki_t1:20161203210755j:plain

Ratioはパーティクルにライトを付与する割合で、この値が1だとパーティクルを出力する際に全ての粒子にライトを付けようとします(実際にはMaximum Lightsの制限により無いパーティクルが存在します)

Ratioを1かつMaximum Lightsが十分に無い場合、後から生成された粒子に殆どライトが付与されていないという状態が起こり、ライトのON/OFFが切り替わったような表現になってしまいます。
下の図は、Maximum Lightsを3かつRatioを1に設定した状態で、3個3個と連続して出したケースです。あとから出したパーティクルにライトはありません。
平均して明かりを維持したいならば、Ratioは1を設定しない方が良さそうです。

f:id:tsubaki_t1:20161203211835j:plain

Maximum Lightsはその名の通りライトを表現出来る最大数です。単純に指定した数分ライトが表現出来る訳ですが、Maximum lights の 0 は例外な値らしく、置けるだけポイントライトが置かれていました。

Forwardレンダリングの場合さらにQualityの設定により削減されます。(Standaloneで4つ、Mobileで一つしかライトを置けない)

下の図は先ほどの設定をQuality SettingsでPixel Light Countを1に設定した場合です。Maximum Lightは3なのですが、一つしかライトが表現されていません。

f:id:tsubaki_t1:20161203212406j:plain

パーティクル表現の影響を受ける

Lightsモジュールは、パーティクル表現によって「ライトの色」や「ライトの範囲」「ライトの強さ」が変化するオプションがあるみたいです。

f:id:tsubaki_t1:20161203213214j:plain

例えばUse particle Colorにチェックが入っていれば、パーティクルの色がライトの光の色に影響します。これはStart ColorだけでなくColor Over Lifetime等も同様です。

f:id:tsubaki_t1:20161203213643j:plain

またSize Affect Rangeにチェックを入れて大きいパーティクルは広範囲・小さいパーティクルは狭い範囲に光の影響を与えるように出来ますし、Alpha Affects Intensity で透明度が薄いパーティクルの輝度を下げるオプションもあります。

勿論Range MultipleやIntensity MultipleをCurve制御して頑張る事も出来ると思いますが、パーティクルのサイズや透明度で調整出来るのは割と良さそうです。

f:id:tsubaki_t1:20161203213046g:plain

その他「Light」との違い

確実に違うかはまだ微妙なところですが、いろいろと検証した感じ以下の項目が通常のライトと違うっぽいです。

  • 使用できるLightコンポーネントはPointのみ
  • Shadowは使用できない
  • FlareとHalo、Cokieは使用できないぽい
  • Bounce intensity動いてないっぽい?
  • 画面外に粒子が移動すると、Lightを他のパーティクルに付け替えられる
    (ので、余り広いRangeは使用しない方がよいかもしれない)

おまけ

このLightsモジュールと、ノーマル付きのテクスチャシートアニメーションを駆使すると、中々に面白い表現が出来そうです。

 その辺りは、新しく追加されたパーティクルのデモ「Unity Particle Pack」が色々と参考になりそうです。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

 

次は5.5の目玉トレイルについて書きたい

【Unity】NavmeshAgaentの移動がOffMeshLink上で妙に加速するのを防ぐ

3D Unity Navmesh

OffMeshLinkは複数のNavMeshを繋ぐ上で役に立つ機能です。例えば下のようにメッシュ間に崖がある場合、その辺りを繋いでくれます。

但し、OffMeshLinkは何故か通常より高速で動作する性質があるらしく、若干気持ち悪い動きになってしまいます。

今回はその辺りを何とかします。

f:id:tsubaki_t1:20161201025139g:plain

OffMeshLink上の動きを一定にする

OffMeshLink上の移動速度を一定にするオプションは無いので、スクリプトで「OffMeshLinkに乗っている時、スクリプトで制御する」ようにします。

コードはこんな感じです。

gist.github.com

まず25行目の yield return new WaitWhile(() => agent.isOnOffMeshLink == false); でOffMeshLinkに乗るまで処理を待機します。

OffMeshLinkに乗ったらagent.Stop();で一旦Navmeshを停止し、スクリプト上でポジションを動かすようにします。

あとは目標地点に到着したらagent.CompleteOffMeshLink();agent.Resume();で移動を再開するだけです。

f:id:tsubaki_t1:20161201030123g:plain

 

もし、OffMeshLinkをジャンプや他のアクションで移動したい場合、30行目~37行目の処理を改造して、上手くアニメーションと合わせる等をするのが良さそうです。

サンプルコードでは20行目にagent.autoTraverseOffMeshLink = false;と記述しています。この処理によって意図的にOffMeshLinkをNavmeshAgentが渡れないように設定しています。 これはNavmeshAgentのisOnOffMeshLinkを確実に動かすためです。

OffMeshLink上での移動はどうもY軸の距離は見ていないらしく、X/Z軸の距離に応じて移動速度を決定しているみたいです。で、X/Z軸が同じだがY軸が異なる…といったケースの場合、0フレームでOffMeshLinkのゴールまで到達してしまうので、isOnOffMeshLinkが動作しません。

そこで「OffMeshLinkに乗るが移動はしない」autoTraverseOffMeshLink を設定しておくことで、予期しないワープを回避します。

f:id:tsubaki_t1:20161201031014j:plain

f:id:tsubaki_t1:20161201030656g:plain

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

【Unity】Navmeshで障害物を避けて移動するルートを事前に取得する

3D Navmesh Unity

今回は経路探索AI(Navmesh)のルートだけを取得してみます。

NavmeshAgentを使えば、とりあえずゴールへ至ることは出来ますが、色々と調整が出来ない所があったり、とりあえずルートを知りたいといったケースでは必要ありません。
なので、パスだけを取得してみます。

経路を取得するAPIとして、NavMesh.CalculatePathが使えます。
初期値点、目標地点のVector3(座標)を設定し、最後にPathのインスタンスを渡してやると、渡したPathインスタンスにルートが入っているという仕組みです。

マニュアルにも書いてある通り、即時実行する点には注意が必要です。
要するに、非同期で計算してくれないので場合によっては大きな負荷になります。

f:id:tsubaki_t1:20161129233122j:plain

 

gist.github.com

ちなみにmaxPositionでpositionsの配列のサイズを先に決めていますが、コレを行いGetCornersNonAllocを使用することで、Allocを削減する事が期待出来ます。
ただしpositionsの配列の長さしか値が格納されないので、場合によってはパスが途中で止まる事も有りえます。

安全性を期待するならpath.cornersで取得するのが良さそうです。

取得したパスで速やかにキャラクターを移動させる

次に、取得したパスを使用して、キャラクターをキビキビと動かしてみます。

f:id:tsubaki_t1:20161129233538g:plain

 

やっている事は簡単で、Vector3.MoveTowardsで目標の方向に指定の速度で動かし、到着したら目標の座標を更新しているだけです。

gist.github.com

OffmeshLinkに乗っている事を把握出来ない

なお、こういったCalculatePathで経路だけを取得して利用する場合、OffmeshLinkに乗っている事を判定するisOnOffMeshLinkが使えません。そのため、OffmeshLinkを通過する際のアクション(例えば崖を下りたり段差を飛び越える等)は、他の手法で認識する必要があります。コライダーとか。

f:id:tsubaki_t1:20161129234728j:plain

その他

逆を言えば、OffmeshLinkで妙に加速するのを回避する手っ取り早い方法が、今回の「自前でパス取得して動かす」という話もあります。

(別にわざわざ同期型で取らなくとも、NavMeshAgent & updatePosition = falseでPathだけ計算してもらって、後は自分で移動させるといった方法もアリです。

gist.github.com

【Unity】Visual Studio for Mac (preview) をUnityに使ってみる

Monodevelop・VisualStudio・その他IDE Unity

諸君! 全国一千万くらいのMacユーザーしかしVisual Studioファンの諸君!
ついに我々の待ち望んでいた物が来た!

Visual Studioを!
MacユーザーでもVisual Studioを!

 

ATOMベースのソレッぽい奴でも無い、バーチャルマシン経由で起動しないといけない奴でも無い、正しく、Macの、Macユーザーの為のVisual Studioを!

 

 

さぁ、時は来た、起動せよVisual Studio for Mac!!!

f:id:tsubaki_t1:20161126195343p:plain

V...Visual … Stu...dio ... .... ?

Visual Studio for Mac (preview)

先日のConnect(); 2016にて、Visual Studio for Macが発表されました。

blogs.msdn.microsoft.com物自体は見た目通りXamarinベースみたいですが、幾つかのVisual Studioお馴染みの機能が追加されているみたいです。曰く、

Visual Studio for Mac を起動すると、Visual Studio IDE で馴染みのある Roslyn コンパイラ、IntelliSense のコード補完、リファクタリング機能を利用できます。また、Visual Studio for Mac では Visual Studio と同じ MSBuild のソリューションおよびプロジェクト形式が使用されるため、MacWindows 間でプロジェクトを透過的に共有できます。

 

インストールしてみる

Visual Studio For macをインストールしてみました。

まず、New Release Preview: Visual Studio for Mac | Visual Studioよりインストーラーが取得してインストールします。

その際、インストールするオプションがあるので、Intel HAXMだけインストールしてみました。f:id:tsubaki_t1:20161126195946p:plain後は流れに身を任せる感じで、インストール出来ました。

f:id:tsubaki_t1:20161126200340j:plain

Unityに登録してみる

次にUnityに登録してみます。と言っても、現状上手い接続方法が分からなかったので、「とりあえず動いたヒャッホー」というレベルです。

Preferences...からExternal Toolsを開いて、External Script EditorにVisual Studioを選択するだけです。

f:id:tsubaki_t1:20161126200532j:plain

f:id:tsubaki_t1:20161126200626p:plain

これで動くには動きますが、ソリューションを選択出来ていないので、ソリューションはslnを別途選択して開く必要があります。

 

また、デバッガはUnityエディタにアタッチ出来ませんでした。

感想

VisualStudioの名を冠しているならば期待せざるを得ない。

関連

tsubakit1.hateblo.jp