「#unitytips Dev Takeover」は、@unitygames の Twitter アカウントで連載しているシリーズです。Unity チームがコミュニティの優れたユーザーを招き、その知見やヒントやコツを、フォロワーと共に直接聞く機会を作っています。はじめてのゲストには、Jumpship Studio のテクニカルアーティストにして、驚異的な腕前を持つビジュアルエフェクトの達人、Harry Alisavakis 氏をお招きしました。
Harry のことを知らないという方は、シェーダーの話になるといつでもどこでも飛んでくる彼のネオングリーンのアバターの人だと覚えておきましょう。Harry がビジュアルエフェクトの世界のスターになるまでの歩みを簡単にご紹介します。
彼は現在、Jumpship で開発中のゲーム『Somerville』のテクニカルアーティストとして働いており、「余暇」の時間をビジュアルエフェクトとシェーダーを学ぶために費やしています。実際、彼は「Technically Art」と名付けた、彼のゲーム開発にまつわる成果物を披露するツイートを毎週発信することで他のクリエイターに刺激を与えています。また彼の Twitter では、他の才能あるアーティストの作品を紹介することもあります(実際に彼をフォローして確かめてみましょう)。また、彼が関わっている Discord チャンネル「Technically Speaking」では、テクニカルアートや Unity のクリエイティブなチャレンジの話題を扱ったり、質疑応答の時間をとって出来るだけ多くのユーザーからの質問に答えたりするチャットを主催しています。彼の連絡先やソーシャルメディアアカウントはこちらにまとまっています。
下の画像は Harry の最近の作品の一部を示したものです。彼のポートフォリオでさらに他の作品も見ることができます。
ここからは、Harry Alisavakis 氏提供の #unitytips を見てみましょう。
ちょっとしたビジュアルエフェクトの魔法を試してみるところからスタートです。パーティクルシステムのエフェクト同士のタイミング調整はちょっと厄介なことになりがちですが、実はタイムラインを使うことでビジュアルエフェクトの繰り返しの調整も簡単に行うことができます。
Unity では、タイムラインにパーティクルシステムのサポートが組み込まれているので、カスタムのスクリプティングを行う必要はまったくありません。パーティクルシステムを所定の位置にドラッグアンドドロップするだけで、パン操作することが可能になります。
これらのトラックをアニメーションのタイムラインなどと組み合わせることで、各アニメーション要素の全部をどのように同期させればいいかの見通しがはるかに良くなり、本当に充実したビジュアルエフェクトを作ることができます。
パーティクルシステムやカスタムシェーダーを使う時に、もっと費用対効果をよくするためのとても面白い方法があります。それはカスタム頂点ストリームを使って実現できます。
ここでちょっと時間をかけてこれらがどういうものかを完全に理解し、もっと高度なパーティクルエフェクトを作るためにどう使うことができるかを考えてみてください。
ご存じのように、Unity でレンダーされたモデルは頂点で構成される三角形で出来ています。頂点には、それぞれの頂点の位置、UV 座標、頂点色など、これらのモデルに関する必要な情報がすべて格納されています。
頂点には種類を問わず、任意のデータを追加することができ、追加したデータは好きなようにカスタムシェーダーで使うことができるという面白い性質があります。パーティクルシステムにおけるカスタム頂点ストリームの良いところは、パーティクルに関係する情報を頂点に渡すことができ、それを必要な時にだけ利用できるという点です。
カスタム頂点ストリームを追加するためのオプションは、パーティクルシステムの Renderer モジュールの下にあります。これを有効にすることで、UV 座標や頂点色のように、使用中の頂点ストリームがすべて表示されます。
最後に、シェーダーグラフを使ってパーティクルシステムで動くシンプルなディゾルブシェーダーを作ってみましょう。ここでは、unlit で両面ポリゴンの、アルファクリッピング付きのユニバーサルレンダーパイプライン(URP)シェーダーを例にとります。ここで興味を引くのは、ディゾルブエフェクトを駆動しているもの、UV の 3 つ目のコンポーネントです。
私たちは普段、テクスチャサンプリングに使う UV 座標は x コンポーネントと y コンポーネントで扱うので、不思議に思われるかもしれません。
さて、各ストリームの名前の隣に、どこにデータが格納されるのかが表示されています。
新しいストリームは TEXCOORD0.z に格納されています。これは、最初のテクスチャ座標チャンネルの 3 つ目のコンポーネント(UV0.z)に対応しています。この値は 0 から始まって、パーティクルの生存時間に対する、パーティクルが発生してからの時間が占めるパーセンテージを加算しつつ、1 に近づいていきます。
私たちのシェーダーでは、この値を使ってパーティクルが時間経過と共に薄くなっていく効果を実現します。パーティクルシステムにシェーダーを適用すると、下の画像のような整った結果が得られます。
ここまでは良しとして、パーティクルの生存時間をもっときめ細やかに制御したいと思った場合はどうすればよいのでしょうか。経過時間のパーセンテージの値を使って上の結果を得ることができましたが、あまりにも線形で、もっと複雑なエフェクトを作りたい場合はそれほど便利ではありません。Custom Data モジュールを使うと、この問題を解決できます。
経過時間のパーセンテージの代わりに Custom1.x を使うと、パーティクルの生存時間にわたって値を変える曲線を使うことができます。これは Size over Lifetime のようなビルトインの曲線に似た働きをします。
これで時間経過によるパーティクルの薄まり方をもっといい感じにすることができました。いかがでしょうか。
もちろん、カスタムの頂点ストリームに渡せるデータは他にいくらでもあります。皆さんのカスタムシェーダーでそれらを使うことについての可能性は大きく広がっています。
皆さんのカスタム頂点ストリームのためのデータの創造的な使い方をぜひコメント欄まで書き込んでいただければと思います。
ビジュアルエフェクト作りを楽しみましょう!
Unity for Games の Twitter をフォローして、毎週火曜日の #unitytips や、月 1 回の Dev Takeover をお楽しみください。また、コメント欄で、今後の Dev Takeover で取り上げてほしい人を教えてください。