テラシュールブログ

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

【Unity】PackageManagerが提供するパッケージのダウンロード先と、パッケージを改造する方法

今回はPackageManagerがダウンロード(キャッシュ)する先のフォルダの確認と、PackageManagerが提供する機能を改造する方法について紹介します。

 

PacakgeManagerは機能をUnityエディターに追加する

Unity 2018.1からPackageManagerという機能が導入され、プロジェクトの中身を汚さず追加機能が導入出来るようになりました。
最近のUnityは新機能の大半をこの機能経由で導入しており、(幾つかの内部エンジンが関係しているような機能以外は)Unityエディターのアップデート無しにバグフィックスや新機能の追加、古いバージョンの導入等が可能になっています。

(Unity 2018.2からはエンジン機能の明示的なストリップにも対応)

f:id:tsubaki_t1:20180816213143j:plain

これはUnityエディターにプラグインのように追加しているのではなく、特定のフォルダパスに事前にパッケージをダウンロードしておき、プロジェクト毎にパッケージを参照する事で実現しています。

つまり、何処かにファイルがダウンロードされている訳です。

 

PacakgeManagerでダウンロードしたファイルを保存するパス

肝心のPackageManagerでダウンロードしたファイルを保存するパスですが、

WindowsC:\Users\ANY_LOGIN_ID\AppData\Local\Unity\cache\packages\packages.unity.com\*Mac~/Library/Unity/cache/packages/packages.unity.com/*にあります。
面倒ならば、Unity 2018.2からならばPacakgeManagerからShow In Explorer等で探してやると良いです。

f:id:tsubaki_t1:20180816214306j:plain

なお、Windowsの場合Cドライブに作られパスの変更は出来ません*1


また過去にDLしたパッケージを全て保持しているらしく、Cドライブを容量小さめのSSDにしている自分みたいなタイプでは気づいたら容量がなくなってたりします。

自分の環境ではパッケージの保持に800MB程使用していました。

f:id:tsubaki_t1:20180816214738j:plain

ついでに経験則ですが、もしネットワークが不調(例えば貧弱なネットワーク環境で大人数のワークショップをする等)だったりPackageManager側のサーバーが不安定だったりで中途半端にパッケージがダウンロードされた場合、上記フォルダからダウンロードしたファイルを消すと治る事があります
(既にダウンロード判定された場合、キャッシュが使用される為、消さないと治らない事がある)

 

PackageManagerが提供する機能を改造する

PackageManagerのスクリプトをPackages以下に配置してやれば改造が可能になります。

f:id:tsubaki_t1:20181031184610j:plain
また改造しない場合でもAssembly Definition File単位でソリューションが分割されるので、クラスへのジャンプが容易になります。
ソースコードを追う上でも便利かもしれません。

f:id:tsubaki_t1:20181031184524j:plain

PackageManagerからダウンロードするスクリプトは基本的にReadOnlyです。ここで提供されているパッケージは全てのエディターからアクセスされているため、編集すると全てのプロジェクトが影響してしまい大惨事になります。

ただ、実際このPackageManagerで提供されている機能の大半は完全にC#で動作しておりUnityのフォルダルールに従って配置されているので、実は普通にプロジェクトの中にコピーしてしまえば編集可能になったりします。

かなりハック的なアプローチですが、本当に必要な場合は検討しても良いのかもしれません。
まぁ幾つかのプロジェクトで確実に必要そうな感じなので(例えば改造前提のLWRPなど)、その内ちゃんとしたアプローチが用意されそうな気がします。専用フォルダに改造可能なパッケージをコピーするとか

AssetStoreのパッケージもPackageManager経由で云々という話もUniteでされていたので、今PackageManagerに色々と労力を割くと後で泣きそうな予感も

 

関連

qiita.com

*1:AssetStoreでダウンロードしたパッケージをDドライブに保存するようにする 的なアプローチで変更は出来るかもしれませんが、機能としては用意されていません。

【Unity】Profiler Native Plugin API

Unity 2018.2より、Profiler Native Plugin APIが実験機能として追加されました。
何コレと思ったので少し探してみました。

f:id:tsubaki_t1:20180814235838j:plain

 

Profiler Native Plugin API

どうもコレは、Profilerの処理に追加でコールバックを設定してプロファイラーに乗せる情報をフックする感じの機能みたいです。動作はC#ではなくC++(ネイティブプラグイン)側で動作します。
これは例えば、他のプロファイラー系ツールとの統合等に使えそうです。

ドキュメントの草案は下のURLから確認出来ます。

docs.google.com

実装例

実際に動作する例としては、下のプロジェクトが良い感じに見えます。
これはAndroidのSystraceへ統合するサンプルプロジェクトで、SystraceからUnityのプロファイリングの結果を名前付きで確認することが出来るみたいです。

f:id:tsubaki_t1:20180815000959j:plain

github.com

関連

unity3d.com

https://forum.unity.com/threads/profiler-native-plug-in-api.527614/

【Unity】Roll a BallのカメラをCinemachineで制御したら結構良い感じになった(と思う)

f:id:tsubaki_t1:20180809222952j:plain

CinemachineでRoll A Ballのカメラワークをやってみます。

 

 

Roll a Ballとカメラワーク

Roll a ballはUnityで多分最も簡単なワークショップの一つです。
ただ簡略化している所が多く(最初に使うべき機能に限定している)、ゲームとしてみると粗が結構多いのも事実。
特にカメラワークは非常に単純すぎる感があります。

そこで今回はRoll A BallのカメラワークをCinemachineのモノに差し替えてみました。

f:id:tsubaki_t1:20180809223516g:plain

 

カメラが追跡する対象を指定する

まずは球を追跡するカメラの設定を作ってみます。
Cinemachineのカメラを使用するので、Virtual Cameraを作って対応していきます。

まずCreate Virtual CameraでVirtual Cameraを作成します。

f:id:tsubaki_t1:20180809223856j:plain

作成したVirtual CameraのFollowにPlayerをセットします。
Follow(及びBody)が有効な場合、Virtual Cameraの座標や回転はFollowで指定したオブジェクトの座標や向きに依存するようになります。

f:id:tsubaki_t1:20180809224208j:plain

さてBodyのTransposerの初期設定はLook To Target with Upという設定です。
この設定はオブジェクトの後ろにカメラが来るように移動するというモノで、アーマードコアや幾つかのTPS向けゲームの表現に近いのですが(回転は即反映で移動は予測有りバネ式)、Roll A Ballは操作対象のオブジェクトが回転するので相性が悪いです。

f:id:tsubaki_t1:20180809230340g:plain

 

カメラの移動設定

カメラの移動設定を作ります。
ココは幾つかオプションがあります。

最も基本となる動作に近いTransposer & World Space

まず最も単純なのが、Transposer と World Spaceの組み合わせです。
単純に相対距離を維持したまま操作対象を追跡します。その際にDampingを0にしておくと、カメラが操作対象を完全にフォローします。Dampingを1にしておくと、少しゆっくり追跡します。

f:id:tsubaki_t1:20180809230912j:plain

 

対象の移動先を予測して向きを変える

玉転がしは移動先を見るゲームです。移動先に視点を先読みして視界を確保するのがゲームのストレスを軽減するオプションになりそうです。

なので球の移動方向へ視点を向けてみます。

まず考えたのがLookAtとComposerのLookaheadTimeを使用して移動先に視点を持っていくアプローチですが、やってみると傾きが簡単に入り若干酔いました。
Horizontal/Vertical Dampingを設定して傾き速度を緩和するのも思いましたが、どちらかと言えばカメラごと移動予測方向へ動かしたほうが良さそうです。

f:id:tsubaki_t1:20180809231721g:plain

なのでBodyのFraming Transposerを指定します。
Framing Transposerは2D用ですが3Dでも使えます。Lookahead Timeを少し高めに設定しておくと、操作対象の移動先が中心になるようにカメラが移動します。

f:id:tsubaki_t1:20180809232903j:plain

f:id:tsubaki_t1:20180809232530g:plain

 

世界の裏側を見せないようにする

Roll A Ballのようにキャラクターを中心位置に置いていると、結構簡単に世界の裏側を見せてしまいます。また世界の端であることが壁以外でアピールされていないため、人によっては壁の向こうになにかあると思って体当たりを繰り返す事があります。私みたいに。

ということで、壁の端に行ったらカメラを止めるようにします。

使用したのはCinemachine Confinerです。
Virtual CameraのAdd Extensionsボタンから追加し、ConfineModeを3Dへ変更、

あとはカメラの動く範囲をColliderで設定するだけです。

f:id:tsubaki_t1:20180809233626j:plain

f:id:tsubaki_t1:20180809233949g:plain

Confinerの設定については下の記事をどうぞ

tsubakit1.hateblo.jp

ゲームの開始時に全体像を見せる

最後にステージの全体像を見せるイントロからシームレスにゲーム画面に移行するやつをやってみます。

f:id:tsubaki_t1:20180809234650g:plain

イントロの部分はTimelineで作ってみます。
まず最初のカメラの動きはすごく単純で、取りたいショットの位置にVirtual Cameraを置いて、後でブレンドしているだけです。

f:id:tsubaki_t1:20180809235031j:plain

ポイントはTimeline最後のクリップでEase Out Durationを少し上げておく事です。
Ease Out Durationに指定した時間で「現在最もプライオリティの高いカメラ(ゲーム用カメラ)へブレンド」を行ってくれます。

f:id:tsubaki_t1:20180809235128j:plain

なお、Timeline用のVirtual CameraはDisableでも動作します。

普通にプライオリティの切替してたら結構面倒なので、ステージ演出用のTImelineは通常DisableにしておきTImelineで制御するのが良さそうです。

f:id:tsubaki_t1:20180809235554j:plain

 

感想

先日Unityわくわくキャンプ というイベントのお手伝いをさせてもらったのですが、Roll A Ball(はじめてのUnity)で「スクリプトもっと減らせないか」という話題が出たので少しやってみました。

正直Cinemachine使ったほうが操作が多くて面倒な感はあるのですが、コッチを基準にしたほうが最終的にちゃんとしたゲームは作りやすくなるんじゃないか感も。

【Unity】GTMF 2018の資料

GTMF2018の資料です。

 

SRPの導入方法とメリット、SRPを利用したトリックについて紹介されています。

www.slideshare.net

ECSとC# Job System、Burstについての説明です。

www.slideshare.net

他にも幾つかのスライドと動画が公開されています。

gtmf.jp