見出し画像

UnityCreativeCore⑤VFXについて

UnityCreativeCoreを学習しています。
長い戦いですが、今回はVFXについて。

まとめはこちら

VFXとは

VFXは「Visual Effects(ビジュアル・エフェクツ)」の略称です。
このUnityの学習では、以下の二つのツールの使い方を学びます。
・パーティクルシステム
・VFXグラフ

ゲームにおけるVFXには二つの分類があります
・環境エフェクト
 
砂嵐や水面、風や太陽などの環境エフェクト。
・ゲームプレイエフェクト
 
インタラクティブの意識づけを狙うエフェクト。道やアイテムが光ったり、選択しているときに光ったり。

Unity外にもさまざまなツールがあり、それを取り込むことでよりリッチなゲームが作成できる。
Photoshopなどの 2D 画像編集ソフトウェア
Mayaなどの 3D モデリングおよびアニメーション ソフトウェア
Houdiniなど、流体や粒子などの手続き型シミュレーションに特化したソフトウェア

VFXグラフはちょっと難しいが、とても良いのでぜひ使ってください。
とのこと。

サンプルをチェックしよう

たき火が燃えている。もうすごい。

火は VFX アーティストにとって非常に一般的なエフェクトなので、始めるのに最適です。

CreativeCore

そうですね、炎のひとつも作れなければ、Unity使えるとは言えまい。そんなことはないか。

ヒエラルキーで、たき火の子をクリックするとパーティクルシステムが入っている
Prefabになっているのだ


パーティクルエフェクトメニューが、大きな開発の助けになる
一時停止して拡大すると・・・炎の秘密は僕たちファイヤーマテリアル!

じゃあこれで作ってね、と言われて作れるようなものではないだろう・・・けど、作れるんですね!続きが楽しみです。

火花を散らそう

では、炎の中に火花が飛んでいるエフェクトを、その中にすでに作っているので、活性していきましょう。

非アクティブなVFX_Sparks

インスペクターでポチっとするだけですよね

ポチリ

だけでは炎は出ない。「再起動」も押下するのだ

アクティブに変えたら再起動が大切です。変更内容を確認する際にも再起動を押しましょう。
火花飛んでるぅ!けどなんかホコリっぽいね

パーティクルシステムを変更するには、そのモジュールを有効にしている必要があります
VFX_Sparksを変更しますが・・・インスペクターで現在有効になっているモジュールは[Emission][Shape][Renderer]のみですね。

日本語でEmissionは放出なのか?

Emissionというのは光を発することと、放出という意味もある
ニュアンスは色々あるかもしれませんが、和訳で[放出]とあるのが嫌ならば、環境の文字を英語に戻しましょう。
編集→環境設定→言語で、変更することができます。
学習の理解速度のために日本語メニューにしていますが、英語に慣れている方は英語のままの方が良いのでしょう。

時間の経過とともに火花の色を変化させるには、Color over Lifetimeモジュールを有効にして展開します

時間の経過とともに火花のサイズを変更するには、Size over Lifetimeモジュールを有効にして拡張します。

火花が上向きに浮き上がりながらランダムに揺れるようにするには、ノイズモジュールを有効にします。

モジュールを有効または無効にしてその効果を確認しましょう。
Emission モジュールのRate Over Timeプロパティを増減します。
Color over Lifetime モジュールでColorプロパティを編集する

いろいろと、変更を試してみたいけど、壊したらいけませんね。
なので、ヒエラルキー内でコピーして、わかりやすい名前をつけ、編集中以外のものは非アクティブにする。そういったかたちで、別の表現の炎を作っていきましょう。

おおもとから、コピーしておかないとね

さまざまな炎を作ろう


パラメータ変更するだけでさまざまな炎に変更できるのだ

炎表現をシェーダーでやるのか、パーティクルでやるのかは、ゲームによるのでしょう。

環境を変えよう、雪を降らせよう

では雪を降らせます。

ヒエラルキーで右クリックし、 >エフェクト>パーティクル システムを選択します。

名前を適当に変えます

FXはエフェクトの略称です。他によく目にする略語としては、Special Effects の略である SFX があります。取り組んでいる業界やプロジェクトの種類によっては、これらの名前のいずれかが他の名前よりもよく見られる場合があります。一般に、オブジェクトの名前で、それが実際にはパーティクル エフェクトであることを明確にすることをお勧めします。

雨や雪は上から下に降るので、PositionとRotationをかえましょう。
Position  X=0、Y=10、Z=0
Rotation X=90、Y=0、Z=0

なんか降ってきた! ポジションはカメラの画角にあわせた感じですね。

カメラに対してこんな感じです

メインモジュールを見てみましょう

この項目を見落としがちです。

見落としがちですが、チェックボックスによって有無を切り替えたりできない、必須項目の設定をここで行います。

パーティクルのサイズを変更するには、小さな雨滴や雪片の場合、メイン モジュールの[開始サイズ]プロパティを 0.1 に下げます。

必要に応じて時間の経過とともにサイズを変更できるため、単に「サイズ」ではなく「開始サイズ」と呼ばれます。

開始サイズ1の左と、開始サイズ0.1の右。ステキ!雪ですね!

でも雪にしては速い。雨にしてはおっそい。
[開始速度]プロパティを 、雪なら5 から約 1 に減らし、
雨の場合は約 10 に増やします。

円錐のサイズが変わった。雨は突き抜けて生き続け、雪は下まで届かない。

この問題に対処するには、パーティクルの寿命を変更する必要があります。

[開始時の生存期間][Start Lifetime]プロパティを 5 秒から、パーティクルがカメラの視野内を移動するのにかかる時間まで増減します。粒子は地面まで到達するはずですが、それより遠くには到達しません。
雨なら1.5ほどに、雪なら13ほどに。

しかしですよ、開始時に雪が降るんでなく、開始時にはすでに降っててほしいんですよ。

そういうときは[prewarm][事前準備]をチェックしておきましょう。

再生時にはすでに降っているところから始まります

では最後に[Emission]と[Shape]。これがデフォルトで有効になっているので作業しましょう。デフォルトではこれにレンダラーが有効です。
日本語画面なら[放出]と[形状]です
Emissionモジュールは、エミッターから出てくるパーティクルの数を決定します。
Shapeモジュールは、エミッターのジオメトリとボリュームを決定します。

エミッターとは、パーティクル発生マシンのことのようだ
エミッターのジオメトリをboxにした図

Shapeモジュールではボックス全体の外側のシェルだけ、またはEdgeだけから放出するという設定もできます。今回はやりません。

Shape のScaleプロパティを X = 10、Y = 10、Z = 1 に変更してボックスを大きくすると、自然に、広い範囲で降ります。

しかし物足りない

しかし、風雪の勢いが減りました。密度を上げましょう。
Emissionモジュールを展開し、生成しようとしている天候効果の強さに応じて、
Rate over Timeプロパティを 10 から 1 秒あたり 150 ~ 1000 個のパーティクルの数まで増やします。

時間ごとの率。ともいう


めっちゃ降る!
ゲーム画面では自然!

なるほどなあ。

パーティクル数が限界を超えると生成が中断されるタイミングがある

え、限界なんて不要です。私はもっと雪を降らせたいのです。
メイン モジュールで、[Max Particles]プロパティを 1,000 から 10,000 に増やします。

メインモジュールに入っている
ドカ雪
ドカ雪。ドリフか


最大10万パーティクルにしても、9万あたりで断絶が始まる
断絶された雪
ちなみにゴジラ-1.0の水表現のパーティクルは2億だそうだ。

こういった知識も大切ですよね。
しかしUnityは言います。

この時点で、世界がこれまで見た中で最もクレイジーな気象現象を作り出すために、放出レート最大パーティクルの制限を 1,000,000 まで上げたくなるでしょう。その誘惑に抵抗してください! VFX アーティストの仕事の大部分は、エフェクトが最適化されていることを確認することであり、非常に多くのパーティクルを追加すると、アプリのパフォーマンスが低下する可能性があります。

CreativeCore

そう。目的を見失ってはならないのである。

雨や雪をキレイに[Renderer]

現状は雪といえどもただのホワホワ。雪と言うのは結晶であるし、雨というのは雫なのだ。
Rendereをひらきましょう

Materialが用意されているので、雨にも雪にもMaterialを当てましょう

マテリアルを変える
マテリアルのベースマップには背景透明な雫。これでなければ四角くなる
スクショも雨のようになる。断然いい
雪の場合はうるさくなるので、適切に変えましょう。

プレハブ化

作った天候はプレハブに。この手法はよく使います。

プレハブバリアントの機能を使って、様々な天候に変化できます

変更したものをプレハブ化しようとすると表示が現れる
右クリックプレハブの「すべてを展開」したうえで、名前を変えて、別のプレハブにすることもできる。

好きな方を使いましょう。

ユーザー操作で現れるバーストパーティクル

新しいパーティクルを右クリックから作成し、名前を
[FX_SmokeBurst]にするのだ。
位置を変更:X=0,Y=0.5,Z=0
回転を変更:X=-90,Y=0,Z=0

このあたりを最初にやると作業しやすいのだ。

ループのチェックを外すと


パーティクルは一周だけやって消えるのだ

Duration(持続時間)を低くして(0.05くらい)
Rate over Time(時間ごとの率)を多くするのだ。(1000)くらい

モワワっと飛び出る
Emission(放出)の、Burstの行を追加することで
決められた時間でスパっと出る…違いはある気がする

0 秒 ( Time ) で、バーストは100% の確率 ( Probability ) で 30 個のパーティクル ( Count ) を 1 回 ( Cycles )出したいと、設定していた。(これがデフォルト)

バースト サイクルが 1 つしかないため、Interval 値は無関係です

煙なので、ゆっくり立ち上るように
[開始速度]プロパティを約 0.3 秒に下げます。

じっくり立ち上るが、しつこい。

メイン モジュールで、バーストを持続させたい時間に応じて、
Start Lifetime[開始時の生存時間]を約 1.0 秒の値に減らします。

しかし、円状に上がるのも変(こういう表現が必要なこともあるが)
なので、Shape(形状)のエミッタ形状をCone (円錐)からSphere(スフィア)に変更・・・Radius(半径)を約 0.5 の値に変更します

ボワっと出るぞ

いいけど、いいけどこんなに、均一に消えますかね?ランダムに消えたらいいじゃないですか?

Start LifeTime(開始時間)の右側三角形で、二つの値間でランダムを選ぶ
パラパラと消えるようになる 

より自然なランダム性をシミュレートするには、Start Speed [開始時の速度]などの他の値に対してこのプロセスを繰り返すことができます。

色を変えましょう

Color over Lifetime[開始時の色]プロパティの作業をします
前回もこの色編集ツールが出ましたがスルーされていたのでありがたいですね。Gradient Editorウィンドウです。

グラデーションを選ぶと
こんなエディタが。

この水平バーは、バーの左側から始まり右側で終わる、パーティクルの存続期間中の色と透明度のレベルを表します。したがって、デフォルトでは、パーティクルはその存続期間全体にわたって白く不透明になります。このグラデーション エディタを使用すると、以下の例のように、青とオレンジにフェードインしたりフェードアウトしたりする、無制限の色と不透明度の状態を介してパーティクルを遷移させることができます。

CreativeCore

水平バーの上のマーカーのセットは時間の経過に伴う透明度を指定し、カラー バーの下のマーカーのセットは色を指定するため、透明度と色を個別に制御できます。

現時点では、パーティクルがその開始時にフェードインし、最後にフェードアウトするようにしたいだけです。

CreativeCore

パーティクルをフェードインするには、左上のマーカーを選択し、アルファ値 (不透明度) を 0 まで下までドラッグします。

この状態でパーティクル再起動をしても、煙はパッと消える。

スっとフェードイン、ゆっくりフェードアウトなので以下の状態にしよう

そんなフェードアウトというわけでもないがまあわかる。

パーティクルはそんなもんで、煙にテクスチャをつけましょう。

テクスチャシートを使う!

テクスチャ シートを使用して、パラパラマンガを作れますが、今回はランダムに起用します。
4つのテクスチャが一緒になっているマテリアルをそのままあてて実行すると

煙は4倍!まあこれでもいいけど意図したものではナイ

この問題を解決するには、テクスチャ シート アニメーションモジュールを有効にする必要があります。
X =2 Y = 2にしましょう

モジュールが多すぎる(涙)

再生してみると、1枚だけが出る

その絵は同じ開始絵からパラパラと切り替わっている

順に出すのも悪くないが、Start Frame[開始フレーム][2 つの定数の間でランダム]に変更し、開始フレームと終了フレームをそれぞれ 0 と 3 に設定します。これにより、0、1、2、3 の番号が付けられた開始フレームがランダムに選択されます。

より良い

さらに、今回はパラパラ漫画ではないのでサイクル0にします。

0.0001と入るが、0と同義である
煙そのものはパラパラ漫画ではない!

パーティクルのサイズを変更していこう

パーティクルが出現するとサイズが大きくなり、消えると縮小します。これにより、より爆発的でダイナミックな印象になります。

なるほど、さっそくやっていきましょう。
生存期間のサイズ[Size Over Lifetime] モジュールを有効にし、それを選択して展開します。[サイズ]プロパティのドロップダウンで、 [カーブ]が選択されていることがわかります。

これがデフォルト

パーティクルシステムカーブのグラフでは、時間 (0 ~ 1) が下の X 軸に沿って示され、サイズ (0 ~ 1) が左の Y 軸に沿って示されます。
表示されていない方は、下の方にありますので。

水平軸が時間で、垂直軸がサイズです

これで、だんだん大きくなって消える。
下部のサンプル曲線を使って、自在に変更
煙っぽさもひとしおだが

終端ハンドルをいじって。こんなカーブにする。バッフンときえる。

トリガーを作る

現状では、開始と同時に煙も出る。

モークバーストのメインモジュールで
[Play on Awake][ゲーム開始時に再生]を無効にしておき、実行を待ちます。

おや?今は効かないのか?

どこで変更できるんだろう?困りましたね。

困ったら右クリック(インターネッツ老人会)

プレハブに適用、親のオーバーライドに適用などをためす
各自に適用する方を選ぶことで、別々に実行できる。

無事にできました。

起動時には煙がナイ!

ではスクリプトを、どこか編集しやすいところにアタッチして・・・

親にアタッチしてもいいだろうが、Fire_ParticleSystem_Prefabにアタッチしてと言われた

素直に言われたようにやろう。

Publicのプロパティにもヒエラルキーからアタッチ
スペースキーで火が消えるぅ!

スクリプト内容は以下

public class ToggleFireParticle : MonoBehaviour
{
    //キーはインスペクタで変更できるようにしたいが、デフォルトはSpace
    //これは良いプラクティスです
    public KeyCode toggleKey = KeyCode.Space;

    private ParticleSystem fireParticle;//使用コンポーネントの宣言
    public ParticleSystem igniteParticle;//炎パーティクル
    public ParticleSystem extinguishParticle;//消火パーティクル
    public GameObject pointLight;//ライト

    bool isPlaying = true;//炎がついているかどうか

    private void Start()
    {
        fireParticle = GetComponent<ParticleSystem>();
    }

    void Update()
    {
        if (Input.GetKeyDown(toggleKey))
        {
            if(isPlaying)
            {
                //particleに対しては、Stop Playのメソッドで停止再生させる。
                fireParticle.Stop();
                pointLight.SetActive(false);
                if (extinguishParticle != null)
                    extinguishParticle.Play();
                isPlaying = false;
            } 
            else
            {
                fireParticle.Play();
                pointLight.SetActive(true);
                if (igniteParticle != null)
                    igniteParticle.Play();
                isPlaying = true;
            }
        }
    }
}

サブエミッター

パーティクル内にさらにパーティクルを入れる

サブエミッターをトリガーするには、次の条件を使用できます。

  • Birth(発生): パーティクルが作成されたとき。

  • Collision(衝突): パーティクルがオブジェクトと衝突するとき。

  • Death(消滅): パーティクルが破壊されたとき。

  • Trigger(トリガー): パーティクルがトリガーコライダーと相互作用するとき。

  • Manual(手動): スクリプトを通してリクエストされたときのみ送信されます

子でなければダメらしい

しかし、思うようには、なかなか出ないものです。試行錯誤が必要ですね。

VFXグラフを使用する

VFX グラフは、ユーザーが高度に最適化された信じられないほど複雑なエフェクトやシミュレーションを作成できる強力な機能です。

CreativeCore

張り切っていきましょう

VFX グラフの利点

  • VFX グラフは数百万のパーティクルを同時に処理できますが、パーティクル システムは数千しか処理できません。

  • VFX グラフは、下に示す魔神のような、パーティクル システムを使用した場合には実現不可能な、より複雑なシミュレーションを生成できます。

VFX Graphを使用すれば可能なのだ

VFXグラフの欠点

  • VFX グラフは、パーティクル システムよりも初心者にとって学ぶのが少し難しいです。

  • VFX グラフにはパーティクル システムよりも厳しいハードウェア要件があるため、特定のターゲット デバイスでは正常に実行できません。

  • VFX Graph は GPU で実行され、Unity の物理計算は CPU で実行されるため、VFX Graph パ​​ーティクルはアプリの残りの物理演算と相互作用することができません (地面との衝突など)。パーティクル システムは CPU 上で実行されるため、他の物理ベースのコンポーネントと対話できます。

つまり、シェーダーグラフと違って、必ずしもVFX Graphが上位であるとばかりもいえない。

では、VFX グラフとパーティクル システムのどちらを使用するかをどのように選択すればよいでしょうか?

  • かなり経験があり、非常に複雑なものや数百万のパーティクルを必要とするものを作成したい場合は、VFX グラフを使用するとよいでしょう。

  • 専門家ではなく、単純なもの、すべてのデバイスで実行できるもの、またはシーン内の他の物理ベースのオブジェクトと相互作用できるものを作成したい場合は、パーティクル システムを使用します。

例えば、シーンに降る雨などは、物理演算不要なので、VFXグラフでより良いものを作った方がよいといえそうです。

ふたたび天候を操作しましょう

天候サンプルがあるのでPrefabをゲームシーンに
良い感じに雨が降っている。

サンプルでもらった有用なアセットは手元にも残しておくべきだろう。アセットの管理方法も検討を始めるべきだ。

インスペクターから、さっそく編集[edit]してみましょう

編集画面ですので、レイアウトを調整しましょう。

こんなレイアウトがおすすめのようです

プロジェクトウィンドウのアイコンは、Ctrl+マウスホイールでサイズを変えられます。

ファイル名が見やすいですね

レイアウトに満足したら、レイアウトを保存しておきましょう。

自由に名前をつけられる

画面の操作はシェーダーグラフと似ています。迷子になったら
Aキーでwindowにあわせる。全体を表示してくれます。

デフォルトの4つのノードは「コンテキストノード」です。

うーん項目多いなあ~

上からいきましょう一番上はスポーンコンテキスト。
ノードを選択してFキーを押すと、見やすくアップに。

パーティクルの発生をつかさどる。

Spaceキーでノードの追加を行い、Rateの変更を入力することもできる。

デフォルトでは、新しいVFX Graphは一定のスポーン率を使用しますが、煙のバーストエフェクトと同様に、変数、周期的、またはパーティクルのバーストを設定することができます。"Rate"プロパティを調整して、VFX Graph版のエフェクトが元のパーティクルシステムのエフェクトと一致するようにします。スポーン率を非常に高い値に増やしても、フレームレートにほとんど影響がありません。

言っている意味がよくわからないが、デフォルトでは一定の周期でスポーンするようになっている。とだけわかっていればいいだろうか

次はInitialize Particleのコンテキスト

Initialize Particle コンテキストは、パーティクルが最初に表示される場所と方法を制御します。これには、パーティクルの初期サイズ、形状、速度、寿命、最大容量など、パーティクル システムのメイン モジュールと同じプロパティの多くが含まれます。これには、パーティクルが生成されるボリュームを定義するShapeモジュールと同等の機能も含まれています。

Update Particleのコンテキスト

パーティクルが生成された瞬間から消滅(消滅)する瞬間までのパーティクルへの変更を制御します。これによりパーティクルが更新され、各フレームが実行されます。これには、パーティクル システムのカラー オーバー ライフタイム、サイズ オーバー ライフタイム、ノイズ (VFX グラフでは乱流と呼ばれます)、およびテクスチャ シート アニメーション (VFX グラフではフリップブック プレーヤーと呼ばれます) に似たプロパティが含まれます。

これらの動作はそれぞれ、コンテキスト内の新しいブロックとして追加できます。たとえば、上のスクリーンショットでは、Turbulence(乱気流のこと)はブロックです。

ブロックを追加してみましょう。フィールドで右クリックすると、ノードの作成。日本語化していても、こういった中身は英語のままなのだ。がんばれ!

フィールドで右クリックだとCreateNode
コンテキスト上で右クリックするとCreate Blockができる
さまざまなブロック・・・

attribute 属性
Collision 衝突
FlipBook パラパラ漫画
Force 力
Implicit 暗黙
Kill 殺す
Orientation オリエンテーション
Empty Subgraph Block (空のサブブロック)

中身も多すぎて手に負えないですね。困ったな。がんばって読みましょう。

Output Particle コンテキスト

出力パーティクルの設定。
レンダラーモジュールとよく似た、各パーティクルの外観を制御します。
ここで、マテリアルを割り当てるなど行います。

パーティクルシステムで実現したものと同等、あるいはそれよりリッチな天候ができたことでしょう。

と、CreativeCoreは言いますが、どうでしょうか。

最初からVFXグラフを作りましょう

プロジェクトウィンドウで右クリック

VisualEffect Graphを選ぶ


新しいVFXGraphファイルができる
モコモコ出るのは、XYZ 軸インジケーターを備えた非常に便利な円

ダブルクリックして、デフォルトのVFXGraphを開き、いろいろと触ってみましょう。
と、CreativeCoreは言うが、velocityの項目だけでも頭をかかえますね。
別の参考資料が必要そうです。こんなの簡単だ?あなたは天才です。

SetAngularVelocityを入れてみましょう

とりあえずこれだけでも使えれば。

角度速度を入れていない左と、入れている右。回りますね

パーティクルシステムのフワフワではこれは確かにできなかったかもしれない。

上級者のテクニックを学ぶ

パッケージマネージャから
Visual Effect Graphの[サンプル]を[インポート]することができるようです

入れてみました

BonFireのVFXGraphを開きましょう

これらは、炎、煙、火花、という3つのサブグラフで構成されています

よく見れば、コンテキストの要素をきちんと1ノードにあつめている・・・

また、これらの VFX グラフが、メイン コンテキストに接続された小さなノードであるOperatorを利用していることもわかります。

子ノードがたくさんついている、ここではオペレータと言う。。。

そういったかたちで、多くのサンプルを見ていきましょう。

Spaceshipのデモを見るのも良いようです。

サンプルリポジトリも有用です。


こういったかたちで、VFX Graphを、できるだけ、積極的に、使うと良いですよね。

次回もがんばりましょう。

まとめに戻る

この記事が気に入ったらサポートをしてみませんか?