[Unity] 第6回ゲームエフェクトコンテストに参加してみた

## 第6回ゲームエフェクトコンテストとは
![image](https://qiita-image-store.s3.amazonaws.com/0/102664/a1a888d7-c503-9fcc-cb51-4c453d46106b.png)

- https://www.gameeffectcontest.com/
- 2017年2月25日までエントリーを受け付けていたコンテスト
- 第6回からUnity部門も開催したため、乗り込んでみることに
- 賞は取れなかったものの、初めてがっつり演出を作ったので、どういう風に制作したか書いてみることに

## 作ったもの
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/geft6th?src=hash">#geft6th</a> 【作品紹介】025：一般：Unity：テクニカル「聖なる棺」 <a href="https://t.co/MJWeIZYyfE">https://t.co/MJWeIZYyfE</a></p>&mdash; BISHAMON (@bm_package) <a href="https://twitter.com/bm_package/status/833681927169310721">2017年2月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## プロジェクト
- https://github.com/lycoris102/GameEffectContest6

## 実行環境
- Unity5.5.1f1

## 0. 全体の制御
- Animationでのみ制御
- 親となるGamePbjectを作成し、そこにAnimationを追加
- 子要素にパーティクルやカメラを含み、制御させる
  - パーティクルの発火や消滅
  - カメラの移動
  - オブジェクトの回転速度の制御 (publicな変数はAnimationで制御できる)
- AnimationはGameObjectのリネームや移動がしにくいのが難点だった
  - 参照が直ぐに外れてしまう

![image](https://qiita-image-store.s3.amazonaws.com/0/102664/ce56aa68-a576-cea9-881d-81f421dae147.png)

## 1. 箱の出現演出
![effect1.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/35b1a62e-722a-8de9-066e-9e4fdc5d758d.gif)

![image](https://qiita-image-store.s3.amazonaws.com/0/102664/e7768510-be33-f01f-1b9d-cb26f08d7e18.png)

### Ground
- 地面に這うようなエフェクト
- `Shape`モジュールに `Box` を指定し、`BoxZ` の値を0にすることで地面に這わせている
  - `Emit from` を `Edge` にすることで箱形状の縁に沿わせて粒子を出現させている
- Animationによって Color の α を下げることでフェードアウトさせている

### Aura
- 元の素材を `Renderer` モジュールの `RenderMode` を `Stretch Billboard` に指定することで引き伸ばし
- `Start Speed` を設定することで上方に射出

### Cube
- Unity標準機能のプリミティブでCubeを作成
- StanderdShaderのRenderModeをFadeにすることで透過した箱に

### Edge
- 箱を発光させているように表現する目的 + 最終演出用
- `Shape` モジュールに `Box`を指定

## 2. 箱への攻撃
![effect2.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/8a4716a8-32f0-1d7b-4885-d735b068e1cf.gif)

![image](https://qiita-image-store.s3.amazonaws.com/0/102664/a5d3d0e7-347b-4aca-f89f-432dae59e521.png)

### Arrow
- 箱に向かって飛んでいく赤/青の光のパーティクル
- 元の素材を `Rendererモジュール: RenderMode` を Stretch Billboard に指定することで引き伸ばし
- `Emissionモジュール: RateOverTime` をAnimatorで制御することで時間に応じて数を増加
- `Shape` モジュールを `Hemisphere` に設定、 `Emit from Shell` を有効にすることで半円から中心に向かって飛ばすように設定
- `Collision` モジュールにて衝突時にパーティクルを消滅させるように設定
- `SubEmitters` モジュールにて `Collision` (衝突時) 指定することで、Cubeと衝突時に各種破片を出すように設定
- **`Trails` トレイルモジュールはUnity5.5からの新機能**
  - https://blogs.unity3d.com/jp/2016/11/29/unity-5-5-is-ready-for-you/
  - https://docs.unity3d.com/550/Documentation/Manual/PartSysTrailsModule.html
  - パーティクルに追尾するパーティクルを設定可能
  - `Renderer` の `TrailMaterial` にMaterialを指定した上で `Trails` 上で各種設定を行う
  - 試しに使用してみたが残像が残るような演出にでき、見た目が栄えた
  - 左がTrailsが有効 / 右がTrailsが無効な図

![trail_on.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/81450610-c52d-02a3-d11f-276f5355b8a5.gif)  ![trail_off.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/1edef2a4-bff7-8db1-d656-a0ba63c16040.gif)

### Debris
- Arrowが砕けた際に出る破片のパーティクル
- Arrowの `SubEmitters` モジュールにより発生
- `Emmision` モジュールの `RateOverTime` を 0にし、 `Burst` を指定することで、衝突した瞬間にのみエフェクトを発生させる
- またArrow 側の `SubEmitters` モジュールにて `Inhert` をColorに指定することでArrowの色を継承
  - Arrowの破片が発生したように見せる工夫

### Glass
- Arrowにより箱が削れたことで発生するパーティクル
  - 地面に滞在し、発光しているやつ
- Arrowの `SubEmitters` モジュールにより発生
- **`Lights` ライトモジュールはUnity5.5からの新機能**
  - https://blogs.unity3d.com/jp/2016/11/29/unity-5-5-is-ready-for-you/
  - https://docs.unity3d.com/550/Documentation/Manual/PartSysLightsModule.html
  - これにより周囲を照らすような / 発光しているようなパーティクルを実装可能
  - 予めPointLightのPrefabを作っておき、 `Light` に指定することでPointLight側の設定が有効になる
  - 最終的な余韻を強調する役割
  - 左がLightsが有効 / 右がLightsが無効な図 (床に注目)

![light_on.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/cc928f6b-f362-3e41-7e90-01d741cdfd32.gif)  ![light_off.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/b2640d70-2135-7f0c-7654-4eeafa705e1e.gif) 

### Light
- Arrowのヒットエフェクトの役割のパーティクル
- Arrowの `SubEmitters` モジュールにより発生

### Cubeの回転
- シンプルなRotateするScriptを実装
- angleYをAnimationによって制御することで回転速度を変更する

```c#:RotateCube
using UnityEngine;

public class RotateCube : MonoBehaviour
{
    public float angleY;

	void Update ()
	{
	    this.transform.eulerAngles += new Vector3(0, angleY, 0);
	}
}
```

## 3. 箱への集中攻撃
![effect3.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/005a97ec-a444-3445-e33d-add21d26cce8.gif)

![image](https://qiita-image-store.s3.amazonaws.com/0/102664/6b27af0c-e5ec-afee-5307-c8558921b66c.png)

### Arrowの複製
- Arrowと設定は殆ど一緒
- `Emission` モジュールだけ変更し、継続的な出現ではなく、 `Burst` による一括出現に変更
- また `Simulaton Speed` を1から下げることで、スローに見せている
  - [Time.timeScale](https://docs.unity3d.com/jp/540/ScriptReference/Time-timeScale.html) で良かったかも

### MotionBlurの適応
- 衝突タイミングでのみCameraにポストエフェクトである `MotionBlur` を適応してある
  - StandarAssetsから拝借
  - 今であればむしろ [New Post-processing Stack](https://www.assetstore.unity3d.com/en/#!/content/83912) を使うのが良い
  - 動きに対してブラーを適応することでスローな感覚を強調

## 4. 箱の消滅
![effect4.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/c18f1e08-bd04-24fe-e7ca-d1a81f323aa6.gif)

### Cubeの消滅
- Matrialのα値を下げることでじわじわ消滅させる

### Edgeの演出
- Cubeの枠に出現していたEdgeを利用して箱の消滅余韻の演出を作る
- **`Noise` ノイズモジュールもUnity5.5からの新機能**
  - https://blogs.unity3d.com/jp/2016/11/29/unity-5-5-is-ready-for-you/
  - https://docs.unity3d.com/550/Documentation/Manual/PartSysNoiseModule.html
  - パーティクルの動きに乱気流を適応することで、一貫性の無い自然な拡散を行うことが出来る
  - このタイミングでNoiseを有効にし、箱消滅の余韻を残す
- 同時に `Garavity Modifiler` (重力) を僅かにマイナス値指定することで、拡散しながら上方に舞う演出を実装

## その他
- Cameraに対していくつか ImageEffectをアタッチ
  - 光表現を強調するためにアタッチした `Bloom` はともかく、他は冗長だったかも (重くなったかも)
  - 今であればやはり [New Post-processing Stack](https://www.assetstore.unity3d.com/en/#!/content/83912) がパフォーマンス的にも良さそう

![imageeffect.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/fad3f15a-39c6-49df-5872-fde07a65fd67.gif)

## 感想
- [審査コメント](https://www.gameeffectcontest.com/gallary/general/) が丁寧でとても嬉しかった
  - 雑な作りな所(すり抜け)に関しては本当にその通りで、他の作品がどれだけ丁寧に作られているか分かる
  - コンセプトに対して、技術が追いついていないのも非常に分かる...
- Unity部門、どの作品もクオリティ高かった
  - https://www.gameeffectcontest.com/gallary/general/
  - https://www.gameeffectcontest.com/gallary/student/
- 次回機会があればリベンジしたい...!!
- 関係者の皆さん、ありがとうございました！