テラシュールブログ

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

【Unity】パーティクルのタイミングをTimelineで制御する

f:id:tsubaki_t1:20171021233313g:plain

今回はParticle System(Shuriken)の生成タイミングをTimelineで制御する方法についてです。

Particle Systemとタイミング制御

パーティクルのタイミングを制御する場合、多くのケースでは以下の3つのアプローチだったんじゃないかなと思います。

  • パーティクルのStart Delayで生成タイミングを調整する
  • GameObjectのアクティブを切り替えるスクリプトを記述する
  • Emit等で呼び出すコードをスクリプトから記述する
  • パーティクル生成のタイミングをAnimationEventやコルーチンで制御する

f:id:tsubaki_t1:20171021233900j:plain

この面倒な所は、スクリプトからParticleを制御する場合にはゲームを再生しないと動作が確認出来ない点が問題になります。

またStart Delayの場合は基本的に、Particle以外の要素と含めた動作を確認するのがに面倒です。

f:id:tsubaki_t1:20171021235147g:plain

まぁ、Start Delayは色々と面倒な所があるので、基本的には

  • 単一のParticle内のタイミング調整はStart Delay
  • 全体的なタイミング調整は、スクリプト(をスクリプトやAnimationEvent等から呼び出す)

といった調整になるかなと。

 

個人的には、Particleのタイミングは表現を気持ちよくする為の重要なファクターだと思っているので、この制御に特殊技能が必要になったり、何度も試すのが面倒になっていたりするのは非常に面倒な話です。

 

ほんの僅かにタイミングをズラシてみますが、結構印象が変わるものです。

f:id:tsubaki_t1:20171022110211g:plain

f:id:tsubaki_t1:20171022110443g:plain

ParticleのタイミングをTimelineから制御

微調整と制御が容易なTimelineにて、パーティクルのタイミングを制御してみます。

こちらのアプローチだと、パーティクルの生成タイミングが非常に簡単に出来るようになります。
勿論Timelineで制御する事が前提となりますので、イベントシーンや戦闘エフェクトシーン、ガチャ演出等に使えるかな?という感じです。

動作をゆっくり確認したり巻き戻したり、発生の時間をズラしたり、他のアニメーションとタイミングを合わせたり。

f:id:tsubaki_t1:20171021234711g:plain

f:id:tsubaki_t1:20171022111502g:plain

 ControlPlayableでParticleを制御する

パーティクルの制御はControl Playableで制御できます。Control Playableにパーティクルをセットすれば、Clip開始地点からパーティクルの再生が始まります。

  1. Control Trackを追加し、
  2. Add Control Playable Asset Clipを追加、
  3. Source Game Objectにパーティクルを指定

https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20170921/20170921232719.jpg

https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20170921/20170921232832.jpg

f:id:tsubaki_t1:20171021235823j:plain

幾つかの問題

ただこの方法、幾つかの問題が確認されています。
例えば以下の二つです。

  • SubEmitterが動作しないバグがある
  • RateOverDistanceが動作しない

SubEmitterは兎も角、RateOverDistanceは動いて欲しい所です。

 

また、バージョンアップで治りましたが初期バージョンではParticle側のマテリアル変更等が即座に反映されないといった動作も確認されました。

こちらはPreviewを二回押して(On/Offを切り替える)Timelineを再起動すれば解決します。

f:id:tsubaki_t1:20171022111721j:plain

面倒な事にTrackではなくClipにアクションするParticleを設定する機能になっています。要するに動的なバインドが面倒くさいです。
下のようなアプローチを取るか、ParticlePlayableを制御するTrackを作成すれば回避可能ですが、うーん

tsubakit1.hateblo.jp

その代わり1トラックに複数のParticleをセット出来るといえばメリットはありますが…

f:id:tsubaki_t1:20171022001554j:plain

関連

tsubakit1.hateblo.jp

 

【Unity】Audio MixerのSnapshotを殆どコードを書かずに変更する

f:id:tsubaki_t1:20171020015524j:plain

やってみたら出来ちゃったシリーズ

Audio MixerのSnapshotを、殆どコードを書かずに実行時に切り替えます。

Audio MixerのSnapshot

古の時代、Unity 5と呼ばれる時代にてAudio Mixerという機能が追加されたそうじゃ。

滅多に解説されないAudioMixerには、ある珍しい機能があったそうな。

 

その名もSnapshot。

 

Group(Audio Sourceが音を出力する先)の設定を保持し、簡単に切り替えられるようにする素晴らしい設定じゃ。

ただ、使うにはFindSnapshot("Snapshot名")という非常に微妙なAPIを呼ばなくてはならぬため、余り使っている人を見ておらぬのじゃ。

tsubakit1.hateblo.jp

普通にやる場合は、こんな感じのコードになるのじゃ。

gist.github.com

Snapshotをコードを書かずに切り替える

とまぁ、そんなこんなで今まで普通に放置してきた機能ですが、ふとノーコーディングでSnapshotの切替が出来ないかと試し所、出来てしまったので書いておきます。

 

簡単に言えば、UnityEventでSnapshot切替のコードを呼び出します。

 

  1. Buttonを作成し、OnClickにMixerのアセットを直接セット、
  2. AudioMixerController.TargetSnapshotを設定し、スナップショット(図では屋内)を引数にセット

これで、ボタンを押したらSnapshotの設定が屋内に切り替わります。

f:id:tsubaki_t1:20171020020618j:plain

まぁ「フェード」は出来ませんが…

ボタン以外にも使ってみる

ボタン以外、特定の状況で呼び出されるようにしてみます。

例えばステージの屋内に入ったら「屋内」のSnapshot、屋外に行ったら「屋外」のSnapshotになるように切り替える…とか。

f:id:tsubaki_t1:20171020021042g:plain

やってる事は単純で、下のような汎用イベント呼出コードを用意します。

 

gist.github.com後は入り口と出口にTriggerとなるColliderを用意し、ボタンと同様に入り口と出口に対応するSnapshotを有効にするイベントを登録するだけです。

f:id:tsubaki_t1:20171020021530j:plain

 

何の役に立つかだって?良い質問だ。君にはソレを考える権利をあげよう。

関連

tsubakit1.hateblo.jp

【Unity】「最適化をする前に覚えておきたい技術」

Unity開発者なら一度は目を通しておくと幸せになる資料です。

「最適化=実際に手を動かす」の前に、何をすれば効果的なのか を探す方法について紹介されています。

要するに、Unityで良くある問題とプロファイラの使い方についてです。

 

www.slideshare.net

同名のスライドが幾つか上がっていますが、基本的には概ね同じ内容です。

【Unity】Timelineから他のTimelineを呼び出して再生する

今回はTimelineの中からTimelineを再生するアプローチについてです。

Timelineは「少し異なるが概ね同じ」や「複数人編集」で面倒なことになる

Timelineでは基本的に一つのTimeline Assetを経由してシーン上のGameObjectやComponentを操作します。

 

これは言い換えれば、複数人でTimelineを操作すると簡単にコンフリクトを起こす…という意味でもあります。

オーディオのタイミングやパーティクルの内容、ユニットの移動等、調整する人を割り振る場合は、アセットの単位を分割したくなります。

 

一応、Timeline AssetもYAML(テキスト)で保持されているのでマージは可能ですが、できれば避けたい物です。

 

f:id:tsubaki_t1:20171016201847j:plain

 

また同様に似たような表現だが少し違う…といった事をやりたい場合、Timelineを細切れにして連番で再生する、もしくはTimelineの中身をコピペして複数のTimelineAssetに使う等の手段が必要になります。

 

これは例えばイントロは同様の設定ですがレアリティ毎に挙動が少し異なるガチャや、受ける対象によって微妙に挙動の異なる必殺技等です。

下のGifアニメでは2種類の撃破シーンパターンを用意してみました。戦車が登場し発泡するまでは同一の内容ですが、撃破対象によって撃破時の挙動が若干異なります

 

f:id:tsubaki_t1:20171016203201g:plain

TimelineをTimelineが呼び出す

そこでTimelineを複数のアセットに分割し、親Timelineから子Timelineを呼び出して制御する方法を試してみます。

 

まずTimelineの中身を二つに分割してみます。

  • 奥の戦車が出現し、発砲する
  • 手前の戦車が被弾し大破する

これで二つのTimelineが出来ました。
勿論、Playable Directorは二つあり、それぞれが参照を設定しています。

 

f:id:tsubaki_t1:20171016204721g:plain

 

Control PlayableはPlayable Directorも操作できる

次にTimelineを操作するため、Control Playableを追加します。

実はControl Playableは「ITimeControl」の他にも「Particle」や「Playable Director」が操作できます。

 

ということで、親のTimelineを用意し、奥の戦車のTimeline用と、手前の戦車のTimelineをコントロールするためのControl Playableを追加していきます。

 

f:id:tsubaki_t1:20171016205614j:plain

f:id:tsubaki_t1:20171016205315j:plain

f:id:tsubaki_t1:20171016205759j:plain

 

Parent のTimelineには、手前と奥の二種類のTimelineを登録する感じです。

Control Playable Assetの、シーン上の手前と奥の戦車を操作しているPlayable Directorをセットします。

 

f:id:tsubaki_t1:20171016210045j:plain

 

これでParentのTimelineを動かすと、Control Playableが選択しているTimelineも動作するようになります。

 

f:id:tsubaki_t1:20171016210553g:plain

 

操作イメージはこんな感じです。

www.youtube.com

参照するTimelineの動的な差し替え

この方法で面倒くさいのが、参照するTimelineの差替です。

Trackは以前紹介したような方法で簡単(?)に差し替えられるのですが、Clipの中身の差替は面倒くさいです。

上がTrack、下がClipです。

 

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

Control Playableの子にPlayable Directorを配置するアプローチ

ので、手っ取り早い方法を紹介します。それはControl PlayableのSource Objectは適当なオブジェクトをセットしておき、その子として動かすPlayable Directorを配置する事です。

 

これはControl Playableの効果が子にも影響する(オプションが最初から有効になっている)事を利用したアプローチです。

 

手順は下の感じ

  1. GameObjectを作成しTimeline Rootみたいな名前を付ける
  2. Control PlayableのSource ObjectにTimeline Rootをセットする
  3. Timeline Rootの子として、Parent以外のPlayable Directorを配置する

f:id:tsubaki_t1:20171016212106g:plain

 

この3の手順をTimeline再生前に行えば、動的にTimelineが再生するTimelineを差し替える事が出来ます。

f:id:tsubaki_t1:20171016212801g:plain

関連

https://twitter

tsubakit1.hateblo.jp

.com/tsubaki_t1/status/9121624389166202

https://twitter.com/tsubaki_t1/status/912162438916620288

https://twitter.com/tsubaki_t1/status/912162438916620288

https://twitter.com/tsubaki_t1/status/912162438916620288