テラシュールブログ

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

【Unity】GameObjectのstatic設定についてのアレコレ

UnityはGameObjectにstaticのフラグを設定する事が出来ます。
面倒な場合はeverything(全部)で設定してしまうのですが、これは結構意味がり、場合によってはチェックを外したほうが良い事もあります。

 

色々なstatic

static(静的)が設定されているオブジェクトは、基本的に「動かない」モノとして扱われます。とりあえずstaticに明確にチェックが入っている場合は全てのstaticフラグにチェックが入った物として扱われます。

f:id:tsubaki_t1:20161112000951j:plain

全てにチェックを入れる必要が無い場合、▼ボタンより個別に設定することが出来ます。全部にチェックを入れておけば大体OKですが、パフォーマンスや作業効率的に抜いておいた方が良いというケースもあります。

f:id:tsubaki_t1:20161112001128j:plain

Lightmap Static

ライトマップをベイクする際に使用するstaticフラグです。この項目にチェックが入っていると、Lightmapが焼かれます。

但しSkinedMeshRendererにはlightmap staticフラグは効きません。(LightmapParameter持ってるのに…)

f:id:tsubaki_t1:20161112001636j:plain

Lightmapを焼いた場合Lightprobeの影響を受けなくなります。但しLODを使用している場合LOD1以上はLightmapを焼きつつLightprobeの影響を受けます。

f:id:tsubaki_t1:20161112001856j:plain

なおLightmap staticは「ライトの影響を受けるか」の設定というだけなので、実は移動させる事が出来ます。エディタのSceneViewからはロックされるので、これが見落としなのか仕様なのかは難しい所ですが、現状の動作としてはTransformを移動させれば動かせるみたいです。

f:id:tsubaki_t1:20161112002056j:plain

ただしLightprobeは実行時に結合されるので、Transformとはまた別の考えが必要になります。また、焼いた影やRealtime GIは変更されないので、動かした事によって絵が破綻する可能性があるので注意が必要です。

f:id:tsubaki_t1:20161112003714j:plain

Lightmapを焼く事で大抵の場合は綺麗になりますが(主観)、広範囲に影響があるような物や超遠方の背景等にコレを付けると、ライトマップのベイク時間が笑えるほど伸びます。また、Lightmapのテクスチャに焼き込まれる為、場合によっては膨大なメモリを喰います。
左は奥にあるオブジェクトにLightmap Staticを設定した場合、右はしなかった場合です。メモリ消費量はかなり削減されています。もし奥のもLightmapを焼きたい場合、オブジェクトのLightmap Scaleを下げると良いです。

f:id:tsubaki_t1:20161112005420j:plain

Lightmapをベイクしないなら、この設定は意味ないっぽいです。Realtime GIやBaked GIの両方にチェックを入れていないケース。

Reflection Probe Static

f:id:tsubaki_t1:20161112003101j:plain

Reflection Probe Staticは、Reflection Probeに焼き付ける対象…つまりReflectionProbeに映り込むオブジェクトに設定します。

もし Reflection Probeのベイク設定がBakeではなくRealtimeの場合は、別にReflection Probe Staticは要りません。

 

Reflection Probe Staticで厄介な事は、Reflection Probe Staticのオブジェクトに変化がある度にReflectionProbeが焼き直される点です。LightmapStaticは(Precomputed Realtime GIの場合)Transformに変化が無い限り焼き直されませんが、Reflection Probe Staticの場合は、Transformだけでなく色が変化した場合も焼き直しになります。

 

なお、特に金属質なオブジェクトを配置する場合ReflectionProbeとReflectionProbeStaticが無いと非常にしょぼい絵になるので、割と積極的に使っても良い機能ではあると思います。

 

Batching Static

Batching StaticはStatic Batchingを使用するために必要なフラグです。Batching Staticにチェックを入れると、結合可能なオブジェクト(同一マテリアルでメッシュが同じで、指定ポリゴン以下でPassが1)を結合してGPUに一発転送してくれるので、ドローコールが減りパフォーマンスが上がります。

f:id:tsubaki_t1:20161112011009j:plain

static batchingが他のstaticと違う点は、メッシュを動かせなくなる点です。Transform的に移動させる事は可能なのですが、描画は同一の位置に残ります。その為、動かしたらColliderだけが動いてるような印象を受けます。

f:id:tsubaki_t1:20161112011428j:plain

static batchingのチェックが入っていないなら、この設定は無意味っぽいです。

OcluderとOcludeeのstatic

 OccluderとOccludeeのstaticは、Occlusion Cullingに関するスタティック表現です。Occluderにチェックが入っていれば、Occlusion Cullingによって遮ったオブジェクトを非表示にしてくれます。

tsubakit1.hateblo.jp

Occludeeは、遮る際の計算を楽にするのに良いみたいです。例えばガラスや小物等。逆に、何でもかんでもOccluderの設定を付けると、Occlusion Cullingの計算コストやベイクのコストが跳ね上がるっぽいです。

http://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20150422/20150422221816.gif

Occlusion Cullingを使わないなら、この項目は付けても付けなくても余り変わらないっぽいです。

Navigation StaticとOff Mesh Link Generation Staticの項目は、Navmeshのベイクの有無を確認するStaticです。この項目にチェックが入っていると、Navmesh用のメッシュを作成します。

tsubakit1.hateblo.jp

少し厄介なのが、Navmeshを設定ていない場所は壁になる訳ではない点です。例えば地面にのみNavmeshを設定している場合、絵的には壁がありますがNavmeshAgentで移動させると壁を貫通して移動します。
こういったケースでは、Navigation Staticを設定した上でNo Warkableを設定した方が良いです。

f:id:tsubaki_t1:20161112234433j:plain

f:id:tsubaki_t1:20161112234536j:plain

 

Off Mesh Link Generation Staticは、Off Mesh Linkを設定するための物です。これを何にでも設定すると、至る所から飛び降りる事が可能になってしまう事があり、坂道等で思いがけないショートカットをされる事があります。

表現的に飛び降りる所は限定する、しかし毎回Offmesh Linkを手動で設定するのが面倒臭い場合は、使う所を限定するのが良さそうです。
ちなみにOff Mesh Link Generationは、飛び降り元のメッシュに設定します。

f:id:tsubaki_t1:20161112235012j:plain

 

まとめ

割と手軽に設定できるstaticですが、規模が大きくなると余計なstaticを設定していることで少し悩ましい事が起こる事もあります。
大抵の場合は問題ないですが、用法用量を守って正しくお使い下さい。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp