テラシュールブログ

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

【Unity】カメラを常に揺らしたり、だんだんと揺れを強化したりする演出

以前紹介したカメラを振動させるアプローチの少し異なるバージョンです。

tsubakit1.hateblo.jp

 

瞬間的ではない振動を表したい

以前紹介したImpulseですが、その名の通り瞬間的な力による振動を表現しています。
大抵のゲームでは振動は「何らかのトリガーによって引き起こされる」物ですので殆ど問題無いと思いますが、演出的な要因で振動が必要という事もあります。

 

例えばガチャの演出で、なにかが起こる前触れとしての振動や、単純にストーリー的に地震等の演出をしたい場合です。
前者は「振動がだんだん強くなる」後者は「振動が常に一定発生する」など、どちらもImpulseでは若干面倒な表現になります。

f:id:tsubaki_t1:20180722155243g:plain

また長時間続く振動の場合は、こちらの方が何かと都合が良いケースもあります。例えば下の動画ではImpulseではなく今回の手法を採用しています。Impulse連続するの面倒だったので

 

連続した揺れはCinemachine Noiseを使う

揺れが連続している場合、CinemachineのNoiseを使用します。これで、Cinemachineが有効な間は連続して一定の強度で揺れます

f:id:tsubaki_t1:20180722161753g:plain

  1. Cinemachine > Create Virtual Cameraで、Virtual Cameraを作成
  2. Basic Multi Channel Perlimを選択
  3. Noise Profileを6D Shakeに指定
  4. 揺れ幅や切り返し回数を強化

f:id:tsubaki_t1:20180722162130g:plainこれでカメラが振動するようになります。

 

振動の状態を切り替える(Timeline)

まずTimelineで振動状態と非振動状態を切り替えます。切り替え方は単純で、TimelineでVirtual Camera同士をブレンドするだけです。
その時、座標だけでなく振動のパラメータもブレンドしていくので、少しづつ振動が強くなっていくといった表現が実現出来ます。

f:id:tsubaki_t1:20180722163720g:plain

この時、次の切り替え先のカメラが座標は同じでズームしているような場合、上のような「ズームしつつカメラの振動が強化される」といった、良く言えばなんかワクワクする演出が実現できます。

f:id:tsubaki_t1:20180722164037j:plain

 

振動の状態を切り替える(Timeline以外)

Timelineを使用した場合、トラックでタイミングを調整できるので非常に簡単に振動のタイミングが制御出来るのですが、Timelineを使用しない場合…例えば普通のゲームの場合はどうでしょう。

この場合、Cinemachine MixingCameraを使用するのが良さそうです。

f:id:tsubaki_t1:20180722164532g:plain

Mixing Cameraは子となる複数のVirtual Cameraを重みでブレンドする機能で、Cinemachineでよくある「カメラ同士の切り替え」よりもタイミング制御がやりやすくなっています

要するに

  • 複数のカメラでプレイヤーを追跡する
  • 追跡するカメラ毎に振動あり・無しが異なる
  • 重みで振動あり・振動なしをブレンドする

という感じです。

ただしTimelineを代表とする「演出」ではなく任意の操作が割り込む「ゲームプレイ」の場合、常に振動するカメラは非常に邪魔になるかもしれません。普通にImpluse使ったほうが良いように思います。

【Unity】衝撃があった時にカメラを揺らす / 振動させる

f:id:tsubaki_t1:20180718012440g:plain

今回は、何らかの衝撃があったときにカメラを振動させる方法についてです。

 

 

カメラの振動

何か衝撃があったとき、カメラを揺らすのはよくある手法です。
ダメージを受けた事を強調したり、クリティカルなダメージを与えたり、巨大な何かが動いた時の迫力を足したりと、様々なケースで使用されます。

f:id:tsubaki_t1:20180718015750g:plain

今回はその「カメラの振動」をやってみます。

 

CinemachineのImpulseを使う

今回はCinemachineのImpulse Listenerを使用します。
流れとしては、任意のImpulse Sourceが振動を発信し、Impulse Listenerが受信すればカメラが揺れるという感じです。
当然Cinemachineの利用が前提となります。

f:id:tsubaki_t1:20180718015950j:plain

まず受信側の設定です。

Virtual CameraのAdd ExtensionsからCinemachineImpulse Listenerを選択します。
これで上のようなコンポーネントが追加されます。
項目がない場合はCinemachineのバージョンが古いかもしれません。この機能は2.2からです。

f:id:tsubaki_t1:20180718020446j:plain

後は「衝撃」を発行するだけですが、幾つかアプローチがあります。

衝撃を発行する(コライダー編)

まずはColliderから衝撃を発行するCinemachine Collision Impulse Source を見てみます。
この設定では、コライダーが「カメラの近く」で「勢いよくぶつかったら」カメラが振動します。距離による減衰や、質量・加速度の有無等でカメラの衝撃が強弱します。

f:id:tsubaki_t1:20180718021417g:plain

まずRigidbodyで動くようなオブジェクトに、Cinemachine Collision Impulse Sourceコンポーネントをセットします。
次にSingle Shapeを6D Shakeにセットします。

最後にHow To Generate The Impulseの項目で、全てにチェックを入れます。(振動が向きの影響を受けるか・質量の影響を受けるか・速度の影響を受けるか)

f:id:tsubaki_t1:20180718021721j:plain

f:id:tsubaki_t1:20180718022005g:plain

f:id:tsubaki_t1:20180718105525j:plain

これでCinemachine Collision Impulse Sourceを持つRigidbodyが衝撃を受ければ、衝撃を通知してカメラが振動するようになります。

 

衝撃を発行する(コード)

コードで衝撃を発行する場合は単純です。

f:id:tsubaki_t1:20180718022429j:plain

まず適当なオブジェクト(多分マネージャー的な)にCinemachine Impulse Sourceを追加します。Cignal Shapeは6DShakeです。
あとはCinemachineImpulseSourceコンポーネントGenerateImpulseAtを呼べば良いです。これで画面が振動します。

f:id:tsubaki_t1:20180718022456p:plain

なおGenerateImpulseでも生成が可能ですがvelocityの値はVector3.down(0, -1, 0)と非常に小さいので、Gainを上げておく等をしないと揺れてないと勘違いします。

 

Timelineから振動を呼ぶ

Timelineからカメラを振動させてみます。
TimelineにはUnity 2018.2現在「イベント」が無いので、UnityTimelineEventを使用します。

tsubakit1.hateblo.jp

まず、振動を発したいオブジェクトにCinemachine Impulse Sourceを追加します。例えば巨大ロボの足とか、Timelineで動かすならTimelineの子オブジェクトを用意して動かすのが何かと楽で良いです。

あとはTimelineEventからCinemachine Inpulse Sourece.GenerateImpulseを呼び出します

f:id:tsubaki_t1:20180718023239j:plain

f:id:tsubaki_t1:20180718023322j:plain

なお、この時Invoke In Editor Modeにチェックを入れておけばゲームを再生せずとも振動の動きを確認することが出来ます。
Cinemachineの振動はカメラを動かしますが、座標の元となるVirtual Cameraは動いていないので特に問題はないです。

 

感想

カメラ揺らし、ココゾって所で揺らせば迫力満点です。
もちろん常に揺らすような事をすると飽きるので、そのあたりは使い所を考えると良さそうです。

あとVRでカメラ揺らしは絶対にしない。やったやつ体育館裏な*1

 

関連

tsubakit1.hateblo.jp

*1:ほんのチョビっとならOKという意見も

【Unity】multi-object editing not supported(複数のオブジェクトを選択したときに編集できなくなる)をエディター拡張無しに一気に編集する

コンポーネントのエディター拡張によっては、複数のオブジェクトを選択したときに「multi-object editing not supported」と表示され編集が出来なくなる物があります。

f:id:tsubaki_t1:20180716220518j:plain

これがPrefab化しているならPrefabの大本をイジれば良いという話になるのですが、Prefab化していない場合これは少し面倒な問題になりますし、そのためだけにPrefab化するのは面倒な所もあります。

 

 

自分でエディター拡張している場合のmulti-object editing not supported対処は割と簡単

もし自分でエディター拡張している場合、解決方法は割と簡単です。CanEditMultipleObjectsを使えば良いです。
少し拡張した中身も変える必要がありますが、下の記事を参考にすれば簡単です。kan-kikuchi.hatenablog.com

とは言え、自分で全てのオブジェクトをエディター拡張していなければ、特にコンパイル済みでDLLだったり、CinemachineのようにPackageManagerに格納されている場合は出来ない手です。

 

CanEditMultipleObjectsが無いエディター拡張済オブジェクトの設定を一気に変更する

CanEditMultipleObjectsが無いエディターを一気に変更します。
といってもコレは「特定のパラメーター変更を適応する」のではなく、「指定したオブジェクトを全て同じパラメーターにする」アプローチです。そのため使い所は限られるかもしれません。

 

  1. まずGameObjectを一つ選択し、コンポーネントの設定を変更します。
  2. 基準にしたいコンポーネントコンテキストメニューを開き、Copy Component
  3. 基準を適応したいコンポーネントを持つGameObjectを選択し、Paste Components

これで変更が適応出来ます。

f:id:tsubaki_t1:20180716223004g:plain

 

【Unity】Unity 2018.2でMacのVS Codeが入力補完してくれなくなった時の対処

Unity 2018.2にしたところ、MacVS Codeが入力補完をしてくれなくなったので、その対策についてです。

 

結論としては、下のパッケージを入れればOKでした。

http://www.mono-project.com/download/stable/

 

f:id:tsubaki_t1:20180710230642j:plain

 

WindowsVisual Studioの場合はこちら

tsubakit1.hateblo.jp