テラシュールブログ

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

【Unity】自作のパッケージを追加したりパッケージを一覧から検索したり…PackageManagerがUnity 2018.3で変化したポイント

今回はUnity 2018.3でPackageManagerが変化した幾つかのポイントです。

 

 

Package Managerに自作パッケージの追加が可能に

Unity 2018.3からPackageManagerに自作のパッケージを追加出来るようになりました。今までもpackage.jsonを拡張すれば可能でしたが、それが機能としてちゃんと追加された形です。

 

synamon.hatenablog.com

実際の手順

手順は大きく分けて3つあります。

  1. パッケージ化するフォルダの作成
  2. 「package.json」の記述
  3. PackageManagerからパッケージの追加

一つずつ見ていきます。

 

パッケージ化するフォルダの作成

パッケージ化するフォルダを作成します。基本的なルールはAssets以下のプロジェクトと同じような感じです。つまりEditor以下はビルドされませんし、AssemblyDifinitionFileは使えます。

例えば今回はエディター拡張と画像ファイルを適当に突っ込んだフォルダを用意しました。

f:id:tsubaki_t1:20180913204126p:plain

 

package.jsonの記述

次にpackage.jsonを記述します。ここにパッケージのバージョンやパッケージの名前、依存関係等を記述していくわけです。

gist.github.com

f:id:tsubaki_t1:20180913204625j:plain

記述のルールに関してはPackageManagerのマニュアルに詳しく記述されています。
多くの場合、パッケージに「他のパッケージへ依存関係を持たせる」方法が有益かもしれません。

 

パッケージの登録・登録解除

最後にパッケージを登録します。
PackageManagerの下に+ボタンが追加されており、ここからpackage.jsonを指定すると、指定のパッケージが登録出来ます。

f:id:tsubaki_t1:20180913205745g:plain

登録するとPackages一覧に自作のパッケージが追加されました。

ただエディター拡張が使えたり使えなかったりします。動作を確認中

f:id:tsubaki_t1:20180913205616j:plain

 

パッケージの登録解除はPackageManagerから行います。
Removeボタンを押せば登録が解除され、一覧から参照出来なくなります。

f:id:tsubaki_t1:20180913211358j:plain

 

PackageManagerの一覧表示が少し変わった

PackageManagerの一覧表示のオプションとして「Previewを表示するかどうか」が追加されました。

PackageManagerが提供するアセットは「Verified」と「Preview」の二種類があり、Verifiedは安定版Previewはβ版といえます。
今回は明確にPreviewを隔離した形です。なおPreview外すと新しい機能が殆ど無くなるっていうね。

f:id:tsubaki_t1:20180913211544j:plain

またパッケージ内で検索出来るようになりました。特に最近はパッケージが増えてきていて探すのが面倒になってきていたので、コレはありがたいんじゃないかなという気がします。

まぁ検索が効くのはパッケージ名だけで、カテゴリとかはスルーされてるんですが

f:id:tsubaki_t1:20180913211932j:plain

 

パッケージがローカルにキャッシュされるようになった

PackageManagerから入手したパッケージは基本的に特別なフォルダにキャッシュされていたのですが、今回これがプロジェクトの子階層にキャッシュされるようになりました。

tsubakit1.hateblo.jp

これが何を意味するかは難しい所ですが、PackageManagerのコードを書き換えても他のプロジェクトに影響しにくくなったと言えるかもしれません。

  • パス : {プロジェクト名}\Library\PackageCache

ただ、普通のプロジェクトではプロジェクトを共有する際にLibraryは抜くので、ココを改造するとプロジェクトが簡単に破綻するかもしれません。改造を目的とするなら、何処か適当なフォルダにコピーしPackageManager経由でインポートする手順を使ったほうが良さそうです。
あくまで「間違ってファイルを書き換えた時に事故る」対策なのかもしれません。

f:id:tsubaki_t1:20180913212310j:plain

Unityの基本機能の取り外し

前から出来ましたが、Unityの基本機能の取り外しがある意味分かりやすくなりました。正確にはエンジンの機能というよりはエンジンへアクセスするC#インターフェースを取り除けます。
エンジンに完全に機能が組み込まれてしまっている部分では効果は薄いかもしれませんが、WebGLなど非使用コードが積極的に削除されるプラットフォームや、ストリップ可能なC#で殆どの機能が記述されている場合(例えばTimeline)にはかなり有効な機能なんじゃないかなと思います。

  1. PackageManagerのBuilt in packagesの項目を選択します。
  2. 好きな機能(例えばアニメーション)を選択します。
  3. Disableで止めます

f:id:tsubaki_t1:20180913213338j:plain

これて止めると該当するAPIが使用できなくなります。

f:id:tsubaki_t1:20180913213452j:plain

何故明示的に削るのかというと、UnityにはCode Stripという不使用のコードを削る機能があるのですが、これはゲームに使用されている(SceneやPrefab等で)だけでなく、完全に不使用のサンプルコードから使用されている場合にも「使用する」判定となり、多くの場合あまりうまく機能していませんでした。

 なのでバイナリサイズを抑えようと思ったら不使用コードは全部プロジェクトから取り除き全コードを注意深く観察する必要があったのですが、今回コレで強引にプロジェクトから剥がすことが出来るようになったという訳です。

【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を操作出来ます。