メッシュ と マテリアル は Unity のマネージ C# オブジェクトです。つまり、Burst C# コードからは使用できません。これらを BRG の描画コマンドで使用するには、BRG に事前に登録する必要があります。
メッシュオブジェクトを登録するには BatchRendererGroup.RegisterMesh、マテリアルオブジェクトを登録するには BatchRendererGroup.RegisterMaterial を使用します。前者の関数は BatchMeshID を返し、後者の関数は BatchMaterialID を返します。これらは Burst 互換ハンドルを含むプレーンなデータ構造体で、間違ったハンドルタイプの使用によるエラーを防ぐために、強く型付けされています。
メッシュオブジェクトとマテリアルオブジェクトの登録は、ランタイムを含め、いつでも行えます。ただし、以下の条件だけは満たしている必要があります。
不要になったメッシュオブジェクトやマテリアルオブジェクトは登録解除することもできます。メッシュオブジェクトやマテリアルオブジェクトをアンロードする場合には、登録解除が必要です。BatchRendererGroup.Dispose は、登録されているすべてのアセットを自動的に登録解除します。
ノート: BatchMeshID や BatchMaterialID はシリアライズできません。これらは、登録先の BatchRendererGroup にのみ有効です。登録を解除するか、BatchRendererGroup が存在しなくなると、無効になります。BatchMeshID と BatchMaterialID は、Unity がメッシュオブジェクトまたはマテリアルオブジェクトを強制的にアンロードする場合も無効になります。これは、メッシュオブジェクトまたはマテリアルオブジェクトが属するシーンを Unity がアンロードするときに発生します。
同じメッシュオブジェクトまたはマテリアルオブジェクトを複数回登録できます。これは、どのメッシュまたはマテリアルが登録済みであるかが不明な場合に、メッシュまたはマテリアルを登録するのに便利です。この場合、BatchRenderer は登録回数を以下のように内部でカウントします。
ノート: BRG は、フレーム内の最初の OnPerformCulling コールバックメソッドの後に、メッシュオブジェクトまたはマテリアルオブジェクトの変更をチェックします。つまり、その時点より前に発生したすべての変更が考慮されます。これには最初のコールバック自体で行った変更は含まれますが、そのコールバックがスケジュールしたジョブで発生した変更は含まれません。それ以降にメッシュオブジェクトまたはマテリアルオブジェクトを変更すると、未定義の動作が発生します。
BatchRendererGroup オブジェクトにメッシュやマテリアルを登録する方法については、以下のコードサンプルを参照してください。このコードサンプルは、BatchRendererGroup オブジェクトの初期化 に記載されているコードをベースに構築されています。
using System;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Jobs;
using UnityEngine;
using UnityEngine.Rendering;
public class SimpleBRGExample : MonoBehaviour
{
public Mesh mesh;
public Material material;
private BatchRendererGroup m_BRG;
private BatchMeshID m_MeshID;
private BatchMaterialID m_MaterialID;
private void Start()
{
m_BRG = new BatchRendererGroup(this.OnPerformCulling, IntPtr.Zero);
m_MeshID = m_BRG.RegisterMesh(mesh);
m_MaterialID = m_BRG.RegisterMaterial(material);
}
private void OnDisable()
{
m_BRG.Dispose();
}
public unsafe JobHandle OnPerformCulling(
BatchRendererGroup rendererGroup,
BatchCullingContext cullingContext,
BatchCullingOutput cullingOutput,
IntPtr userContext)
{
// This simple example doesn't use jobs, so it can return an empty JobHandle.
// Performance-sensitive applications should use Burst jobs to implement
// culling and draw command output. In this case, this function would return a
// handle that completes when the Burst jobs finish.
return new JobHandle();
}
}
登録されたメッシュとマテリアルを使用する描画コマンドを作成するには、その描画コマンドのインスタンスに使用するデータ (Transform 行列など) を前もって提供する必要があります。BatchRendererGroup は、バッチと呼ばれる概念を使用して、各インスタンスに使用するデータを提供します。詳細は、次のトピック バッチを作成する を参照してください。