484 Views
November 11, 24
スライド概要
エフェクト制作に伴って増え続けるマテリアル。その辛い大量のマテリアル管理コストを軽減するために今回作成したマテリアルをアセットとして持たないエフェクトの制作環境についてお話します。
登壇者 : 山本 真史 / 株式会社ディー・エヌ・エー
---------
Unity エフェクト完全に理解した 勉強会
https://unity-fully-understood.connpass.com/event/333372/
動画アーカイブ : https://www.youtube.com/watch?v=Xebk2JFh3NM
DeNA が社会の技術向上に貢献するため、業務で得た知見を積極的に外部に発信する、DeNA 公式のアカウントです。DeNA エンジニアの登壇資料をお届けします。
マテリアルアセットレスな エフェクト制作環境を目指して 山本真史 (aporo) 株式会社ディー・エヌ・エー Unity エフェクト完全に理解した 勉強会 2024/11/08 © DeNA Co., Ltd. 1
自己紹介 山本 真史 ● 2018年4月DeNA入社 ● ゲーム事業部横断の グラフィックスチーム所属 ● エフェクトやらカットシーンやらの ツールを開発してることが多いです © DeNA Co., Ltd. 2
エフェクトのエミッターを手軽に作って編集できるようにしたい © DeNA Co., Ltd. 3
このセッションの目的 いい感じのエフェクト表現を行う方法ではなく、 いい感じにエフェクトを量産するための仕組みを考えていきます © DeNA Co., Ltd. 4
一般的なエフェクト Prefabの作り方 1. シーン上にエミッターを作成 2. エミッターにマテリアルを設定 3. a. 既存マテリアルで流用できるものを探す b. 新規にマテリアルアセットを作成 エミッターのパラメータを調整 a. 必要があればマテリアルやテクスチャを作成 4. 必要なだけ1~3を繰り返す 5. 作業が完了したらPrefabにして必要なアセットをサーバーにアップ © DeNA Co., Ltd. 5
一般的なエフェクト Prefabの作り方 どこが辛いのか 1. シーン上にエミッターを作成 2. エミッターにマテリアルを設定 3. ここ a. 既存マテリアルで流用できるものを探す b. 新規にマテリアルアセットを作成 エミッターのパラメータを調整 a. 必要があればマテリアルやテクスチャを作成 ここ 4. 必要なだけ1~3を繰り返す 5. 作業が完了したらPrefabにして必要なアセットをサーバーにアップ ここ © DeNA Co., Ltd. 6
エミッターにマテリアルを設定するときに辛いこと ● 汎用マテリアルで使えるものが あるか探すのが辛い ● 微妙にパラメータの異なる マテリアルが増え続けて辛い ● 作ったマテリアルの 置き場所を考えるのが辛い 量産に伴ってマテリアルのアセット数が増えて管理が辛い © DeNA Co., Ltd. 7
エミッターのパラメータを調整するときに辛いこと ● 汎用マテリアルのパラメータを誤っていじってしまうと大惨事に ● 似たようなマテリアルやテクスチャが増えていく ● テクスチャの微調整をするたびにDCCツールとの反復横跳びが必要になって面倒 エミッターの調整以外に 罠が多くて辛い © DeNA Co., Ltd. 8
データをサーバーにアップするときに辛いこと ● Prefabが出来上がる頃にはPrefab以外にも色々なアセットに変更が入っている ○ 新規に作ったマテリアルやテクスチャ ○ 触っただけで編集していないのに謎の差分が出てるマテリアル ○ 新規に作ったけど実は汎用素材で対応できたマテリアルやテクスチャ これらを適切に管理するのは難しい(特に非エンジニアにとっては) © DeNA Co., Ltd. 9
エフェクト Prefabの作り方がどう変わったか エミッターの生成時と編集時のワークフローを改修して、以下のようになりました 1. シーン上にエミッターを作成 2. エミッターにマテリアルを設定 3. a. 既存マテリアルで流用できるものを探す b. 新規にマテリアルアセットを作成 エミッターのパラメータを調整 a. 必要があればマテリアルやテクスチャを作成 4. 必要なだけ1~3を繰り返す 5. 作業が完了したらPrefabにして必要なアセットをサーバーにアップ © DeNA Co., Ltd. 10
エフェクト Prefabの作り方がどう変わったか エミッターの生成時と編集時のワークフローを改修して、以下のようになりました 1. シーン上にエミッターを作成 2. エミッターにマテリアルを設定 3. a. 既存マテリアルで流用できるものを探す b. 新規にマテリアルアセットを作成 エミッターのパラメータを調整 a. 必要があればマテリアルやテクスチャを作成 (部分的に) 4. 必要なだけ1~3を繰り返す 5. 作業が完了したらPrefabにして必要なアセットをサーバーにアップ © DeNA Co., Ltd. 11
エミッター生成時に何をしたか エミッター作成時に ● パラメータ調整用のコンポーネントを追加 ● パラメータから動的にマテリアルを設定 ● CustomDataも設定 をツール側で行うように © DeNA Co., Ltd. 12
動的なマテリアル生成の仕組み 事前にマテリアルのオブジェクトプールを作成しておき、 エミッターのシェーダやBlend指定などから対応するマテリアルをプールから取得 マテリアルA マテリアルB マテリアルC 複数エミッターで シェーダX シェーダX シェーダB 同時利用可能な Blend AlphaBlend Blend Add Blend Add マテリアルプール QueueOffset0 QueueOffset0 QueueOffset-10 © DeNA Co., Ltd. 13
動的なマテリアル生成の仕組み エミッターのレンダラーにマテリアルを設定しつつ、 テクスチャなどのマテリアルプロパティは MaterialPropertyBlock経由で設定 MaterialPropertyBlockを経由しているので エミッター間でプロパティが異なっていても 同じマテリアルを同時に利用可能 © DeNA Co., Ltd. 14
エミッターへのパラメータ反映の仕組み ComponentのOnEnableとOnValidateでエフェクトの要素を全て確認し、 シェーダパラメータをMaterialPropertyBlock経由でエミッターに反映 ● エディタ編集時はエミッターの生成時とパラメータ編集時に動的にパラメータ反映 ● ビルドではエミッターがシーン中で有効になったタイミングにだけパラメータ反映 © DeNA Co., Ltd. 15
コンポーネント経由で便利になった機能紹介: Gradient UnityEngine.Gradientが シェーダパラメータ的に利用可能に ● エディタ上で微調整可能 ● エディタ上でリストの増減も ● FilterModeや解像度も個別制御可能 実行時にGradientからテクスチャへ 変換してシェーダに渡してます © DeNA Co., Ltd. 16
コンポーネント経由で便利になった機能紹介:パラメータ置き場が明確に マテリアルパラメータをコンポーネントで設定するので ● デザイナーはコンポーネントだけを見ればOK ● PrefabVariantだけでEmitterのVariantが作れる といったメリットも © DeNA Co., Ltd. 17
結果としてできあがったもの © DeNA Co., Ltd. 18
実際にタイトルで利用してみての振り返り 良かった点 ● デザイナーのエミッター生成・編集コストを大幅削減できた ● 普段のマテリアルでは利用しにくい機能(Gradientなど)も使いやすく 悪かった点 ● ● © DeNA Co., Ltd. shader_featureを使っていた時はビルド時にシェーダがストリップされてトラブルに ○ multi_compile+ShaderVariantCollectionを使って対応しました ○ キーワードの管理コスト都合で現在はキーワードを使わない方式に落ち着きました UIが重くてエミッターの編集がやりにくいことも 19
まとめ ● エフェクトの制作には多種のエミッターやマテリアル、テクスチャが必要 ● 多量のアセットの生成・管理コストを軽減するシステムを作成しました ● コンポーネントからエフェクトのパラメータを設定することで操作も簡単に ● コンポーネントを活用することで従来のマテリアルだと扱いにくい機能も使いやすく ● PrefabVariantでEmitterのVariant的な使い方も可能に © DeNA Co., Ltd. 20
© DeNA Co., Ltd. 21