テラシュールブログ

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

【Unity】コンポーネントを参照しているオブジェクトを見つけ出す方法

ついにUnity 2018.3のベータが開始しました。
今回はソコで追加された「コンポーネントを参照しているオブジェクトを見つけ出す」方法について紹介します。

 

 

シーン内の参照を検索

Unity 2018.3よりコンポーネントコンテキストメニューに「Find references in scene(シーン内の参照を検索)」の項目が追加されました。
この機能を使用すると、実行したコンポーネントを(Inspector上で)参照しているオブジェクトを見つけ出す事が出来ます。

f:id:tsubaki_t1:20180912234828g:plain

例えば

gist.github.comといったケースの場合、GameManagerのコンポーネントで「シーン内の参照を検索」を実行すれば、GameManagerを参照している全てのオブジェクトを見つける事が出来ます。

 

見つかるのはInspectorで設定されている場合のみ

この検索機能ですが、残念ながらInspectorで設定可能な場合のみ有効に利用することが出来ます。
言い換えると、ランタイムでprivateなフィールドやpublicなプロパティにセットした値は今回のアプローチでは表示出来ません。

この場合はProfiler経由で探す必要があります。

tsubakit1.hateblo.jp

 

実はUnity 2018.3以前も使えた

この機能ですが、実はUnity 2018.2以前も使えました。
いつから使えたかは覚えてないですが、以下の手順で同じようなことを実現出来ます。

  • InspectorをDebugモードに変更
  • Instance IDを確認
  • 検索にて「ref:インスタンスID:」と入力(コロンで数字を囲う)

例えばInstance IDが-8294のオブジェクトを参照しているオブジェクトを探す場合、「ref:-8294:」と入力します。

f:id:tsubaki_t1:20180913000544p:plain

今回の機能は、この操作がUI的に整備された形になります。

 

Prefabの子オブジェクトも表示されてしまう

この挙動で少し罠なのが、Prefabの子Prefabも表示されてしまう点です。例えばGameManagerを参照するキャラクターがカプセルを持っている…といった状態の場合、カプセルは特にGameMangerを参照していなくても親が参照しているため、一覧に表示されてしまいます。

f:id:tsubaki_t1:20180913001746p:plain

まぁ、用法用量を守って正しくお使い下さい…ということで。

 

関連

baba-s.hatenablog.com

【Unity】Unity 2018.2で追加されたPhysical Cameraとはナンゾや?

Unity 2018.2でCameraの設定にPhysical Cameraという新しいオプションが追加されました。この設定が今ひとつ分からなかったので、内容を確認してみました。

 

 

Physical Cameraは一般的なカメラ設定をUnityに持ってくる為の設定

Physical Cameraは「物理カメラ」と紹介されていますが、その実態は物理的なカメラ設定をUnityに持ってくるための設定みたいです。
正確には持ってこれるのはイメージセンサーのサイズ(Sensor size)焦点距離(Focal Length)、それとシフトレンズ(Lens Shift)で、ほとんどField Of View(FOV:画角)やカメラの角度の設定についてです。
動作はSensor Size、Focal Lengthの値でFOVを求めるモノです。

f:id:tsubaki_t1:20180909224239j:plain

何が嬉しいのかといえば、たぶんMayaや他の3Dソフト、もしくは実際のカメラでしょうか。そういった一般的なカメラワークフローで使う設定で撮影できることが良いんじゃないかなと思います

なお個人的にはF値の設定もココに付くかと思いましたが、特にありませんでした。

 

Focal LengthとかSensor Sizeとはナンゾや?

FOVは角度でしたが、Focal LengthやSensor Sizeとはどんなモノなんでしょう。ちょっと調べた所、何となくこんな感じっぽいです。
まずレンズの光の流下の図っぽいです。レンズが光を受けて内部で向きを補正、最終的にセンサーが光の情報を受け取りセンサーに転送し云々。*1

この時焦点距離(センサーと収束点の距離)が適切なら、画面いっぱいに被写体が表示されます。
f:id:tsubaki_t1:20180909225254j:plain

f:id:tsubaki_t1:20180909230014j:plain

今度は焦点距離を少し大きくしてみます。そうすると光の広がりに対してカメラの受け取る範囲が狭くなるので、結果的に像の一部しか表示されなくなります。これはFOVを小さくするのと似たような動作です。

f:id:tsubaki_t1:20180909231421j:plain

Focal Lengthは、この収束点とセンサーの距離。それを変動させることで最終的な画に変化を与えます。

 

焦点距離(focal length)を大きくするとズーム

焦点距離を大きくするとセンサーに光の一部のみが届くようになり、カメラの表示する範囲が狭くなります。カメラの表示範囲が狭くなるということは画角が狭くなり一部が拡大(ズーム)されます。
これは単に絵が大きく表示される他、絵の立体感が失われるという特徴を持ちます

例えば下の絵は3枚のスクリーンショットです。見た目の大きさは大体同じなのですが、焦点距離が少しずつ異なり、また焦点距離を離した分だけ実際のカメラを離しています。
一枚目は最も焦点距離が小さく(確か15くらい)距離も近い絵です。そして三枚目は最も焦点距離が大きく(確か300)カメラも離しています。
焦点距離を大きくするとズームされ、その上で大きさを合わせようとすると距離感がなくなっています。

f:id:tsubaki_t1:20180909233557p:plain

f:id:tsubaki_t1:20180909233615p:plainf:id:tsubaki_t1:20180909233634j:plain

立体感の有無は非常に重要な要素です。例えば奥行きを強調したいようなシーン…ロケーション全体を表現するような場合は広角(焦点距離が小さい)の設定を使いたい所です。逆に距離を圧縮(離れてる物も近いものも一緒くたに表示したい)する場合は望遠(焦点距離が大きい)設定するのが良さそうです。

 

焦点距離が同じ場合、センサーサイズが小さい方がズーム

この動作と似たような事がセンサー側でも出来ます。要するに小さいカメラセンサーを採用すれば狭い範囲での光の受け取りが出来ないので、大きなセンサーと比較すると同じ焦点距離に対してズームされたような絵を受け取ります。
これは焦点距離は同じですがセンサーが大きくなったので、広い視野が得られ結果として被写体の画面占有率を下げています。

f:id:tsubaki_t1:20180909231355j:plain

f:id:tsubaki_t1:20180909231703j:plain

まぁセンサーはそうそう変更するものでもないでしょう。カメラの本体を差し替えるようなものです。
なのでカメラのセンサーサイズはサンプルにある一つから選択するか、自分の思うカメラの設定にしてもよかな感じがします。
そもそもセンサーを切り替える理由が「多くの光を取り込めて画質が良くなる」という点だそうですが、3Dには全く関係のない事ですので。

www.photografan.com

シフトレンズでカメラの向きを変えずにパンする

シフトレンズは正直初めて聞いた言葉なのですが、カメラの向きを変更せずに光学的に表示内容を変えるアプローチみたいです。
ただ絵が歪むのであまり強烈にはかけられないみたいです。Unity側でもこの機能を使うと盛大に絵が歪みました。

ryoriphoto.comf:id:tsubaki_t1:20180909234853j:plain

f:id:tsubaki_t1:20180909235015j:plain

 

Cinemachineとの連携はどうなの?

カメラ関係の連携といえばCinemachineです。こちら、もしカメラがPhysical Camera設定担っている場合、FOVの項目がfocal lengthに変化します。
またforcal lengthがプリセットから選択できるようになります。用途次第で毎回設定するのではなく、一覧から選択するのはたぶん理に適っています。

  • 12mm
    超広角。近づいて撮影する専用、中央以外にあるものは歪む
  • 24mm
    広角。周辺が見えつつもそこまで歪まない
  • 35mm
    基本
  • 70mm
    望遠。ちょっと遠くのモノを撮影する
  • 105mm ~ 300mm
    超望遠。かなり遠くのモノを撮影する用。この設定で撮影すると立体感が死ぬ
    アニメキャラとかは多分だいたいこの設定

f:id:tsubaki_t1:20180909235507j:plain

f:id:tsubaki_t1:20180910000152g:plain

 

F値は?

Post Processing Stack側の設定です。

*1:昔大学でやってた内容なんですが、もう完全に忘れてますね。このレンズ作るのCADとかで色々やった事だけは覚えてるんですが…

【Unity】MainCameraが移動できなくなったときの対処法

今回はMainCamera(もしくは任意のオブジェクト)が動かせなくなったケースの対処方についてです。以前見かけた現象ですが、今回その再現方法を思い出したのでメモしておきます。

 

 

カメラが動かせない!

さて、突然カメラが動かなくなりました。カメラのTransformを引っ張っても、Inpsectorでパラメータを変えてもうんともすんとも言いません。

Transformだけではありません。FOVもPhysical Camera設定も、Near Far設定も全て操作不能です。ナンテコッタイ!!!

f:id:tsubaki_t1:20180908220823g:plain

強いて言えばCameraのenable/disableやClaer Flag、CullingModeやAllow HDR等のAllow系は操作することができます。

 

zzz... 犯人はCinemachine、貴方です

問題を解決するために推理します。

この手の操作ができない系は、大抵の場合どこからか操作されています。そして操作出来ない項目の一覧に見覚えがあります。
Virtual Cameraです。

f:id:tsubaki_t1:20180908221523j:plain

ということで動かせないカメラを再度確認してみると、Cinemachine Brain。これがカメラの動きを止めていたみたいです。
Cinemachine、お前だったのか。

Cinemachine BrainはCinemachineを使用すると勝手にMain Cameraにセットされるコンポーネントです。このコンポーネントが最もプライオリティの高いVirtual Cameraに合わせてCameraの座標やFOVを調整します。

これはVirtual Cameraが一つも登録されておらずアクティブなVirtual Cameraが無い場合でも座標を上書きするらしく、コレがセットされていたせいでCameraが動かせませんでした。
本来はVirtual Cameraを追跡するので何となく分かるのですが(Virtual CameraはSceneViewに表示される)今回はVirtual Cameraが無かったのでパっと見わかりませんでした。

f:id:tsubaki_t1:20180908221710j:plain

 

どのように起こすのか?

今回の悲劇はどのように起こすことができるのか考えてみます。

まずは自分が起こしたケース。

  1. Virtual Cameraを作成
  2. やっぱ止めるとVirtual Cameraを削除

Virtual Cameraを作成した地点でCinemachine BrainをMain Cameraに追加するので、Virtual Camera生成直後に破棄すると動かないMain Cameraが残されます。

 

もしくは、こんなケースも見かけました。

  1. Timelineを導入
  2. Cinemachine Trackをトラックに追加
  3. 適当なオブジェクトをCineamchine Brainへドラッグ&ドロップし、
    Create Cinemachine on ○○を選択

これで動かせないオブジェクトの完成です。今回の場合SphereオブジェクトをTrackに登録したところ、一切動かせなくなりました。正確にはVirtual Cameraを追うようになり、自身で動かせなくなりました。

f:id:tsubaki_t1:20180908222606j:plain

で、解決方法は?

Cinemachine Brainをカメラから外すだけです。
Cinemachine BrainがセットされているGameObjectはHierarchyに表示されるので、探し出してCinemachine Brainを消せばOKです。

f:id:tsubaki_t1:20180908222954j:plain

もしくはVirtual Cameraをセットすれば、Virtual Camera経由でCinemachine BrainがセットされているGameObjectを操作出来ます。

【Unity】既存のプロジェクトにLightweight RenderPipelineを導入する

今回はLight Weight Render Pipelineを既存のプロジェクトに導入してみます。

 

 

Lightweight render pipeline

Light Weight Render Pipeline(LWRP)は、Scriptable Render Pipelineで提供するテンプレートの一つです。
主にモバイルやモバイルVRといったパフォーマンスがリッチではない端末に焦点を当てているパイプラインで、多くの端末で動作しつつも見た目はそれ程貧弱にならないといったモノを目指しているみたいです。

f:id:tsubaki_t1:20180907184402j:plain

それなりに詳しい説明は、下のブログで確認できます。

blogs.unity3d.com

 

Light Weight Render Pipelineを使う

LWRPを使用してみます。

まずPackage Managerからパッケージを導入します。

  1. メニュー > Window > Package Managerを開く
  2. Allタブを選択
  3. Render Pieplines.Lightweightを選択
  4. Installを押す

f:id:tsubaki_t1:20180907184552j:plain

これでパッケージが導入されます。次にLWRPの適当です。

  1. Asset > Create > Rendering > Lightweight Pipeline Asset
    でアセットを作成
  2. Editor > Project Settings > Graphicsを開く
  3. Script Render Pipelineに先程作ったアセットを指定

f:id:tsubaki_t1:20180907185618j:plain

f:id:tsubaki_t1:20180907185646j:plain

画面がまっピングになります。
これはLWRPのライティングが今までのSurface Shaderに対応していないからです。
これを一つ一つアップデートするのは非常に骨なので、一括でアップデートしてしまいます。

  1. Editor > Render Piepeline > Update Project Materials To Lightweight Materials
  2. Processedを押す

これで一定の法則に従い、シェーダーがアップデートされます。
この法則については、Upgradable Shadersに書いてあります。

要するにStandard ShaderはStandard (Physically Based)、MobileやLegacy ShaderはStandard (Simple Lighting)になります。
ではそれ以外…例えばParticleのShader等はといえば、ライティングシステムを使用してないならそのまま使えます。Unlit等のシェーダーも同様です。

f:id:tsubaki_t1:20180907184716j:plain

 

 これでシェーダーがUpgradable Shadersの法則に従い差し替えられて、概ね見れるようになります。いくつかのシェーダー(Unityの光表現を使用しつつ差し替え対象から外れてるシェーダー・・・例えばReflectiveやGlass Shalder等)はShaderが動作せずピンク色になるので、手動で別のシェーダーを割り当ててやる必要があります。
光があり特殊な動きをするシェーダーに関しては、ShaderGraphに丸投げという感じみたいです。

f:id:tsubaki_t1:20180907213947p:plain

それができたらクォリティの調整です。
LWRPを適応するとQuality Settingsで変更していたライティング関連の項目が殆どLightweight Asset(先程作成したファイル)に移行しますので、プロジェクトにあった適当な値を設定する必要があります。

今までの設定に加えてさり気なくシャドウの解像度が設定できるのは嬉しいですね。

【Unity】リアルタイムな影がカクカクになる問題の対処 - テラシュールブログ

f:id:tsubaki_t1:20180907214958j:plain

最後にライトの設定も行います。というのも、LWRPは現在subtractive(減法)以外のライトマップに対応していません。なので、ライトは再度焼き直したほうが良いです。リアルタイムGIも無くなっています。

一応、Unity 19.1で他のいくつかのライトマップ(Shadow MaskとBaked Indirect)が実装されるみたいなので多少は変わるかもしれません。

Pipeline Feature Comparison
f:id:tsubaki_t1:20180907220221j:plain