Unity2018のPreset機能とStreamDeckを使用してパーティクルを簡単に作成してみる

# **Unity2018のPreset機能とStreamDeckを使用してパーティクルを簡単に作成してみる**
Unity2018から搭載された新機能**「Preset」**とYoutuber御用達（らしい？）LCDショートカットキーボード**「Elgato Stream Deck」**を使って、
プリセットとして登録したパーティクルをボタン一個で簡単作成してみる。

# **環境**
Unity2018.1.0b4
Elgato Stream Deck（キー設定ツールはWin10以降が必須）

# **Stream Deckって何？**
動画配信者向けのショートカットキーボード製品。

- **カスタム可能な 15個のLCDキー！**:hugging:
- ボタンにフォルダの機能を持たせられるので階層化してかなりの数のホットキーを割り振り可能
- OBS Studio、Twitchなどの配信向けソフトウェアのショートカットをあらかじめ用意（使わないけど）
- マクロは使えないけど**AutoHotKey**と連携すれば問題ナシ！

レビュー動画とかをみてもらったほうが分かりやすいかと。
[Elgato Stream Deck Full Review!](https://www.youtube.com/watch?v=7p8Rc1uTmHY)

# **「Preset」機能って？**
分かりやすく解説されてる記事がありましたのでこちらをご参考に。
[[Unity] Unity2018の新機能Presetを使ってみた](https://qiita.com/lycoris102/items/c8cc64e2ccbcbf533fa8)

# **手順**
# 1: Particleを作成してPreset作成
まずParticleを作成して適当にパラメータを調整。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr"><a href="https://t.co/vLRrKon0Kc">pic.twitter.com/vLRrKon0Kc</a></p>&mdash; AKI(Flypot代表) (@frontakk) <a href="https://twitter.com/frontakk/status/981129682157387778?ref_src=twsrc%5Etfw">2018年4月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

旋回しながら上昇していくパーティクルを作成。
次にこれをプリセットとして保存します。（ここではorbital01という名前で保存しています）

![01.png](https://qiita-image-store.s3.amazonaws.com/0/246816/2d21cca3-db46-a9df-3688-bbda7585f394.png)

# 2: エディタ拡張でParticleのPresetを呼ぶ
「ホットキーを押すとParticleを新規作成してPreset (orbital01.preset) を適用する」というエディタ拡張を書きます。

```c#:ParticleCreator.cs
using UnityEngine;
using UnityEditor;
using UnityEditor.Presets;

public static class ParticleCreator {    

    [MenuItem("Window/FT/Preset/orbital01 #&%g")]
    private static void Orbital01()
    {        
        //新規オブジェクト作成、Particleコンポーネント追加
        GameObject obj = new GameObject();
        obj.AddComponent<ParticleSystem>();
        obj.transform.Rotate(new Vector3(-90, 0, 0));
        
        //マテリアル追加
        ParticleSystemRenderer psr = obj.GetComponent<ParticleSystemRenderer>();
        Material mat = (Material)AssetDatabase.LoadAssetAtPath("Assets/MyTool/Data/temp_mat.mat", typeof(Material));
        psr.material = mat;
        ParticleSystem ps = obj.GetComponent<ParticleSystem>();
        
        //PresetをParticleコンポーネントに適用
        Preset preset = (Preset)AssetDatabase.LoadAssetAtPath("Assets/MyTool/Preset/orbital01.preset",typeof(Preset));
        preset.ApplyTo(ps);       
    }
}

```

こんなかんじ。例ではホットキーをCtrl+Shift+Alt+Gに設定しています。
フォルダ構成は下記のようなかんじになっており、Editorフォルダ直下にエディタ拡張のスクリプトを
配置しております。

![Image 132.png](https://qiita-image-store.s3.amazonaws.com/0/246816/5cf49658-4a96-3e13-b551-ee5ea44c821f.png)


# 3: ホットキーとアイコンをStreamDeckに設定
StreamDeckの設定ツールを使って先ほど書いたホットキーをStreamDeckのボタンに設定します。
ボタンのアイコンもパーティクルに変更しておきます。（変更したけど見づらいですね・・・。）

![02.png](https://qiita-image-store.s3.amazonaws.com/0/246816/d411a8f3-0394-f196-f850-eb1fc3ee53b9.png)


# 4: 実行！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">UnityとStreamDeck連携。ボタンを押すとあらかじめ用意しておいたプリセットを適用して新規にパーティクルを作成する。 <a href="https://t.co/jW6A9tP0GF">pic.twitter.com/jW6A9tP0GF</a></p>&mdash; AKI(Flypot代表) (@frontakk) <a href="https://twitter.com/frontakk/status/981692634002436102?ref_src=twsrc%5Etfw">2018年4月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

うまくいくとこんなかんじ。
動画では１～３の手順を繰り返して複数のプリセットを登録してます。
ボタンのアイコン画像にGIFアニメーション使えると最高なんだけどなあ。

# ちなみに

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">画面小さくて分かりづらいですがStreamDeckからボタンでHoudiniのノードを作成。これは最強左手デバイスかもしれない・・・。 <a href="https://t.co/BhLMPnFc6Q">pic.twitter.com/BhLMPnFc6Q</a></p>&mdash; AKI(Flypot代表) (@frontakk) <a href="https://twitter.com/frontakk/status/981177035618902017?ref_src=twsrc%5Etfw">2018年4月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

AutoHotKeyと組み合わせるとHoudiniのノードも呼べます。
例えば、「Tabキーを押してtransと入力した後Enterキー２回」（transformノード作成）を
Ctrl+Alt+Shift+Tで実行。みたいな命令をAutoHotKeyで作って、同じ手順で
StreamDeckにホットキー登録すると動作します。可能性無限大:thumbsup: