テラシュールブログ

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

【Unity】クラス名からTypeを取得する

クラス名(文字列)からTypeを取得する方法についてです。

タイプを取得する

リフレクション等を駆使して何らかのアクションを行うエディタ拡張を作る際、名前からクラスのTypeを取得したく鳴る事があります。

その辺りを使用する場合、Unityの便利APIで、下のように取得することが出来ます。

string typeName = "UnityEngine.MonoBehaviour";
System.Type targetType = UnityEngine.Types.GetType (typeName, "UnityEngine.dll"); 
Debug.Log (targetType);

f:id:tsubaki_t1:20161125234653p:plain

 Unity 5.5以降の場合

Unity 5.5以降、Typesは使えなくなったため上記の方法ではエラーになります。
error CS0619: `UnityEngine.Types.GetType(string, string)' is obsolete: `This was an internal method which is no longer used'

 

タイプを取得したい場合、下のように記述します。

string typeName = "UnityEngine.MonoBehaviour";
System.Type targetType = System.Reflection.Assembly.Load("UnityEngine.dll").GetType(typeName);

【Unity】Shadow ProjectionのClose FitとStable Fitについて

今回はQualityの設定にあるShadow Projectionの設定について、少し説明が分かりにくかったので検証してみます。

f:id:tsubaki_t1:20161124233258j:plain

Shadow Projection

Quality SettingsのShadow Projectionのマニュアルを見てみます。

ディレクショナルライトから影を投影する 2 つの方法があります。Close Fit は高解像度の影をレンダリングするが、カメラのわずかな動きで揺れることがあります。Stable Fit は、低解像度の影をレンダリングするが、カメラの動きでは揺れません。

昨日のテクスチャに焼いた影とリアルタイムな影を混ぜる に書いた通り、Directional Lightの影は、Shadow Distanceの影響を強く受けます。Shadow Distanceの距離が広いと描画に使用するテクスチャの範囲が広大になるため、1mに使用できるテクスチャのピクセルが小さくなり、結果として影が荒くなります。

f:id:tsubaki_t1:20161124234513j:plain

この影の投影方法は実は二つのオプションがあります。

Stable Fit

初期設定であるStable Fitの場合、 Shadow Distanceの描画範囲は、オブジェクトの有無に関係なく利用されます。例えば300と指定した場合、遠方がせいぜい1mの距離しか無い場合であっても、300m分の影が作られます。*1
特にモバイルはShadow Textureのサイズが厳しいので、Unityの初期設定である150mなんて設定していると、かなり汚い影になります。
パフォーマンスや品質を考えると、Shadow Distanceはかなりよく考える必要がありそうです。

https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20161123/20161123235624.jpg

なお、距離に応じてテクスチャの範囲を変化させるShadow Cascadeというオプションがあります。近距離は大きめの領域を使用し(6%の描画範囲が25%のShadowMapを使用)遠距離は小さめの領域(53%が25%を使用)を使います。
描画に追加の負荷がかかりますが、広範囲の影を描画したい場合、良い感じに描画してくれます。(PCの影がモバイルと比較して妙に綺麗なのは、コレのお陰です)

f:id:tsubaki_t1:20161125004223j:plain

translate.unity3d.com

Close Fit

Close Fitの場合、Cameraが見える範囲のオブジェクトに合わせてShadow Textureに描画する範囲を調整してくれます。つまり、Shadow Distanceが大きい値を持っていても、近いオブジェクトしか描画しない場合は非常にクォリティの高い影を使用してくれます。

これはどちらかと言えば、景色が動かない物向けです。またClose Fitの設定には幾つか注意すべき点があります。

f:id:tsubaki_t1:20161125000422j:plain

 あくまで描画範囲を設定しているだけ

注意すべきは、あくまで描画対象の距離に応じてShadowMapに使う範囲を設定してくれるだけという点です。遠距離に描画対象がある場合、それほど綺麗にはなりません。

下のように、遠方にオブジェクトが描画される場合、影はStable Fitと同じように汚くなります

f:id:tsubaki_t1:20161125003727j:plain

動かすと影がちらつく

Close Fitを使用している場合影がちらつく事があります。また上記のように描画対象の奥行きが変化する場合、影が動的に変わり、ちらつきます(左)。

これはShadow Distanceがある程度低く、かつQualityがHighの場合(右)はそこまで気にする物では無くなるかもしれません。

f:id:tsubaki_t1:20161125001253g:plain f:id:tsubaki_t1:20161125001517g:plain

描画判定はRecieve Shadow

ちなみにClose Fitの「描画対象となる判定」はRecieve Shadowみたいです。つまりキャラクターの近づかない遠方のモデルは Baked でライトマップを焼いておき、Recieve Shadowのチェックを外しておく事で、Close Fitの品質をある程度保てる訳です。

f:id:tsubaki_t1:20161125002745j:plain

 

勿論遠方にハイクォリティなLightmapを使うのは無駄なので、Scale In Lightmapの品質は下げておきます。

tsubakit1.hateblo.

感想

基本的にはStable FitでShadowDistanceを適切な値に設定*2、それが面倒ならClose Fitを設定するのが良さそうです。
Close Fitを使用する場合は、Recieve Shadowにチェックの入ったオブジェクトを遠距離に置かないように注意します。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

*1:この距離はCameraのNearとFarの値でClampされます。まぁCameraのNaer-Farの初期設定は1000mな訳ですが

*2:150mとかは止める

【Unity】テクスチャに焼いた影とリアルタイムな影を混ぜる

今回は焼いた影とリアルタイムな影を混ぜる方法についてです。

焼いた影とリアルタイムな影

UnityではLightコンポーネントのShadowを設定するだけで、影を追加する事が出来ます。この際に表示される影はリアルタイムに計算されている物で、規模や物によっては非常に高いGPUの負荷になります。

f:id:tsubaki_t1:20161123220430j:plain

このため良くある手法としては「事前計算した結果をテクスチャに焼きこんでしまう」という手法を取ります。これは所謂 Baked と Baked GI の組み合わせで、事前計算やテクスチャの読込が必要な代わりに、端末の発熱やCPU・GPUのパフォーマンス的かなり有利な設定です。

f:id:tsubaki_t1:20161123220927j:plain

またリアルタイムな影は、Shadow Distanceの範囲内しか表示されません。例えば巨大なビル群がある場合、途中までしか表示されないといったケースもあります。

事前計算であれば(ライトマップを読み込む負荷およびベイクする負荷がありますが)遠方まで表示されます。

f:id:tsubaki_t1:20161123225719j:plain

Baked Shadowはリアルタイムなオブジェクトに影を落とさない

この設定には一つ問題があります。Bakedで焼いた影はリアルタイムな影に影響を与え無い点です。
左の図はリアルタイム、右は背景以外はBakedでテクスチャに焼きこんでいます。比較すると、リアルタイムに配置した白い箱には影が落ちていない事が確認出来ます。

f:id:tsubaki_t1:20161123221824j:plain

f:id:tsubaki_t1:20161123224729g:plain

リアルタイムな物にBakedで焼いたマップの影をに落とす

リアルタイムなオブジェクトに影を落とす場合、RendererのShadowOnly設定を使用します。ShadowOnlyはその名の通り、影の描画にのみ使う設定です。

試しにCylinderをShadow Onlyに変更すると、Frame Debuggerを確認すぐ限り描画一覧(Render Loop Job)からCylinderが外されている事が確認出来ます。
これを活用します。

f:id:tsubaki_t1:20161123222724j:plain

f:id:tsubaki_t1:20161123223503j:plain

 

つまり、Baked にて焼き付けるCylinderと同じ位置にShadow OnlyのCylinderを配置します。
Lightの設定はMixed(ライトマップを焼くがダイナミックな影も落とす)に設定し、Shadow Onlyの方はLightmap Staticは外しておくのがポイントです。

f:id:tsubaki_t1:20161123224749g:plain

パフォーマンス・クォリティを稼ぐために

これだけでは単純にLightmapの品質にリアルタイムな影を設定したいだけになってしまします。これだけでも一応「遠方の建物の影が表示される」という利点はありますが、パフォーマンスを考えて幾つか最適化を考えます。

Shadow Distanceを下げる

一つ目はShadow Distanceを下げる、つまり影を表示する距離を限定してしまう事です。遠方にあるキャラクターは影を使用せず目から近いキャラクターのみを表示するというアイディアです。カメラの向きやコンテンツにも寄りますが、意外と綺麗に映ります。

f:id:tsubaki_t1:20161123225942j:plain

またShadow Distanceを下げるもう一つ良い所は、影が綺麗に映る点です。影の品質はShadow Distanceに強く依存します。Cascade(距離に応じて品質を分ける)設定もありますが、基本的に影の計算に使用する範囲が狭ければ狭いほど沢山の解像度が使えるので、綺麗になります。

f:id:tsubaki_t1:20161123235624j:plain

影を落とすオブジェクトだけShadowOnlyを複製する

例えばShadow Onlyを影の落ちるオブジェクトにのみ設定することで、Shadow Mapを作る際の負荷が削れます。

ちなみに全てダイナミックなライトマップで構成してる場合、地面のCastShadowを切る事でも結構パフォーマンスが稼げたりします。

f:id:tsubaki_t1:20161123232728j:plain

Shadow Onlyのメッシュはソコソコローポリでも良い

限度はありますが、Shadowに使う方のモデルはソコソコローポリでも良いです。細かいパーツ等は、余程投影先が単純な形状でない限り分からないと思います。

f:id:tsubaki_t1:20161123233647j:plain

その他

この手法は「一応混ぜれるよ」ってレベルで色々と問題はあるので、対策してるバージョンの実験ビルドが公開されています。

https://forum.unity3d.com/threads/mixed-mode-fixes-and-lighting-window-preview-2-mix-harder.430308/

 

ちなみに、Baked Onlyでやる場合(モバイルとか)、シェーダーを少し書き換えた方が良いかもしれません。設定によっては結構顕著に色の違いが出ます。

関連

support.unity3d.com

【Unity】Visual Studio 2017 (RC)をUnityで使う

Visual Studio 2017 RCで、Unityに特化した機能が幾つかあったみたいなので、試しに使ってみました。

Visual Studio 2017 for Unity

Visual Studio for Unityの機能の幾つかが、このムービーで紹介されています。
「Unityで使う機能のみをインストールするオプション」や、「Unityコールバック周りの入力補完」「デバッグ周りの強化」についてです。

connectevent.microsoft.com

Visual Studioはココから入手出来ます。

www.visualstudio.com

インストールオプション

インストーラーを展開すると、インストールする対象に「Unityによるゲーム開発」のオプションが追加されています。
これを選択すれば、Unityで使う物だけがインストールされます。
但し単純にチェックを入れるとUnityエディタのインストールも含まれるので、「省略可能」にあるUnityエディタはチェックを外しておくが吉っぽいです。

f:id:tsubaki_t1:20161121001215j:plain

インストール後はパスを指定します。

Edit/Preference...よりPreferenceを開き、External ToolsのExternal Script Editorの項目をVisual Studio 2017 RCにセットします。これは初期設定ではこの設定は無いので、Browse...を選択し、下のパスで実行ファイルを直接指定します。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDEdevenv.exe

Visual Studioを使用していない場合、起動時にMicrosoftアカウントとか要求されるかもしれません。

f:id:tsubaki_t1:20161121001755j:plain

f:id:tsubaki_t1:20161121002009j:plain

コード補完

コード補完もバッチリ効きました。
また、ソレとは別にイベントコールバック一覧を表示するウィンドウもあったので、コレはこれで使えるような気がします。

f:id:tsubaki_t1:20161121001436j:plain

f:id:tsubaki_t1:20161121002315j:plain

中々に使い勝手は良さそうです。

 

 

そして、Visual Studio for MacテキストエディタじゃないVisual Studio
次にでも試します。

www.itmedia.co.jp

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp