テラシュールブログ

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

【Unity】音をキャプチャーするAudio Recorderと、動画撮影するMovie Recorder

昨日の続きで、調べられなかったMovie RecorderとAudio Recorderについて

固定フレームも録画可能なRecorder

Recorderについてはコチラ

tsubakit1.hateblo.jp

昨日紹介したRecorderでは「音」は録画出来ないのです。が、オーディオやオーディオ付きムービーをキャプチャー・録画する方法も用意されていたので紹介します。

これはどちらかと言えば、Recorderが使用してるFrame Captureの機能かな

録音するAudio Recorder

「音」をキャプチャーする場合、Audio Recorderコンポーネントが使用できます。

使い方は単純で、

  • Audio Listenerが設定されているGameObjectにAudio Recorderを追加
  • ゲームを開始すると、録音が開始

という物です。

f:id:tsubaki_t1:20170925234452j:plain

昨日の内容と異なるのは、オーディオ撮影のタイミングが「VideoのStart Recording」ではなく独自であるという点です。

Capture ControlでManualを選べば手動で、Frame Rangeを選べば指定フレームから開始します。

f:id:tsubaki_t1:20170926000308j:plain

まだTimelineとの連携は完了していないみたいなので、Timelineと連携するような場合は、Audio RecorderをTimelineでenableするような手法が必要かもしれません。

 

出力に成功すると、初期設定ではCaptureフォルダ(Recorderフォルダではない)にオーディオファイルが出力されます。

対応フォーマットはWav、ogg、それとFlac

f:id:tsubaki_t1:20170926000603j:plain

f:id:tsubaki_t1:20170926000446j:plain

ムービーを録画するMovie Recorder

Audio Recorderはあくまでも録音ですので、オーディオファイルと動画が別々にキャプチャーされます。つまり動画編集ソフトで結合する必要がありそうです。

もし音付きムービーを撮影したいとったケースの場合、Movie Recorderが使えそうです。

  • Cameraが設定されているGameObjectにMovie Recorderを追加
  • ゲームを再生

概ねAudio Recorderと同様にムービーがキャプチャーされます。

f:id:tsubaki_t1:20170926001623j:plain

ただ、なんとなくキャプチャーされる音がズレてるのは気のせい…?

 

GBuffer Recorder

ついでにGBuffer Recorderを見てみました。

細かいことは置いといて、DepthとかVelocityとかノーマルとか、そういった項目がキャプチャー出来るみたいです。

f:id:tsubaki_t1:20170926001922j:plain

f:id:tsubaki_t1:20170926001848j:plain

多分こういうこと

f:id:tsubaki_t1:20170926002103j:plain

関連

github.com

【Unity】固定フレームも可能、画面を録画出来る Recorder

f:id:tsubaki_t1:20170924235944j:plain

今回はUnityの画面をキャプチャーして保存するアセットについて

Unityの画面を動画としてキャプチャーするRecorder

最近、画面を動画としてキャプチャー出来る事は珍しくなくなりました。

以前はkamcordやLobi Rec、every play等のサービスを活用する必要がありましたが、最近ではAndroid(play game)でもiOSでも標準機能に近い形で画面をキャプチャーする事が可能になっています。

 

Recorderはアプリ側に組み込むアセットで、画面をキャプチャーします。

ただ、どちらかと言えばエディターの画面を撮影する為の物に見えます。

f:id:tsubaki_t1:20170925002348j:plain

可変フレームではなく、固定フレームで撮影が可能

このアセットに最も期待している機能は、可変フレームではなく固定フレームで動画をキャプチャー出来る点です。

Unityは基本的に可変フレームで動いていた為、何も設定せず普通に画面をキャプチャーすると、激重のシーンではフレームスキップが発生し、モーションや動きが飛び飛びになります。

 

例えば、Fixed Timestepをとても小さくしてめり込みを0にしたコンテンツがあったとします。これを貧弱PCで再生してみると、下のようにガックガクになります。

f:id:tsubaki_t1:20170925001828g:plain

このような状態でも、Recorderでは設定をConstantに設定しておくことで、激重でFPSがガタ落ちするような場合でも、割と綺麗に撮影してくれるみたいです。

f:id:tsubaki_t1:20170925001930g:plain

使い方

実際の使い方を見てみます。

まずは下のURLからアセットを入手します。

https://www.assetstore.unity3d.com/jp/#!/content/94079

 

エディターの画面を動画としてキャプチャーする

単純に画面をキャプチャーする場合は、簡単です。

  1. Tools > Recorder > Video でウィンドウを開く
  2. (ゲームを再生中に)Start Recordingを押す

これだけです。

これで画面のレコードが始まります。

f:id:tsubaki_t1:20170925002619j:plain

終了後はOutput Pathにファイルが出力されます。

初期設定の場合は、プロジェクトフォルダのRecordingsフォルダです。

f:id:tsubaki_t1:20170925003002j:plain

細かい設定

撮影するフォーマットは、PNGやMP4やWebM、GIF、OpenEXR、そしてImage Sequenceといったフォーマットが選択可能です。

f:id:tsubaki_t1:20170925005700j:plain

フレームレートは、コンスタント(固定)かフレキシブル(可変)か、そしてフレームレートは…といった部分が設定できます。

f:id:tsubaki_t1:20170925005531j:plain

アルファ抜き

出力するフォーマットが対応しているならば、背景をアルファで抜く事も出来るみたいです。

  1. 対応してるものはCapture Alphaが表示されるので、チェック。
  2. ソースはメインカメラとし、カメラはアルファ0でクリア…

f:id:tsubaki_t1:20170925004131j:plain

これでキャプチャー時、アルファの入った物が出力されます。

f:id:tsubaki_t1:20170925004358j:plain

Timelineとの連携

Timelineと連携です。

Recorder trackをタイムラインに追加して、後はクリップ(Recorder clip)をRecorder trackに追加するだけです。

f:id:tsubaki_t1:20170925003123j:plain

後はTimelineを再生(Timelineプレビューではなく、エディターの再生)すると、クリップ再生時に画面がキャプチャーされます。

Audio Recorder、GBuffer Recorder、Movie Recorder

内容を把握してません

追記

tsubakit1.hateblo.jp

f:id:tsubaki_t1:20170925005923j:plain

感想

cgworld.jpにあるような負荷の高そうな描画を撮影したり、下のようなプロシージャルな絵を作って撮影して素材にする…みたいなケースで便利かもしれません。

 

【Unity】Timelineのクリップが動かすオブジェクトを動的に更新する方法

f:id:tsubaki_t1:20170922224305g:plain

今回は、昨日紹介したControlTrackのControl Playable Asset Clipに、任意のオブジェクトを動的にバインドする方法についてです。

Timelineの中身を動的に更新したい

Timelineを映像系ではなくゲームで使用する場合、実行時に動的に操作する対象を差し替えたくなるといったケースがあるかもしれません。

 

例えばITimeControlで操作するGameObjectを差し替えたり、Cinemachineで参照するVirtual Cameraを切り替えたり、動かすキャラクターを差し替えたり。

 

動かすキャラクターといったTrackで制御する物に関しては、下の記事の方法で解決出来ますが、クリップに関しては少し面倒です。

tsubakit1.hateblo.jp

クリップの値は参照する物と実体を持つものがある

f:id:tsubaki_t1:20170922214702j:plain

クリップの値ですが、少し複雑です。

 

通常、クリップの値は、Timelineのアセット(PlayableAsset)が保持しています。この値はアセットとして保持されていて、基本的に固定値のような扱いです。

ただし、シーン内のオブジェクトを参照するような内容…例えばGameObjectやAnimatorへの参照等は、PlayableDIrectorからPlayableAssetが吸い出して解決するような方法で解決しています。

 

この意味は、値を保持するタイプの物は動的に書き換えると他のすべてのTimelineが影響してしまいますが、参照のみの場合はPlayableDirectorの値をチョチョっと書き換えてやれば、捜査対象をハック出来るという意味です。

Control Playable Asset Clipの参照先を書き換える

せっかくなので、昨日紹介したControl Playable Asset Clipの参照先を切り替えてみます。

サンプルコードはこちら。

gist.github.com

解説

まず15行目、名前からトラックを取得します。
トラック名は、Inspectorで書き換えられます。

f:id:tsubaki_t1:20170922220008j:plain

 

次に16行目、トラック一覧から上書きしたいクリップを取得します。
こちらも同様にInspectorから書き換え可能です。

f:id:tsubaki_t1:20170922220019j:plain

 

そして18行目で、オブジェクトが参照を解決するためのキーを取得し、19行目で値を登録します。

ここで注意すべきは、Control Playable Asset ClipはITimeControlではなくGameObjectを受け付けるという点です。なので、コンポーネントからGameObjectを取得して渡します。

実際に動かす例

コードを用意したら、PlayableDirectorのあるオブジェクトにRebindコンポーネントを追加します。

その後、ボタン等でRebindのPlayメソッドをITimeControlを持ったオブジェクトを引数にして呼び出してやれば、回転します。

f:id:tsubaki_t1:20170922220733j:plain

f:id:tsubaki_t1:20170922222141g:plain

もっと手っ取り早い方法

ちなみに、対象がControl Playable Asset Clipの場合はもっと手っ取り早い解決方法があります。

実はControl Playable Asset Clipは子オブジェクトも動かすオプションがあります。このオプションがonの場合、SourceGameObjectの子のITimeControlも一緒に操作してくれます。

f:id:tsubaki_t1:20170922222939j:plain

要するに、事前に用意したオブジェクトの子として、指定のオブジェクトを動かしてやるというアプローチです。
下のような動作をソースコード側でやります。

f:id:tsubaki_t1:20170922223624g:plain

手順

まず、適当な親オブジェクトを用意します。名前はBindedObjectとか適当にそんな感じで。

次に、ControlPlayableAssetにBindedObjectを登録します。

f:id:tsubaki_t1:20170922223201j:plain

後は、動的にオブジェクトの子として動かしたいオブジェクトを登録します。先程のコードを少し改造したものです。

gist.github.com

これでも、動的にオブジェクトが更新されます。

既に動作してるTimelineは更新出来ない点に注意

一点だけ注意があります。

それはこの方法では既に動作しているTimelineの参照を上書きできないという点です。

 

Timelineの参照解決はTimeline再生開始時に行われるのが通例らしく、参照関係を解決した後に流し込む内容を更新しても意味がないという事みたいです。

ちなみにPreviewのON/OFFでも参照関係の構築が走るみたいなので、上手く動かないときはPreviewをON/OFFすると解決するかもしれません。わんぽいんと

 

次はTImelineの階層化とかパーティクルとか

関連

tsubakit1.hateblo.jp

https://forum.unity.com/threads/timeline-available-in-unity-2017-1.455265/page-6#post-3217752

tsubakit1.hateblo.jp

【Unity】ITimeControlで、Timelineから"コンポーネント"を操作する

今回はTimelineのクリップからMonobehaviourを継承したコンポーネントを手軽に操作する方法について紹介します。

f:id:tsubaki_t1:20170921230441g:plain

Timelineで手軽に動かしたい

Timelineでキャラクターを動かす時、大抵の場合はAnimationで物を作っていく訳ですが、それでは色々と面倒なケースが多々あります。例えばUVスクロールする背景や、単純にキャラクターを回転させたいようなケースです。

f:id:tsubaki_t1:20170921231607g:plain

こういった項目はPlayableを自分で作れば簡単に回避出来るには出来るのですが、その為だけにPlayableを作るのは割と面倒です。またTimelineの有無に関わらず動かしたいといったケースも考えられます。

 

そういった時にITimeControlは便利です。

ITimeControlインターフェースはTimelineから呼ばれる

インターフェースの一つにItimeControlという物があります。これはControl Playableで設定していた場合、ヘッドがクリップを通過中に呼び出される…という物です。

docs.unity3d.com

コンポーネントにインターフェースを付けるだけで良いので、Playableを云々するよりもかなり簡単に実装できるのは中々に良いです。

但し、インターフェースから受けられるのは「実時間」で、クリップ全体の長さは受けられない点には注意が必要です。そっちはPlayableを頑張る感じで。

実際に回転させる

実際にITimeControlを使ってみます。
このサンプルでは上のGifにあるように、対象を回転させます。

コードの準備

まず、iTImeControlを継承したコンポーネントを用意します。

内容は単純に、Speedの速度かつAxisの軸で回転させる…という物です。

出来たらコンポーネントを適当なGameObjectに追加します。

 

gist.github.com

 

ここで個人的に思うポイントは、毎フレーム加算するのではなく、時間で再現出来るようにする事です。加算する場合は巻き戻しても進んでも常に時間が進んでしまいますので。

ただ、振動とか、そういった物は別に可逆でなくとも良いかも。

Timelineにコンポーネントの付いたオブジェクトを登録する

次にオブジェクトをTimelineに登録します。

この時使用するのはControl Trackです。

f:id:tsubaki_t1:20170921232719j:plain

次にAdd Control Playable Asset Clipを追加して、作成したClipのSource Objectに先程ITimeControlを追加したオブジェクトを登録します。

f:id:tsubaki_t1:20170921232832j:plain

f:id:tsubaki_t1:20170921233057j:plain

これでControl Playable Asset Clip上を通る際、ITimeControlのコールバックが呼び出されるようになり、ゲームを再生しなくともコンポーネント側の動きを再現したり出来るようになります。

補足

ちなみに、Animationや他の項目と異なり、プレビューを解除しても元の位置に戻らないので、イベントで開始時の位置を覚えておいて終了時に戻すのオススメ。Tweenとかする場合。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

www.slideshare.net