【Unity】簡単！エフェクト解説と改変方法！

https://qiita.com/advent-calendar/2021/sumzap

この記事は[サムザップ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/sumzap) 12/13の記事です！
昨日の記事は@shirai_suguruさんによる「[Laravel Octaneの開発時のハマりポイントと回避方法について](https://qiita.com/shirai_suguru/items/ec71a3b852ba7ed65537) 」でした！

# この記事について

この記事では先日公開された[@harumak_11](https://twitter.com/harumak_11)さんのNOVAShaderのサンプルを見ながら、エフェクトの解説と改変を行っていきます。

## NOVAShaderとは

NOVAShaderはサイバーエージェント所属の[@harumak_11](https://twitter.com/harumak_11)さんが作成したUberShader（何にでも使えるシェーダ）です。

https://twitter.com/ca_developers/status/1466693751209078786?s=20

詳細はCA.Unity#3で作者の@harumak_11さんが動画で解説をしております。こちらは後日公開予定となっております。

https://meetup.unity3d.jp/jp/events/1333

## 導入方法

導入方法は非常に簡単です。詳しくはNOVAShaderのReadMeをご確認ください。

https://github.com/CyberAgentGameEntertainment/NovaShader

# 早速サンプルを見てみよう！

ここからはサンプルエフェクトを解説していきながらNOVAShaderの使い方について解説していきます。

## サンプルエフェクト解説

今回は既存の「Sample」フォルダ内にあるエフェクトの解説を行います。
4つのサンプルがありますが、今回は火球エフェクトの「pfb_eff_fireball_alpha」を用います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/ed2dd893-7eb5-3dcc-472f-d10a478be22d.gif" width="50%">

一度このプレハブをシーンに配置し、中身を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/b507e6ca-6956-e9d6-2dfb-9bab33209b83.png)

このエフェクトは5つのパーティクルから構成されて。います。
それぞれ見てみましょう。

### ps_ball

![gif_animation_013.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/bc1645c6-f076-9ab2-02bb-b86da4f13024.gif)

ps_ballは火球本体のエフェクトです。
球体のメッシュに対してシェーダを適応して表現しています。
適応しているシェーダの設定項目はアタッチされているマテリアルから確認できます。
インスペクター下の「Mat_eff_fireball_alpha」マテリアルの矢印（画像参照）をクリックしてマテリアルの詳細を開きましょう。

![materi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/b9194a76-e15e-1c82-6dde-26387d023b85.png)

詳細は[NOVAShaderのReadMe](https://github.com/CyberAgentGameEntertainment/NovaShader/blob/main/README_JA.md)で詳しく解説されているため、ここでは主要な部分だけに絞って記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/87cf9ba2-e4d5-ec7b-3d1d-4001591d4b70.png)

#### BaseMap
このエフェクトの**メインとなるテクスチャ**を指定しています。**Tiling**のXとYを2にしてより密度を濃くしています。

#### TintColor
ここでは**色を設定**しています。試しに**Color**の値を変更してみましょう。例えば緑に変更すると以下の様になります。
（他のエフェクトは非表示にしています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/1d36dfd8-1984-30c2-d6c7-c80077ec35ac.png)

#### Flow Map
ここではテクスチャに合わせてエフェクトを**歪ませることができます**。下に２つのgifを用意してみました。上がFlowMapあり、下が無しのものです。
見ると分かる通り、FlowMapがあるものは歪みが出ていて良く見えます。反対にFlowMapが無いものは変化が少なく、ただ回転しているだけに見えてしまいます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/101a30ef-242d-ae01-f627-64e4e81bab46.gif" width="50%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/529a1f91-448d-55b2-2c30-82b81901495f.gif" width="50%">


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/f30882fa-9b85-42ec-74ae-305c756a290f.png)

#### AlphaTransition
Alpha Transitionは**徐々に消えていく表現**に使用されます。
Fadeモードは徐々に薄くなって消えていくモードで、テクスチャに合わせて透明になる設定です。

#### Transparency
Transparencyは**透明度を調整**することができます。
今回設定されているRimでは、リムの透明度を設定することができます。
下の画像の上がRimあり、下が無しです。
外周の部分が徐々に透明になっているのが分かると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/e241813b-d478-2a5e-d626-07ed6139d3a5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/906e5595-dbf4-a472-1df4-7be4ec33d23f.png)

#### CustomData

今までの解説ではエフェクトの回転については触れていませんでしたが、この球体は回転をしていますね。
この設定はPartycleSystemのCustomDataから設定を行います。
[NOVAShaderのCustomData解説はこちら](https://github.com/CyberAgentGameEntertainment/NovaShader/blob/main/README_JA.md#custom-vertex-streams%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA)。

それではCustomDataを確認してみましょう。
Custom1がBaseMapのスクロールになっており、X,Yで回転速度を決めています。
同様にCustom2がFlowMapのスクロールとなっており、こちらもX,Yで回転速度を決めています。

この設定はそれぞれのMapにあるOffsetCoordsの項目から設定ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/3f36c197-a467-38e2-db39-3fd106f691cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/bc763931-8db4-fb20-324c-94026d0c7995.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/e9f979fc-47ba-be96-6232-34b267876f5f.png)

試しにCustomDataのCustom1のX,Yを0にしてみましょう。
以下のgifの様に回転だけが止まりましたね。（FlowMapの歪みの動きは残っています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/16b4e344-037a-2cef-bfab-d07f8b716674.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/047637d9-6567-3f54-ffc4-96b7c22e2c99.gif" width="50%">

さて、これでps_ballの項目は終わりました。
残りの**ps_ring**、**ps_blackbg**、**ps_tubu**の3項目については上記のps_ballと同様かそれより少ない設定項目となっていますので、省略いたします。
ps_ballの解説を見ながらこの3種の項目を見てもらえれば、内容はわかるかと思います。

**ps_ring**
![gif_animation_014.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/2052fbe0-9058-52f0-1400-6ef7f2802683.gif)
**ps_blackbg**
![gif_animation_015.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/45250600-5199-f7be-cda8-12bac049e170.gif)
**ps_tubu**
![gif_animation_016.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/826ce792-3dd3-66bd-e49c-318457daaa67.gif)

### Point Light
最後の項目はエフェクトではなく、ポイントライトとなっています。
![gif_animation_017.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/4e9be8bc-c3d6-a65b-74af-99f9194babb9.gif)

ライトのカラー(Colorの項目)や光量(Intensityの項目)とうを変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/ddddbf62-051f-0a02-3307-91281f3ff7cf.png)

# 改変をしてみよう！

サンプルの解説が終わったところで、このエフェクトを改変してみましょう。
今回は大きさと色の変更の2種類の改変方法をお伝えします！

## 大きさの変更
エフェクトは普通のオブジェクトの様にScaleからも変更できますが、PayticleSystem内で変更を行えば、範囲内でランダムな大きさにするなどといった調整ができます。
ここでは粒の大きさを変更してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/61d8f89e-fb8c-d2cd-888b-a6f8ba6ca72b.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/291c4e3a-d470-09f8-325f-bb9344347f5a.gif" width="50%">

## 色の変更
ps_ball、ps_ring、ps_tubuの3つのエフェクトのTintColor項目からColorを変更します。今回は緑にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/eb1f8e7f-e56e-9399-ce5f-037cad290062.png)

同様にPointLightのColorも緑に変更しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/b5cd5991-9de7-c3ab-0dab-5bf98efc17f6.png)

上記の変更後のエフェクトは以下の様に緑色をベースとしたものになり、色の変更が出来たことが分かります。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/c08121d6-9119-4909-4ea2-e89f856a1238.gif" width="50%">

# まとめ

この記事では話題のNOVAShaderのサンプルと改変の方法を解説しました。

NOVAShaderを扱えばエフェクトを簡単に自分で作成できるようになると思います。ぜひ試してみてください！

日々の出来事や開発記録をこちらのブログで公開しています。
よろしければご覧になってください！

https://zenn.dev/solarisb2

次回は@s_ebataさんの「[CI初心者がfastlaneでアプリ申請の半自動化を行うまで](https://qiita.com/s_ebata/items/c629e0a5b78382fdd665)」です！

## ライセンス表記

The MIT License (MIT)

Copyright 2021 CyberAgent, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.