PostProcessingStackで手軽にそれっぽいアブストラクトを作る

# 概要
これを作ります。だいたい所用15分くらいかと思います。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Unityでエフェクトを作っています<br>（リプ扱いになってたので直しました） <a href="https://t.co/G64QIXyC4b">pic.twitter.com/G64QIXyC4b</a></p>&mdash; 吉田/サークル暇乞い (@coldsleep6666) <a href="https://twitter.com/coldsleep6666/status/1104041528731688965?ref_src=twsrc%5Etfw">2019年3月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#環境
Unity 2018.2.5f1

# 作り方
Unityのビルトインで入っているSphereを適当に四角形に配置します。（画像では見やすいよう球のScaleを各軸１にしていますが、０にしてしまった方があとあと見栄えがいいです）
![スクリーンショット 2019-03-16 22.23.22.png](https://qiita-image-store.s3.amazonaws.com/0/196069/33999e3f-a561-daa5-40a9-338a02d63247.png)

CirculerTrailのルートに下記のコードをアタッチして、回転動作を追加します。

```C#
using UnityEngine;

public class Actor : MonoBehaviour 
{
	void Update () {
        transform.Rotate(new Vector3(60*Time.deltaTime, 90*Time.deltaTime, 120*Time.deltaTime));
    }
}
```

続いて、各Cubeが箒星のように尾を引いて運動するようにTrailRendererを設定します。TrailRendererに色彩を設定する際には、Sprite系のシェーダ（Shader/Spritesなど）が設定されたMaterialが必要になりますので、まずこれを作成します。![スクリーンショット 2019-03-16 22.30.42.png](https://qiita-image-store.s3.amazonaws.com/0/196069/64d9b532-72f0-e0fd-41f0-352a9d91a501.png)

各SphereにTrailRendererを追加し、MaterialとColor、Widthの設定を行ないます。
![スクリーンショット 2019-03-16 22.33.36.png](https://qiita-image-store.s3.amazonaws.com/0/196069/cba6124a-94ba-5d65-1473-e8aa58d5e662.png)

ここまでできたらCirculerTrailをPrefab化します。続いて、これらをランダムに配置するコードを作成し、シーン上の適当なオブジェクトにアタッチします。

```C#
using UnityEngine;
using System.Linq;

public class ActorsController : MonoBehaviour 
{
    [SerializeField]
    GameObject actor;
    [SerializeField]
    GameObject actorParent;
    [SerializeField]
    public int actorsNum = 10;
    [SerializeField]
    float angleRangeMax = 180f;
    [SerializeField] 
    float angleRangeMin = -180f;
    [SerializeField] 
    float scaleRangeMax = 1.4f;
    [SerializeField]
    float scaleRangeMin = 0.1f;

    void Start () 
    {
        Enumerable.Range(0,actorsNum)
                  .ToList()
                  .ForEach(obj =>
                  {
                      var temp = Instantiate(this.actor, actorParent.transform, true) as GameObject;
                      SetActorsParameter(temp);
                  });
	}

    private void SetActorsParameter(GameObject actor)
    {
        actor.transform.localScale = Random.Range(scaleRangeMin, scaleRangeMax) * Vector3.one;
        actor.transform.localRotation = Quaternion.Euler(
            Random.Range(angleRangeMin, angleRangeMax),
            Random.Range(angleRangeMin, angleRangeMax),
            Random.Range(angleRangeMin, angleRangeMax));
    }
}
```

シーンに適当にActorのルートとなるオブジェクト（ActorRoot）を配置します。スクリプトには下記のようにオブジェクトをアタッチします。

![スクリーンショット 2019-03-16 22.45.31.png](https://qiita-image-store.s3.amazonaws.com/0/196069/3b8038c8-53fe-9245-c4b7-539cef6d5f00.png)

これで骨格は完成です。再生してみましょう。
![スクリーンショット 2019-03-16 22.47.29.png](https://qiita-image-store.s3.amazonaws.com/0/196069/605824df-93ab-3815-11b0-c28e661f3fc3.png)

これにPostProcessingStackによってエフェクトをかけます。
PPSの導入はテラシュールブログさんの下記の記事に従えば10分もかからずに終わると思います。
http://tsubakit1.hateblo.jp/entry/2018/03/06/224207

PostProcessVolumeにbloomを設定します。

![スクリーンショット 2019-03-16 22.51.40.png](https://qiita-image-store.s3.amazonaws.com/0/196069/29cbe4dc-dbdd-cd38-af2d-a8f3b55cceae.png)


できました。

![スクリーンショット 2019-03-16 22.52.33.png](https://qiita-image-store.s3.amazonaws.com/0/196069/cd29b536-19a1-2820-5b83-116020aed15c.png)

# 応用
記事と同じ考え方で、プレハブを作っておいてランダムに配置→PostProcessingStackという組み合わせで結構色々なアブストラクトが作れます。