テラシュールブログ

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

【Unity】「最適化をする前に覚えておきたい技術」

Unity開発者なら一度は目を通しておくと幸せになる資料です。

「最適化=実際に手を動かす」の前に、何をすれば効果的なのか を探す方法について紹介されています。

要するに、Unityで良くある問題とプロファイラの使い方についてです。

 

www.slideshare.net

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

【Unity】Timelineから他のTimelineを呼び出して再生する

今回はTimelineの中からTimelineを再生するアプローチについてです。

Timelineは「少し異なるが概ね同じ」や「複数人編集」で面倒なことになる

Timelineでは基本的に一つのTimeline Assetを経由してシーン上のGameObjectやComponentを操作します。

 

これは言い換えれば、複数人でTimelineを操作すると簡単にコンフリクトを起こす…という意味でもあります。

オーディオのタイミングやパーティクルの内容、ユニットの移動等、調整する人を割り振る場合は、アセットの単位を分割したくなります。

 

一応、Timeline AssetもYAML(テキスト)で保持されているのでマージは可能ですが、できれば避けたい物です。

 

f:id:tsubaki_t1:20171016201847j:plain

 

また同様に似たような表現だが少し違う…といった事をやりたい場合、Timelineを細切れにして連番で再生する、もしくはTimelineの中身をコピペして複数のTimelineAssetに使う等の手段が必要になります。

 

これは例えばイントロは同様の設定ですがレアリティ毎に挙動が少し異なるガチャや、受ける対象によって微妙に挙動の異なる必殺技等です。

下のGifアニメでは2種類の撃破シーンパターンを用意してみました。戦車が登場し発泡するまでは同一の内容ですが、撃破対象によって撃破時の挙動が若干異なります

 

f:id:tsubaki_t1:20171016203201g:plain

TimelineをTimelineが呼び出す

そこでTimelineを複数のアセットに分割し、親Timelineから子Timelineを呼び出して制御する方法を試してみます。

 

まずTimelineの中身を二つに分割してみます。

  • 奥の戦車が出現し、発砲する
  • 手前の戦車が被弾し大破する

これで二つのTimelineが出来ました。
勿論、Playable Directorは二つあり、それぞれが参照を設定しています。

 

f:id:tsubaki_t1:20171016204721g:plain

 

Control PlayableはPlayable Directorも操作できる

次にTimelineを操作するため、Control Playableを追加します。

実はControl Playableは「ITimeControl」の他にも「Particle」や「Playable Director」が操作できます。

 

ということで、親のTimelineを用意し、奥の戦車のTimeline用と、手前の戦車のTimelineをコントロールするためのControl Playableを追加していきます。

 

f:id:tsubaki_t1:20171016205614j:plain

f:id:tsubaki_t1:20171016205315j:plain

f:id:tsubaki_t1:20171016205759j:plain

 

Parent のTimelineには、手前と奥の二種類のTimelineを登録する感じです。

Control Playable Assetの、シーン上の手前と奥の戦車を操作しているPlayable Directorをセットします。

 

f:id:tsubaki_t1:20171016210045j:plain

 

これでParentのTimelineを動かすと、Control Playableが選択しているTimelineも動作するようになります。

 

f:id:tsubaki_t1:20171016210553g:plain

 

操作イメージはこんな感じです。

www.youtube.com

参照するTimelineの動的な差し替え

この方法で面倒くさいのが、参照するTimelineの差替です。

Trackは以前紹介したような方法で簡単(?)に差し替えられるのですが、Clipの中身の差替は面倒くさいです。

上がTrack、下がClipです。

 

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

Control Playableの子にPlayable Directorを配置するアプローチ

ので、手っ取り早い方法を紹介します。それはControl PlayableのSource Objectは適当なオブジェクトをセットしておき、その子として動かすPlayable Directorを配置する事です。

 

これはControl Playableの効果が子にも影響する(オプションが最初から有効になっている)事を利用したアプローチです。

 

手順は下の感じ

  1. GameObjectを作成しTimeline Rootみたいな名前を付ける
  2. Control PlayableのSource ObjectにTimeline Rootをセットする
  3. Timeline Rootの子として、Parent以外のPlayable Directorを配置する

f:id:tsubaki_t1:20171016212106g:plain

 

この3の手順をTimeline再生前に行えば、動的にTimelineが再生するTimelineを差し替える事が出来ます。

f:id:tsubaki_t1:20171016212801g:plain

関連

https://twitter

tsubakit1.hateblo.jp

.com/tsubaki_t1/status/9121624389166202

https://twitter.com/tsubaki_t1/status/912162438916620288

https://twitter.com/tsubaki_t1/status/912162438916620288

https://twitter.com/tsubaki_t1/status/912162438916620288

 
 

【Unity】Timelineの独自Playableを超簡単に作るウィザード

キーボードが治ったので久しぶりのブログ更新です。

今回の内容はTimelineのPlayableを簡単に自作する方法です。

f:id:tsubaki_t1:20171015191851j:plain

Playableの自作

Timelineは現状、非常に単純な機能しか有していません。
例えば、アニメーションの再生、オーディオの再生、GameObjectのアクティブ切替、それと汎用ControlPlayableです。

tsubakit1.hateblo.jp

ControlPlayableがソコソコ汎用的なのでソレナリに色々な事が出来るには出来るのですが、少し凝った事をしようとすると直ぐにPlayableを自作したくなります。

 

とは言え、Playableの自作はかなり面倒くさい作業です。

Monobehaviourのように単純に一つのコードでは動作せず、Playable Asset、Playable Behavour、そして現実的に運用しようと思ったらPlayable Trackが必要でしょう。
Playable Trackは作成一覧に無いので、気づきにくい項目です。

f:id:tsubaki_t1:20171015192638j:plain

Playableをサクっと作るウィザード

この面倒くさいPlayableの作成をかなり単純にしてくれる機能がありました。

Default Playableに付いているTimeline Playable Wizardを使います。

f:id:tsubaki_t1:20171015192723j:plain

Default Playableについてはコチラ

tsubakit1.hateblo.jp

Timeline Playable Wizardの使い方

Wizardの使い方です。

まずDefault Playableをインポートしておき、Window > Timeline Playable Wizardを選択します。

すると下のような画面が出てきます。

f:id:tsubaki_t1:20171015192922j:plain

クリップ側で特にバインドしないならばStandard Bind Playableにチェックを入れます。
要するに、トラックで動かす対象が固定ならばStandard Bind Playableにチェックを入れる、クリップ毎に動かす対象(目標)を変えたいならばチェックを外す…といった感じです。

f:id:tsubaki_t1:20171015193300j:plain

後はTrack Binding TypeバインドしたいクラスStandard Bind Playable Property動かしたい値を設定します。

例えばTransformのPositionをTimelineで動かしたい場合は、下のような設定になります。

f:id:tsubaki_t1:20171015193617j:plain

字幕のようにTimeineで文字が変わる項目を作りたい場合は、下のような設定です。

f:id:tsubaki_t1:20171015193646j:plain

後はウィザード下のCreateボタンを押せば、Playableのコードが作られます。

作られるコード

作られるコードは若干面倒くさい構造です。たったコレだけの為に、5つのソースコードが追加されます。

f:id:tsubaki_t1:20171015194056j:plain

とは言え、命名規則はある程度決まっており、役割としても概ね決まっています。

  • ○○○Track
  • ○○○MixerBehaviour
  • ○○○Behaviour
  • ○○○Clip
  • ○○○Drawer
○○○Track

トラックを制御するコードです。
何をバインドするか…といった項目や、トラックの色を設定します。

MixerBehaviourもココから生成しています。

f:id:tsubaki_t1:20171015194432j:plain

○○○Clip

クリップをシリアライズするクラスです。
この項目にクリップ毎のパラメータを設定したり云々する感じです。

f:id:tsubaki_t1:20171015194659j:plain

○○○MixerBehaviour

クリップ全体の動作…という感じです。

この項目を記述して、クリップのブレンドやクリップ全体の動作を制御します。

このインスタンス一つのTrackに一つ生成されます。

大抵の場合、こちらを修正すれば色々と操作できます。

○○○Behaviour

各クリップの動作や、パラメータ保持情報についてです。

設定したクリップの数だけインスタンスが作られます

クリップ毎のパラメータを保持しているのはこの項目ですが、Drawerがパラメータを制御しているので、Drawerを編集しないとパラメータを増やせません

○○○Drawer

○○○Behaviourのエディター拡張…みたいなものです。

○○○Behaviourの値を編集したい場合は、こちらも編集します。

感想

手軽に出来るウィザードを用意するんじゃなくて、必要なコードはを少しシンプルな構造にできなかったのかしら。

関連

tsubakit1.hateblo.jp

【Unity】Hierarchyビューを複数使うのは、大きめのシーンを扱う際に便利かもしれない

f:id:tsubaki_t1:20170930223539j:plain

大きめのシーンを扱う時、Hierarchyを複数扱うと広い範囲をカバー出来て便利かもしれない…というお話です。

巨大なシーンとHierarchy

巨大なシーンを操作している時、複数の範囲のGameObjectを同時に編集したくなるといったケースがあります。
例えば、キャラクターのGameObjectとUIのGameObjectを行ったり来たりするような場合や、階層の広いUIを上に下に行ったり来たりする場合。

それがSceneViewで管理出来る物ならば、SceneViewでアクセスすれば良い話ではありますが、巨大なシーンになってくるとそれもソレで面倒くさい…という事もありそうです。

かと言って、毎回Hierarchyを閉じるのも面倒な話です。

f:id:tsubaki_t1:20170930224808j:plain

ならば検索…タグはどこだ?

巨大な物を管理する上で色々と便利なのが検索です。ただ、Hierarchyの検索で見つけられるのは以下の3つのみで、タグ付けして云々のような便利さはありません。

  • 保有するComponent
  • GameObject自体の名前
  • 指定アセットを参照しているオブジェクト(下のGIF)

https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20170620/20170620001933.gif

Save SelectIionは選択を記憶する

Save Selectionを使う事で、オブジェクトの選択位置を記憶する…というアイディアもあります。

但しこの機能、ゲームをビルドすると参照情報を失うという微妙な挙動なので、使い所が微妙な機能でもあります。

https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20150421/20150421022306.png

そうだ、Hierarchyを増やそう

面白いアイディアがHierarchyを増やしてしまうアイディアです。

単純にHierarchyViewを増やす事で、ある程度の階層を無視して、任意の階層にフォーカスを当てて操作が出来るという事を期待します。

 

Maya & Unity Timelineで魅せるキャラクターイントロ でHierarchyビューを二つ使用しているのを確認出来ます。

f:id:tsubaki_t1:20170930230046j:plain

やり方

Hierarchy Viewを増やすのは簡単です。メニューからAdd Tabを選択、Hierarchyを選択するだけです。作ったタブは移動する等をすれば良いです。

f:id:tsubaki_t1:20170930230336j:plain

選択先の情報が他のタブにも影響してしまうのを回避

さて、これだけだと一つだけ問題があります。
オブジェクトを選択した時、他のタブも同様に選択されたことになり、タブが開いたり移動したりしてしまう事です。

例えば下のGifアニメでは、左のタブでキャラクターの階層を開いて選択時、右の階層も開いてしまい、さらにフォーカスされたオブジェクトまでビューが動いてしまっています。

f:id:tsubaki_t1:20170930230642g:plain

この問題を解決するには、Hierarchyのビューをロックします。
出来れば全てのHierarchy Viewをロックしてしまうのが良いです。

これでオブジェクトを選択しても他のオブジェクトが一緒に開くことを回避出来ます。

f:id:tsubaki_t1:20170930230731j:plain

f:id:tsubaki_t1:20170930230859g:plain

試した感じ、マルチディスプレイや(20インチディスプレイ以上の)巨大なディスプレイで操作する場合、タブを切り離して使うとかなり操作効率上がる印象です。

Inspectorビューも同時に編集

InspectorやProjectビューも、ビューを増やしてロックの手順で複数同時編集出来ます。

ただ、ProjectViewは検索機能やお気に入り機能が充実してますし、Inspectorは切り替える頻度が多すぎて「増やしてロック」の手順では面倒臭すぎるかもしれません。

tsubakit1.hateblo.jp

Project Viewに至っては、何の役に立つのか分からんシリーズに乗るレベル。いや、使いみちはありそうではあるんですが。

tsubakit1.hateblo.jp

関連

www.twitch.tv

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

日記

19インチディスプレイがお亡くなりになられたので23インチディスプレイを購入。ブルーライト削減()とか思ってましたが、これ結構良いかもですね。予想以上に目がシパシパしない。

正直、都市伝説の類だと思ってましたが…うーむ…プラシーボ?