Unity Weekly #030
Unity Official
Unity 2020 LTS 以降の Visual Effect Graph が拓く新たな可能性
Unity 2020 LTS 以降の Visual Effect Graph が拓く新たな可能性 | Unity Blog
- Unity2020 LTS以降のVisual Effect Graphのアップデートについて紹介しています。Unity 2020 LTSおよび2021.1のアップデートでは主に安定化・パフォーマンス最適化・CPUイベント出力を利用したゲームプレイとの統合強化・メッシュからパーティクルをスポーンする機能の拡充に焦点を当てています。
- またUnity 2021.2以降では、URPのサポート強化、2Dとの互換性を強化して計算性能の高いモバイル、Oculus Quest、Switchなどのプラットフォームへのサポートを拡大することを目標にしています。
- Visual Effect Graphのサンプルの更新およびSpaceshipデモの刷新が行われました。
- 新しく追加されたサンプル「Meteorite」は、隕石の衝突によって引き起こされる力の相互作用を表現しています。これには新たに追加された「VFX Output Event Handlers」を使って作られています
- Output Event Handlerはカメラの揺れ、地面への衝撃、光アニメーションを表現するために利用しています
- 爆発や燃焼をトリガーするためにその結果をレンダーテクスチャーに書き込んでおき、それを他のエフェクトが利用することで相互作用を実現できます。
- VFXのタイムライン上での同期が強化されました。
UnityグラフィックスAPI総点検!〜最近こんなの増えてました〜(YouTube)
UnityグラフィックスAPI総点検!〜最近こんなの増えてました〜 - Unityステーション - YouTube
- 最近のUnityのグラフィックス周辺で追加されたAPIなどについて紹介しています。動画で利用されているスライド資料はこちらに公開されています。
- シェーダーキーワードの無限化 (2021.2)
- いままではゲームの中で合計128個(5.4まで) -> 256個(5.5) -> 384個(2019.4) -> 2^32(2021.2)に。詳しい実装はフォーラム投稿で。
Material.SetInt
->Material.SetInteger
(2021.1)void SetInt(string name, int value) => SetFloat(string name, (float)value);
(実際のコード)- ビットフィールドとして渡している人は死ぬので結構致命的だった
- Meshインターリーブ配列アクセス (ドキュメント)
- 2019.3と2020.1でそれぞれ変更があった。(リンクはそれぞれドキュメント)
- Position, Normal, UVのような分離された配列ではなくインターリーブ配列に直接アクセスできる。CPUやメモリの節約になる
- サンプル: NoiseBall5, DanmakuBenchmark
- Mesh GraphicsBufferへのアクセス
- Compute ShaderからMeshを直接更新できるようになった (ドキュメント)
- サンプル: NoiseBall6, ComputeMarchingCubes
- ComputeBuffer -> GraphicsBuffer
- 頂点バッファやインデックスバッファも参照できるようになった上位互換的存在(ドキュメント)
- 今後は基本GraphicsBufferをしていく予定なので、基本こっちを使うでよい
- TextureFormat? GraphicsFormat?
- TextureFormat・GraphicsFormat
- TextureFormatはファイルの属性を表現するもの、GraphicsFormatはGPUメモリ上での属性を表現するもので、使い分けをしていく
- RenderTextureはRenderTextureFormatがある(GraphicsFormatが使われる予定があるかも?)
- 最近知った便利機能(小話系)
- Texture2D.PackTextures(ドキュメント)
- Assembly DefinitionのVersion Define
- 「他のパッケージのバージョンがxxx以上の場合にDefineを定義する」ができる
- IssuePluginCustomTextureUpdateV2
- ネイティブプラグインを使ってテクスチャを書き換えるAPI。本来テクスチャの書き換えは描画スレッドとの連携が必要なので、本当は面倒でこれを使うと楽。
- Unityがネイティブプラグインをコールバックで呼ぶという形。C++で画像を生成したい場合や外部ライブラリから画像を受け取りたい場合などに便利。
- サンプル: TextureUpdateExample
- GetRawTextureData
- 昔からあった
GetRawTextureData
はCPUに格納されているデータをC#配列としてコピーするが、こちらはNativeArray<T>
として直接返すので余計なメモリ確保が生じない。(マニュアル)
- 昔からあった
- VFX GraphのGraphicsBuffer対応
- いままではプログラムで生成したデータを渡すには一度テクスチャにベイクする必要があったがそれがなくなった。(マニュアル)
- VfxGraphGraphicsBufferTest, GeoVfx
- DrawProcedural 系 APIおさらい
- Meshデータを使わずに描画を行うためのAPI群。ただし今までは呼び出すと即座に描画がされるのでシーンのライティングなどを考慮できなかったが、新しいAPIでは考慮できるようになった(が、古いAPI名と新しいAPI名が被るので、破壊的な変更が行われていることになっている)
- Async GPU Readback
- ComputeShaderを実行して作成したGPU側のデータをCPU上にコピーする処理を非同期に行えるようになった (マニュアル)。
- 内部的にはUnityがEarlyUpdateでポーリングしているらしい
- 今まではUnityが用意した領域にコピーし次のフレームでは消えるといった状態だが、
RequestIntoNativeArray
ではコピー先をユーザーが用意したNativeArrayにできる。 WaitAllRequests
: 終了処理を書くときになどに、すべての処理が終わるまで待つAPICaptureScreenshotIntoRenderTexture
: スクリーンショット系の実装で便利。(ドキュメント)
- ComputeShaderを実行して作成したGPU側のデータをCPU上にコピーする処理を非同期に行えるようになった (マニュアル)。
アーティストワークフローをスピードアップ
アーティストワークフローをスピードアップ | Unity Blog
- 「70+ tips to increase productivity with Unity 2020 LTS」というeBook紹介記事の第2段です。第1弾はこちら。Unity機能のうちアーティスト向けのヒントを紹介しています。
- Nested PrefabやPrefab VariantsなどのPrefab Workflowを用いて入れ子や継承などを表現できます(プレハブワークフロー - Unity)
- TextMeshProでは、文字、単語、行、段落のスペーシング、カーニング、テキストの両端揃え、リンク、30 種類以上のリッチテキストタグ、マルチフォントとスプライトのサポート、カスタムスタイルなど、uGUIのUI Textと比べて様々な機能が利用できます。
- スナップを用いることでトランスフォームの設定をより効率的に行えます。「Edit > Grid and Snap Settings」ではワールド空間でのグリッドのスナップを調整できます。また、表面スナップや頂点スナップを用いてコライダー表面や頂点上にもスナップできます。ProGridsパッケージを用いることでスナップ挙動をより細かく制御できます。
- アニメーションウインドウ(Window > Animation > Animation)を用いることでUnityのあらゆるプロパティをアニメーション化することができます。また、Animation Riggingパッケージによりランタイムのリギングによってアニメーションを調整したり、物理ベースの制約によってダイナミックなセカンダリモーションを追加することもできます。
- カスタムギズモを利用してアセットの調整を効率化できます。(Creating Custom Gizmos for Development - 2019.2 - Unity Learn)
- ライトマップを高速化する手法としてプログレッシブライトマッパーを利用できます。また、プログレッシブライトマッパーにはCPUライトマッパー以外にGPUライトマッパー(プレビュー)が利用できます。使用しているマシンが要件を満たしていれば利用でき、場合によってはCPUに比べて10倍高速になります。
- GIの近似手法としてライトプローブを用いることもできます。(参考: ライトプローブを使用した静的ライティング | Unity Blog)
合成データのための 3D コンテンツを使ってみよう
合成データのための 3D コンテンツを使ってみよう | Unity Blog
- Unity Perceptionを利用して合成データを作成することで、機械学習における学習を効率的に行うことができるようになります。この記事では合成データを作成するために必要な3Dコンテンツを調達する方法として、「Unityアセットストア」、「3Dスキャン」、「プロシージャルコンテンツ」をそれぞれ紹介しています。
- Unityアセットストアでは、ゲーム・映画などで利用するための3Dコンテンツが多く、安価で販売されています。
- 3Dスキャンを用いることで実世界の物体の正確な3Dモデルをできます。3Dスキャンの技術として主に「フォトグラメトリー」、「フラットベッドスキャナーと 3D モデリング」、「産業用3Dスキャナー」があります
- フォトグラメトリでは異なる角度から撮影された写真のセットから 3D オブジェクトを合成します。https://unity.com/ja/solutions/photogrammetry
- SynthDetで利用されるアセットはフラットベッドスキャナーと 3D モデリングで作成されています。(参考)
- 産業用 3D スキャナーは高精度かつ高速ですが、その分コストが高い傾向にあります。
- プロシージャルコンテンツではルールに基づいたアルゴリズムを利用して無数のバリエーションのコンテンツを生成できます。ツールとしてUnity のシェーダーグラフ、Adobe Substance 3D、Houdiniなどがあります。
Articles
Volumetric Light Scattering as a Custom Renderer Feature in URP
Volumetric Light Scattering as a Custom Renderer Feature in URP | raywenderlich.com
- URPでCustom Renderer Featureを用いてVolumetric Light Scattering(ゴッドレイやライトシャフトとも呼ばれる)を実装するための方法の解説しています。
- 物理的に正確な計算ではないが、ポストプロセスとして効果を実現する。具体的には、スクリーンスペース上でoccluders mapと呼ばれる光源情報を表すテクスチャを生成して、そのテクスチャを元にラディアルブラーにより効果を表現して、もとのレンダリング結果にオーバーレイする方法を取ります。
- Custom Renderer Featureの作成方法からForward Rendererへの追加方法、上記のアルゴリズムを実際にRenderer Featureとして実装する方法を解説しています。
- Frame Debuggerを用いて、Custom Renderer Featureのデバッグ方法も紹介しています。
【Unity2021.2新機能】各アセットのインポート時間が一覧表示できるImport Activity Window
【Unity2021.2新機能】各アセットのインポート時間が一覧表示できるImport Activity Window - LIGHT11
- Unity 2021.2から導入された Import Activity Windowについて紹介しています。Import Activity Windowを用いることで、それぞれのアセットのインポートにかかった時間を確認できます。
- OnPostprocessAllAssetsで書かれたインポート処理は形状されないというハマりポイントにも言及されています。
Unityのパッケージ取得にパスフレーズ付きの秘密鍵を使う
- Unityのパッケージマネジャで、Githubなどのプライベートレポジトリをパスフレーズ付きの秘密鍵を用いて利用する方法の解説記事。
- Windows10環境でGit for Windowsを用いて、具体的にどのようにパスフレーズ付き秘密鍵を利用するかについて説明しています。
Save Data with BinaryWriter and BinaryReader
Save Data with BinaryWriter and BinaryReader – Bronson Zgeb
BinaryReader
およびBinaryWriter
を利用してオブジェクトの状態をバイナリデータとして保存し、また読み込む方法を紹介しています。
The Scriptable Object Asset Registry Pattern
The Scriptable Object Asset Registry Pattern – Bronson Zgeb
- 上記の
BinaryReader
とBinaryWriter
によるセーブデータ保存機能を活用して、ゲーム中のプレハブや複雑なデータをシリアル化してディスクにゲームの状態を保存・読み込みするためのパターンであるRegistry Pattern
について紹介しています。
Pathfinding on a hexagonal grid
Pathfinding on a hexagonal grid - A* Algorithm - The Knights of Unity
- A*アルゴリズムによる経路探索を2Dグリッド空間を例に、C#のコード付きで紹介しています。
- ヘキサゴングリッドにおいてA*をどのように適用すればよいかについてもしています。
Design a grid style inventory window with UI Toolkit
Design a grid style inventory window with UI Toolkit - GameDev Resources
- UI Toolkitを用いて、ランタイムで動作するグリッドスタイルなインベントリウインドウを実装する方法について解説する記事。デザインにはUI Builderパッケージを用いています。
- 各種パッケージの導入方法からUI Builderを用いてどのようにUIを構築していくかについて、順繰り解説しています。
- 次の記事で、スクリプトとUIを連動させる方法について解説される予定です。
Material Property Blocks
Material Property Blocks – Anton Semchenko
- Material Property Blockの紹介と使い方について。
Renderer.material
を参照すると都度マテリアルをインスタンス化してしまいメモリ効率が悪かったり、ドローコールを増加させる可能性がある。 - Material Property Blockについての解説