Unityの最新DOTSシリーズ「BakingとBakerの詳細解説」

Unity DOTS Baking と Baker の詳細な説明

最近、ついに DOTS の正式版がリリースされましたので、誰もが Unity DOTS 開発を学びマスターできるように、DOTS における Baking と Baker の重要な概念を共有しましょう。

はい、ここにゲーム開発交流グループ。皆さんもクリックして開発経験を一緒に交換していただければ幸いです。

Unity DOTS 開発モデルでは、誰もがゲームを「作成」する際に独自のコンポーネント メソッドを使用してゲーム シーンやリソースを編集できるようにすると同時に、Unity は通常のゲームオブジェクト データを ecs モードのエンティティ データに変換するベイキング メカニズムを提供します。 、変換された ECS モード データが直接ロードされます。ベイキングとベイカーのメカニズムを深く理解する前に、まずいくつかの概念について理解します。

オーサリング: 英語で「創造」を意味する言葉 前述の通り、ECSモードで開発する場合は、独自の方法でゲームノードを作成し、ベイク処理で変換することが可能です。したがって、ecs モードに変換されるゲームオブジェクトとコンポーネントはオーサリングと呼ばれます。

ベイク処理: 従来の GameObject+ コンポーネント データを ecs モードで必要なデータに変換するプロセスを指します。

Baker:  ECS モードへの特定のオーサリングの特定のエグゼキュータと実行ロジックを指します。

これらの概念を念頭に置いて、Unity DOTS の Baking と Baker を詳細に分析してみましょう。

Unity DOTS ベイクメカニズムのコア分析

データのオーサリング: 従来のスクリプト、リソース、その他のゲーム データの依存関係などのゲーム プロジェクト アプリケーションを編集する場合、この編集方法は非常に柔軟で、ユーザーが表示および使用するのに便利です。この編集されたデータをオーサリングデータと呼びます。

ランタイムデータ とは、ECSモードで実行する際に必要なデータで、プログラムを実行するとゲームデータとして処理されます。このモードのデータは効率的なパフォーマンスと効率的なストレージを備えています。これはコンピュータの操作と処理を目的として設計されているため、開発者にとって従来の GameObject モードほど直感的ではありません。

開発者は、Unity でオーサリング シーンをサブシーンとしてロードする必要があります。オーサリング シーンでオーサリング オブジェクトを編集すると、ベイク処理プロセスがトリガーされ、バックグラウンドで完了します。

ベーキングには 2 つのモードがあります。

フル ベイク処理 (グローバル ベイク処理): オーサリング シーン内のすべてのオブジェクトに対してベイク処理操作を実行します。

インクリメンタル ベイク処理: 変更されたオブジェクトに対してのみベイク処理操作を実行します。

1: ベイク処理された ECS モデルの下のエンティティ シーン データがディスク上にない場合、フル ベイク処理が発生します。

2: オーサリング シーンのコンテンツが変更され、ベイク処理されたエンティティ シーン データ (ランタイム データ) の有効期限が切れます。

3: ベイカー コードのコンパイル後にベイク コードに [BakingVersion] 属性が含まれていることが判明した場合、これはベイク コードが変更され、エンティティ シーンの有効期限が切れたことを意味し、完全なベイク処理がトリガーされます。

7: エディタの環境設定でベイク キャッシュをクリアすると、完全なベイクが発生します。

フル ベイク処理では、ハード ディスクに保存されるいくつかのファイルが出力され、エディタがプログラムを実行するときにこれらのファイルがロードされます。

サブシーン メカニズムを使用して「クリエイティブ シーン」をロードすると、インクリメンタル ベイク処理も初期化されます。シーンでインクリメンタル ベイク処理を実行すると、「クリエイティブ シーン」を編集するときに、ベイク処理の結果に直接アクセスして使用できることになります。変更されたデータとコンポーネントに対してのみベイク処理されます。

Unity DOTS Baker メカニズムのコア分析

各コンポーネント データの Baker は、依存するデータが変更されたときにこのコンポーネントの Baker 呼び出しがトリガーされるように、その実行依存関係をシステムに登録する必要もあります。デフォルトでは、ベイカーは 1 つのオーサリング コンポーネントにのみアクセスできますが、場合によっては他のコンポーネント、ゲームオブジェクト、またはさまざまなリソースからアクセスする必要があるため、ベイク プロセス全体でこれらの依存関係を認識する必要があります。これらの他のオブジェクトが変更された場合、このベイカーも必要になります再実行されることになります。たとえば、オーサリング ゲームオブジェクトが立方体の場合、Unity はベイク処理時にエンティティを立方体にレンダリングします。オーサリング ゲームオブジェクトがその後球に変更された場合、ECS もそれに応じて変更を加える必要があります。このエンティティを球にレンダリングするには、これこれは、Unity が以前の Cube エンティティを削除して新しい球エンティティを作成するか、球を表示するようにエンティティを変更する必要があることを意味します。もう 1 つの例は、GameObject にスクリプト可能なオブジェクトに依存するマテリアルがあることです。Baker は、リソースのスクリプト可能オブジェクトが変更されたときにオブジェクトが再 Baker になるように、リソースの依存関係を定義する必要があります。プロセス全体は自動的に行われるため、私たち一般の開発者は心配する必要はありません。

最後に、共通の MonoBehaviour コンポーネントを備えた Baker を示します。コードは次のとおりです。

ECS コンポーネント:

publicstructDependentData:IComponentData

{

publicfloatDistance;

publicintVertexCount;

}

オーサリングコンポーネント:

publicclassDependentDataAuthoring:MonoBehaviour

{

publicGameObjectOther;

パブリックメッシュメッシュ;

}

オーサリング コンポーネントから ECS コンポーネントまでの Baker を定義します。

publicclassGetComponentBaker:Baker<DependentDataAuthoring>

{

// ベイク処理時に Bake 関数を呼び出します

publicoverridevoidBake(依存データオーサリングオーサリング)

{

// 必要な Baker 依存関係を宣言します

依存(オーサリング.その他);

依存(オーサリング.メッシュ);

if(authoring.Other == null)return;

if(authoring.Mesh == null)return;

vartransform = GetComponent<Transform>();

vartransformOther = GetComponent<Transform>(authoring.Other);

if(transform == null)return;

if(transformOther == null)return;

varentity = GetEntity(TransformUsageFlags.Dynamic);

AddComponent(entity,newDependentData

{

距離 = Vector3.Distance(transform.position,transformOther.position),

VertexCount = authoring.Mesh.vertexCount

});

}

}

今すぐここで共有し、フォローして、最新の Unity DOTS の高度で実践的な知識をさらに学びましょう。

VIP をご検討中のお客様各位:

私たちの Unity DOTS コースも正式にリリースされ、9 年以上の更新と反復を経て、私たちのコースは、Unity メイン プログラムの進歩と昇進と昇給に必要なシステムなど、Unity 開発で遭遇する問題のほとんどをカバーしました。知識システム、主流のゲームタイプにおける主要な困難な問題に対する技術的解決策。私たちの教師は、クライアント + サーバーを含むがこれに限定されない、10:00 ~ 23:00 までリアルタイムで回答を提供します。私たちが提供するゲーム開発技術サービスが皆様のお役に立つと信じております。後悔しないように、VIP コースをお選びください。

私に従ってください!

Boyi Chuang はゲーム業界で高度なテクノロジーを備えており、昇進と昇給を受けました

おすすめ

転載: blog.csdn.net/voidinit/article/details/133982245