テラシュールブログ

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

【Unity】CinemachineのFreeLook Cameraが楽しい

f:id:tsubaki_t1:20171023202338g:plain

今回はCinemachineのFreeLook Cameraを使ってみます。

CinemachineのFreeLook Camera

カメラの動きを制御するCinemachineのアセットには、FreeLook Cameraなるカメラを自由に操作出来る系の機能があります。

この機能では、昨今の三人称視点ゲームで良くあるようなカメラの位置を自由に上下左右出来る…という機能みたいです。

 

Cinemachineなので、既存のカメラとのブレンドも出来て、割と良い感じです。

f:id:tsubaki_t1:20171023213014g:plain

見上げる時は視界を狭く、見下ろす時は視界を広く

この機能の面白い所は、視点の位置によってカメラの動きをある程度調整できる点です。調整できる項目は、視点の先や位置、それとFOVが調整出来ます。

 

 

例えば下から眺める時はキャラクターの近くに持っていき、上から見下ろす時は視界を広く持つ…といった感じです。

f:id:tsubaki_t1:20171023204239g:plain

使ってみる

CinemachineのCreateFreeLookCameraでFree Look Cameraを作成します。

f:id:tsubaki_t1:20171023204752j:plain

作成したカメラ(多分CM FreeLook1)のFollowとLookAtを設定します。

Followはキャラクターを動かした時に追跡してもらう為の設定。出来ればキャラクターのルートのGameObjectがオススメです。

LookAtはカメラが見つめる対象を指定します。こちらは足元を設定すると足元を眺めてしまうので、頭を指定しておくのが良いんじゃないかなと。

f:id:tsubaki_t1:20171023205147j:plain

後はカメラの向きと半径の大きさを指定します。

図では見難いですが、CinemachineのFreeLookCameraには3本の輪が設定されています。この範囲がキャラクターのカメラの動く範囲です。

それぞれ上から順にTop Rig、Middle Rig、Bottom Rigのパラメータが対応しており、この値を設定することで、カメラが見下ろしている時や見上げている時のキャラクターとの距離や、FOV等が設定できます。

f:id:tsubaki_t1:20171023205239j:plain

個人的にはTopRigは少し高めでRadiusを多めに、Middleは割と広めに、BottomRigは狭く…といった感じにすると気持ちのよい操作になるかな…と。

f:id:tsubaki_t1:20171023205739g:plain

コントローラーを反転させたい

素晴らしいカメラ操作だ素晴らしい…と言いたいですが、このFreeLook Camera、自分の何時も使ってる操作と逆の操作になるので、非常にストレスフルです。

残念ながらコレを解決するオプションはFreeLookCameraには無いのですが、解決する方法が有志により公開されていました。

f:id:tsubaki_t1:20171023212541g:plain

要するにコントローラーの動きをオーバーライドすれば良いみたいです。

gist.github.com

https://forum.unity.com/threads/overriding-freecamera-cinemachine-inputs-or-freecamera-axis-inversion.484819/

関連

blog.applibot.co.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

【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

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