テラシュールブログ

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

【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

 

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

*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

【Unity】TimelineからAnimationEventのようにメソッドを呼び出したい UnityTimelineEvents

AnimationEventのように、Timelineのイベントを実行する方法についてです。

 

 

f:id:tsubaki_t1:20180706232042g:plain

Timelineを使用していると、特定のタイミングでイベントを発行したいと思う事はよくあります。
例えば通常のカットシーンでは「爆発の衝撃でカメラを揺らす」といったタイミング、必殺演出では「ダメージ表示のタイミング」といった具合です

しかしTimelineのEventはまだ登場しておらず、代替ソリューションでITimeControlやActiveを使用しろと言う始末。(一応Unity 2018.2かUnity 2018.3辺りで登場する予定な模様)

 

自分は今使いたいので代替案を探した所、UnityTimelineEventsというモノがあったので紹介します。

 

UnityTimelineEvents

Unity Timeline EventはGithubで公開されているTimelineでイベントを発行することが出来るアセットです。

github.com

f:id:tsubaki_t1:20180706232454j:plain

Timeline上で指定したGameObjectの持つメソッドを、任意のタイミングで呼び出す呼び出すことができるので、結構良い感じに使えます。
使用できるイベントはPublicで引数が0~1個のメソッドです。使用できる引数のタイプはint、string、float、bool、enumなどAnimationEventでお馴染みのAPIが呼び出せるようになっているみたいです。

 

実際に使ってみる

実際に使ってみます。

まずTantawowa.timelineEvent > Timeline Event Trackで、新しいトラックを追加します。

f:id:tsubaki_t1:20180706233019j:plain

トラックにEventを呼び出したいGameObjectをセットします。
ここでセットしたGameObjectに登録されているComponentのメソッドが呼び出せるようになります。

f:id:tsubaki_t1:20180706233756j:plain

あとはClipでメソッドを呼び出します。実はメソッドだけでなくプロパティも呼び出せたりします。

f:id:tsubaki_t1:20180706234033j:plain

f:id:tsubaki_t1:20180706234149g:plain

なおゲームを再生せずともTimelineのイベントを呼び出すオプションがありますが、ここで変更した値を戻す事を考えると余り使いたくない所です。
Timelineの変更はゲーム再生終了後も維持されるので、このイベントの動作はゲームを実際に再生しながら調整するのが個人的には良いように感じています。

 

関連

一応、AnimationEventをTimeline側から呼び出すことは出来るので、そちらで調整するアイディアもあるかもしれません。

www.shibuya24.info