Standard Assets / Utilityの中身を探ってみた

# はじめに

Standard AssetsはUnity公式のアセット群であり、チュートリアルから実用的なものまで広くカバーしています。代表的なものはImage EffectやParticle Systemのプリセットでしょうか。インポートしてすぐ使えるというお手軽さが何よりのウリです。

UtilityはそのStandard Assetsの中でひときわ地味な存在といえます。
中身は24のスクリプトであり、それぞれ独立していて、カテゴリーも多岐に渡りますが、とにかく使用者が少ない。というか見たことがない。「そもそもアップーデートしてるの？」という感じなのではないでしょうかね（注：してます）。

というわけでUtilityの全24スクリプトを探ってみました。その中身は10行で終わる簡単なものからキッチリEditor拡張しているものまで様々です。個人的に、特に有用だと思われるものには★を付けてあります。


# Utilityリスト（Unity5.3.5現在）

#### ActivateTrigger
コライダーを持ったオブジェクトにAddすることで、他のオブジェクトが触れた時に特定の処理を実行します。特定の処理とは、アクティブの切り替えやアニメーションの実行、オブジェクトの再インスタンスなど。ヒットした対象のタグや属性を判定することはできません。そういったオプションが必要なら要カスタマイズです。

#### AlphaButtonClickMask ★
Canvs上のオブジェクトは透明部分でもタップ（クリック）できてしまうので、それを解決するためアルファ値が10%未満の場合判定を行わないようにするスクリプト。ボタン自体はもちろん、ボタンの一部を覆うImageにAddすることもできます。正しく使うためには画像のメタ情報をSpliteからAdvancedに切り替え、Read/Wright EnabledをTrueにしてランタイム時にピクセル情報を読み込めるようにしておく必要があります。

![ui.gif](https://qiita-image-store.s3.amazonaws.com/0/12193/730de21c-cdfb-75a3-15e1-1869de69dfb8.gif)


ただし、5.3.5現在、対象となるオブジェクトのPivotが（1, 1）の時のみ正常に動作するという少々残念な仕様となってます。まっとうに使いたければ44行目あたりを以下のように修正しましょう。こうしておけばどのようなPivotでも動作するはず。

```c#:AlphaButtonClickMask.cs

Vector2 normalizedLocal = new Vector2(1.0f + localPoint.x / _image.rectTransform.rect.width, 1.0f + localPoint.y / _image.rectTransform.rect.height);

```
　　↓

```c#:AlphaButtonClickMask.cs

Vector2 pivot = _image.rectTransform.pivot;
Vector2 normalizedLocal = new Vector2(pivot.x + localPoint.x / _image.rectTransform.rect.width, pivot.y + localPoint.y / _image.rectTransform.rect.height);

```

#### AutoMobileShaderSwitch
 モバイル環境でビルドする場合のシェーダーを一括でスイッチします。うっかりして重めのビルトインシェーダを使ってましたってことあるよね。それを防いだりできそうです。

![shader.png](https://qiita-image-store.s3.amazonaws.com/0/12193/b2dc968e-1a08-3011-d34d-e06605f152b1.png)

#### AutoMoveAndRotate
オブジェクトをクルクル回転させたりリニアな移動をさせたりするコンポーネント。
誰もが一度は書くようなやつです。オプションはタイムスケール無視やワールド・ローカル切り替えくらいのシンプルな仕様。

![auto.png](https://qiita-image-store.s3.amazonaws.com/0/12193/77b67543-03c7-784d-0a46-7eaa5618a575.png)

#### CameraRefocus
 カメラが対象オブジェクトの方を向くだけ。パン機能はありません。

#### DragRigidbody ★
オブジェクトをドラッグして引きずり回すようなことができます。ただし、カーソルの移動量とオブジェクトの移動量が一致しないことに注意しましょう。対象となるオブジェクトにはColliderとRigidbodyが必要です。Rigidbodyのコンストレイント設定で挙動が変化するので、例えばポジションをロックすると3Dオブジェクトビューワー的なものを手軽に作れます。

![drag.gif](http://ivoryfunction.com/quiita/drag.gif)

#### DynamicShadowSettings
 ディレクショナルライトの設定をデフォルトとは違ったアプローチでコントロールするためのコンポーネントのようだけど、正直有用度がよく分からないっす。デザイナー向けかな。

#### EventSystemChecker
シーンにEventSystemがない場合、実行時に生成してくれます。それだけ。 

#### FollowTarget
指定オブジェクトの近くに別のオブジェクトを配置するためのコンポーネント。
だいたい親子関係を使えば事足りるけど、Parent変えたくない場合もあるよね。そんな時用です。

![follow.gif](http://ivoryfunction.com/quiita/follow.gif)

#### FOVKick 
カメラのFOV値をアニメーションカーブによりスムーズにコントロールするスクリプト。しかしMonoBehaviour継承ではなく外部からコルーチンで呼び出すような設計のため、Unityのスクリプティングに慣れてないと少々扱いづらいかも。そして慣れてる方はTween系アセットを使った方が柔軟かつ明瞭という気がしないでもない・・・。

#### FPSCounter ★
FPSをUIキャンバスに表示させるためのもの。本当にシンプルなものだがPrefabも用意されていて、ドラッグすればすぐ使える手軽さが素敵。余談だがStatsのFPSを信用してはいけない。あれが指しているのはFPSでなくて謎の何かです。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/12193/1768099a-ac99-f08d-f0b4-2f7a13c34b89.png)

#### LerpControlledBob
float値を変化させるためのスクリプト。これもFOVKick同様に外部からコルーチンで呼び出すような設計であり、ちょっと扱いづらい。そしてやはりTween系アセットを使った方がいいように思います。

#### ObjectResetter
オブジェクトのTransformなどの設定をリセットして初期化するためのスクリプト。 オブジェクトの情報を記録しておき、DelayedReset(t)を呼び出すとt秒後にリセットされる。初期値の記録はStart時のみなので、記録したいタイミングでAddすることを想定しているようです。

#### ParticleSystemDestroyer ★
ParticleSystemが停止するタイミングでオブジェクトごと消してしまうもの。指定時間でエミットを停止し、パーティクル自体が完全になくなったタイミングでDestroyする仕様。サブエミッターなども考慮した作りになっていて、なかなか良いのでは。

![particle.gif](http://ivoryfunction.com/quiita/particle.gif)

#### PlatformSpecificContent
 モバイル環境及びそれ以外を判定して所謂プラットフォーム依存コンパイルをアシストするコンポーネント。カスタマイズ前提という趣であり、多展開を考えるならベースに使ってみようってな感じですね。

#### SimpleActivatorMenu
 配列に入れたカメラのうち一つのみをアクティブとし、NextCamera()を呼ぶとアクティブを切り替えることができます。カメラ切り替え用途ではあるものの、やっていることは極めてシンプルなので、オブジェクトやUIの表示・非表示にも使えます。

![switcher.gif](http://ivoryfunction.com/quiita/switcher.gif)

#### SimpleMouseRotator
マウス座標によりローテーションを変化させ、オブジェクトのアングルを変えます。ボタン押下を問わずマウス座標のみを参照していますが、カーソルのないモバイル環境ではスワイプに置き換わるようになってます。

![simpleRotation.gif](http://ivoryfunction.com/quiita/simpleRotation.gif)

#### SmoothFollow
指定のカメラがオブジェクトを追いかけるようになる。しかしDampingがあるのは縦方向と回転のみという不思議な仕様。特定のゲームを想定しているようですが、それがどんなもの高自分にはちょっと想像しにくいです。

#### TimedObjectActivator
オブジェクトのアクティベートを指定秒後にオンにしたりオフにしたり、あるいはデストロイしたりする管理クラス。オブジェクトごとに配列に登録する形だが、配列内に同一のオブジェクトを指定すれば点滅させたりもできます。

#### TimedObjectDestructor
指定秒後にデストロイするもの。こちらは管理クラスではなく、オブジェクトに直接Addするもので、単に指定秒後に子供ごとDestroyするという超シンプルなものです。

#### WaypointCircuit / WaypointProgressTracker ★
WaypointProgressTrackerはパスに沿ったアニメーションを行うためのもので、WaypointCircuitはそのパス自体を生成するもの。これらはスタンドアロンではなくセットで使うことが前提。他のアセットと比べると少々複雑な構成なのでこちらを参照されたし。

https://gist.github.com/tsubaki/7e22cec8527c534e4c7a