読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

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

【Unity】ゲームに最初から含めるアセット群を圧縮するオプション

Unity Unity5.6 最適化・デバッグ Android iOS

Unity 5.6から、ビルドしたゲームに含めるアセット群を圧縮するオプションが追加されました。

この圧縮をONにすることで「アプリ起動時間の短縮」「インストール後にサイズが膨れ上がるのを防ぐ(iOS/Standalone)」効果が期待出来ます。

ビルドしたゲームに含めるアセット

Unityは、ゲームに含めたシーンやResourcesから参照しているアセット群は、ゲームビルド時にゲームに含めます(参照されていなければ含まれません)

含まれるアセットは基本的にそのまま保持されます。たとえば、RGBA32のような非圧縮画像の場合、全く圧縮されず非常に大きなサイズとなってアプリに反映されます。

http://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20160505/20160505230835.jpg

tsubakit1.hateblo.jp

アセット群を圧縮するオプション

Playerのアセットを圧縮するには、BuildPipelineのBuildPlayerにて、BuildOptions.CompressWithLz4を有効にするだけです。

残念ながら5.6f1現在、BuildPipeline.BuildPlayerのコードを記述する必要があります。

gist.github.com

起動時間が早くなる

 これの良いと思う所は、単純に起動が早くなる事です。

 実際に比較すると、圧縮前は1.44秒かかっていた起動が、圧縮後は0.54秒で完了し起動しています。

 正確には、アプリに含まれる巨大なアセットを遅いIOからロードするより、CPUが早いので圧縮したアセットから取り出して解凍した方が早くなった…という感じな気がします。
もしかしたらIOアクセスが早くなるらしい最新のiOSでは、余り変わらないかもしれません。

 

まぁ、ソレ以外にも5.6で色々とロードパフォーマンス改善してる気がしなくもないです…IL2CPPにするとMonoより起動が早くなるとかも含めて。

 

インストール後のサイズが減る。apkやipa時は余り変わらず

さてandroidiOSのアプリサイズとして気になるのは、リリース時のアプリサイズだと思いますが、こちらは残念ながらほぼ変わらないです。

 

というのも、ipaやapkは既にzip形式で圧縮されており、いまさら再圧縮した所で対して変わらないどころか、場合によっては増えます。

 

ただし、アプリをインストール後は話は別です。Androidは対して変わらないのですが、iOSの場合インストール後にファイルを解凍します。
そのためiOSはアプリインストール後にファイルサイズが跳ね上がる訳ですが、圧縮オプションではその辺りをかなり緩和してくれます。

 

感想

Resourcesを使わない理由がまた一つ減った感

 

関連

AssetBundleに格納してみた的な

tsubakit1.hateblo.j

【Unity】Video Playerでアルファチャンネル付きムービーを使う

2D おもしろ演出、演出の強化 Unity5.6 Unity 画面効果 アニメーション iOS Android

アルファチャンネル付きムービー、アルファムービー、透過ムービー、with alpha、αムービー、Aビデオ、呼び方は色々ありますが、背景が透明なムービーについてです。

f:id:tsubaki_t1:20170320122129g:plain

アルファチャンネル付きムービー

Unity 5.6から導入されたVideo Playerはアルファチャンネル付きムービーもサポートしているみたいです。

画面全体もしくは一部を完璧に覆う訳では無いので、上手く使えば演出等にも使用できそうです。

f:id:tsubaki_t1:20170320122509g:plain

アルファチャンネル付きムービーの扱いは他のVideo Clipと同じですが、一点Keep Alphaという項目が追加されています。

f:id:tsubaki_t1:20170320123306j:plain

使用出来るコーデック

アルファチャンネル付きムービーをググると、RGBA32なAVIや可逆圧縮コーデック等が出てきましたが、UnityではWebm VP8 with alpha*1というコーデックに対応しています。

WebM - Wikipedia

 

他にもApple ProRes 4444なる企画にも対応しているそうですが、今は亡きQuickTimeを要求するので、.webm一択です。

他のコーデックは残念ながら動きませんでした。

Webmを再生出来ない端末では

Webmをサポートしていない端末、例えばモバイル等の環境では、使えるフォーマットに変換してやる必要があります。

具体的には、Keep Alphaのチェックを入れ、Transcodeで変換処理をかけてやると再生出来るようになります。

f:id:tsubaki_t1:20170320124104j:plain

内部的には、アルファ情報を他のチャンネルにこっそり格納し、実行時にシェーダーでマスクをかけるのをやってるっぽいです。

In order to work around the difficulties of using standard clips with alpha in your Unity built game, Unity offers the "Keep Alpha" option in its VideoClip importer. When Unity detects the video has native alpha in it, the Keep Alpha option shows up in the VideoClip importer and if you enable it along with the transcode option, the resulting VideoClip asset will use an internal layout where the alpha is encoded in hidden color channels. During decoding at runtime, we recombine these hidden color channels with the actual color content on the GPU to yield a RGBA movie without needing any special decoding capabilities from the platform.

Settings for importing a video with an alpha channel

 

負荷は未検証ですが、Video Playerが優秀なのか、モバイルでも(画面全体のムービーを)3枚4枚使う分には殆ど問題無いです。ただ(多分フィルレート的に)数十枚使うのはあまり良くないかもしれません。

また、単純にくり抜きたい場合、クロマキーシェーダーを用意して抜き取った方が、データ構造的に楽な気がしなくもないです。

 

またサポートしてない端末では、URLから取得ではなくAssetBundleから取得してストリーム再生した方が色々と楽そうに見えます。

アルファチャンネル付きムービーをサクっと試す

アルファチャンネル付きムービーの動作をサクっと確認します。

  1. Video Playerを用意
  2. SourceをURLに変更
  3. URLの接続先は「http://tsubakit1.sakura.ne.jp/temp/unity_B.webm」とする。
  4. Render ModeはCamera Back Plane(指定カメラの一番奥)
  5. CameraにMain Cameraを設定

f:id:tsubaki_t1:20170320130044g:plain

これでゲーム再生時ムービーが再生されます。

f:id:tsubaki_t1:20170320130604j:plain

もしくは、動画ファイルをhttp://tsubakit1.sakura.ne.jp/temp/unity_B.webmからダウンロードし、Assets以下に配置、Video Clipにドラッグ&ドロップで配置する感じです。

f:id:tsubaki_t1:20170320130817j:plain

アルファチャンネル付きムービーを作る

アルファチャンネル付きムービー、Webm VP8 with alphaを作成してみます。

この手順、ムービーからの一発変換とかクロマキー色抜き取りとか無く、連番ファイルをffmpegで動画にするという、微妙な作業になります。

連番画像を用意する

連番画像を用意します。

今回はUNITY-CHAN! OFFICIAL WEBSITEにあるC88 ユニティちゃん アニメーション素材データを使います。

f:id:tsubaki_t1:20170320131423j:plain

中身はこんな感じの連番画像。命名規則は「B_%5d.png」です。

f:id:tsubaki_t1:20170320131300j:plain

画像変換

まずffmpegをインストールします。

 

次に変換作業。

自分の場合、ffmpeg.exeのフォルダ隣にimagesなるファイルを用意して、そこに連番ファイルをコピーしました。癖です。

コマンドプロンプトを開いて、cd コマンドffmpeg.exeのある位置まで移動します。

f:id:tsubaki_t1:20170320132926j:plain

後は「ffmpeg.exe -i images/B_%5d.png  -auto-alt-ref 0 -c:v libvpx export.webm」のようにコマンドを発行すれば、連番ファイルが動画になります。

赤が書き換えるべき部分、青が固定でも良い部分です。

f:id:tsubaki_t1:20170320132525j:plain

f:id:tsubaki_t1:20170320133107j:plain

関連

qiita.com

forum.unity3d.com

d.hatena.ne.jp

© Unity Technologies Japan/UCL

*1:webmはgoogleがスポンサーをしているロイヤリティフリーのムービーコンテナ

【Unity】「被写体のどこを映して欲しいか」を元にカメラの動きをコントロールする CINE.MACHINE BASE RIG を軽く使ってみる

3D Unity Unity5.6 カメラ おもしろ演出、演出の強化

今回、Unity標準機能化の動きに合わせて無料で使用出来るようになったCine.machineを実際に触ってみました。

f:id:tsubaki_t1:20170318234056j:plain

http://u3d.as/GJQ

カメラの動きをコントロールする

Cine.machineはカメラの動きをコントロールするアセットみたいです。

この機能は、パンやティルト、ドリーのような動きというよりは、任意の欲しいカットを用意し、それに向けてカメラワークをブレンドさせていく感じになります。

tsubakit1.hateblo.jp

このカットとは、注目したいキャラクターをカメラのどの範囲に置くのか、また何処から見るのか…といったイメージです。

例えば下の場合のように注目させたいパーツがある場合、対象と範囲を設定すれば、範囲の外に出ないようにカメラを動かしてくれます。

f:id:tsubaki_t1:20170318223838j:plain

f:id:tsubaki_t1:20170318222447g:plain

あとは複数のカットをつなぎ合わせてブレンドすると、こんな感じで動いてくれます。

f:id:tsubaki_t1:20170318224515g:plain

簡単な使い方

まずはChinemachineのセットアップ。

  1. Chinemachine > Create Virtual Cameraを選択します。
  2. Autogen_cinemacihneRuntimeのオブジェクトのDefault Cameraには、動かしたいカメラを設定します。

f:id:tsubaki_t1:20170318225921j:plain

f:id:tsubaki_t1:20170318230035j:plain

カットの用意

  1. CinemachineVirtualCameraの位置を、カメラを置きたい位置に動かします。
    シーンビューを動かした後、CinemachineVirtualCameraオブジェクトを選択してCtrl+Shift+Fキーで、現在のシーンビューカメラの位置と同期するので、便利です。
  2. 注目したいオブジェクトがあれば、ChinemacihneVirtualCameraのCreate Composer Assetを選択(もしくはComposer Settingsにセット)して、Composer Camera Targetに注目したいターゲットを指定します。

f:id:tsubaki_t1:20170318230251j:plain

注目するオブジェクトのセット

f:id:tsubaki_t1:20170318230734j:plain

場合によっては注目範囲も調整します。

f:id:tsubaki_t1:20170318230945j:plain

ドリー的にカメラを動かす

Transposer SettingsかCreate Transposer Assetで設定を作成、あとは位置を同期したいオブジェクトのTransformをセットする感じです。

f:id:tsubaki_t1:20170318233048j:plain

カメラ間のブレンド

カットの用意で作成したCinemachineVirtualCameraを、複製でも同じものを作るでも良いのでコピーします。

f:id:tsubaki_t1:20170318231441j:plain

あとは、ゲーム再生時「アクティブなオブジェクトのプライオリティ値が低い(低い方がプライオリティが高い)順」に、カメラが移動します。

例えば新しいカメラのプライオリティを0、最初からあるカメラのプライオリティを1としておく場合、

  1. 起動時にプライオリティ0のカットが再生
  2. プライオリティ0のカットを非アクティブにすると、プライオリティ1のカメラに遷移
  3. プライオリティ0のオブジェクトをアクティブにすると、プライオリティ0のカメラに遷移

といった感じで動きます。

プライオリティ0がアクティブの状態でプライオリティ1をアクティブ・非アクティブにしても特に遷移しません。

f:id:tsubaki_t1:20170318231923j:plain

ブレンドの設定

ブレンドの接地絵は、Cinemachine RuntimeのBlend Settingsで行うみたいです。

指定のカットから指定のカットへ遷移する際のカーブを設定すれば、ブレンドの感じを調整できます。ブレンド時間は調整できないみたいです。
(やるなら要スクリプトでウェイト調整)

f:id:tsubaki_t1:20170318232418j:plain

 

中々面白いです。

関連

Cinemachine使って遊んでみる

 

Cinemachine Base Rig from Cinemachine Imagery Ltd. on Vimeo.

 

動きのサンプル

Module Examples – Cinemachine

【Unity】Timelineで字幕を表示する

Unity Unity5.6 Timeline Beta

f:id:tsubaki_t1:20170313234004g:plain

TimelineのExperimental Buildが公開されています。

せっかくなので字幕に使ってみました。

Timelineのスクリプト制御

Timelineエディタの機能の一つにタイムラインエディタからスクリプト制御を行うというモノがあります。

UnityエディタのTimeline機能は、大きく分けて3つのスクリプト制御が出来るみたいです。

f:id:tsubaki_t1:20170313224712j:plain

Track Assetは、Timelineのトラックに登録するPlayable Assetやバインドするオブジェクトを制御する物っぽいです。*1

PlayableAssetはトラック上に配置し、設定した項目をScript Playableに渡す物です。

ScriptPlayableは再生中に呼び出される処理本体です。

 

とりあえず今回はPlayable AssetとScript Playableを使ってみます。

Timelineを用意

まずはタイムラインの処理を登録するPlayableAssetを用意します。ココにタイムラインベースの処理を登録する流れです。

作成したら、Playalbe Directorコンポーネントを適当なオブジェクトに追加して、先程作成したPlayableAssetを登録します。

f:id:tsubaki_t1:20170313234121j:plain

f:id:tsubaki_t1:20170313234532j:plain

スクリプトの用意

次に、スクリプトを用意します。

Timeline Clip C# Scriptを選択して、名前をSubtitlePlayableとかに設定しておきます。

後は、下のコードを作ったスクリプトにコピペ。

f:id:tsubaki_t1:20170313234653j:plain

 

gist.github.com

ウィンドウを開く

次にTimelineのウィンドウを開きます。

その後、Playalbe Directorを選択し、Previewが見えるタイミングでウィンドウをロックします。

こうしないと、ウィンドウを操作するたびにTimelineウィンドウの表示がおかしくなり、非常にストレスフルです。特にスクリプト制御を行う際は、オブジェクトをあっちこっち触るので、必ずロックした方が良い印象です。

f:id:tsubaki_t1:20170313235328j:plain

f:id:tsubaki_t1:20170313235646j:plain

もしオブジェクトの登録が出来ない場合、TimelineEditorがSequence Assetモードになっていると思われます

f:id:tsubaki_t1:20170313235831j:plain

ただ、ロックするとウィンドウが消せなくなる不具合があります。その場合は、一旦Playalbe Directorを選択してロックを解除してから、ウィンドウを閉じます。

タイムラインの設定

タイムラインに字幕を設定します。

まずPlayable Trackでトラックを追加、

追加したトラック内で右クリック→Add Clip→SubtitlePlayableAssetを選択

作られた項目を選択すると、Inspectorに更新したいTextコンポーネントと変更するメッセージを設定する項目が表示されるので、設定。

f:id:tsubaki_t1:20170314000446j:plain

f:id:tsubaki_t1:20170314000529j:plain

f:id:tsubaki_t1:20170314000531j:plain

これでタイムラインに合わせてテキストが更新出来ます。

ExposedReference

今回のTimelineで面倒くさい面白いのが、ExposedReferenceという機能です。

これは実行時にオブジェクトの依存関係を解決する機能みたいです。

f:id:tsubaki_t1:20170314000755j:plain

PlayableAssetはあくまでアセットなので、シーンに対する参照を持ちません。そのため、シーンに既に存在するPlayableDirectorにオブジェクトへの参照を登録しておき、PlayableAsset読込時に解決するという物です。

 

なので、例えばPlayableAssetをResourcesやAssetBundleに格納しておき、特定のイベント発行時(ドアを開いたり宝箱を開くカットシーン)にロードする…といった事も出来そうです。

 

ちなみに現在(Unity 5.6 b6 Timeline用Experimental Build)のメモリ管理周りがかなり雑になっているらしく、Timeline関連のアセットのアンロードや読込等の処理や、アセットの開放漏れでエディタが簡単に強制終了します。

関連

tsubakit1.hateblo.jp

nn-hokuson.hatenablog.com

www.shibuya24.info

*1:マニュアルにも使い方は書いておらず、コレを有効活用してるサンプルも無いので用途不明です。ただPlayableAssetに全部任せると色々と駄目なので、Track先生には活躍して欲しい所。