アセットライブラリの構築は、ゲーム内の中央の場所にアセットのコレクションをインポートして構成し、簡単にアクセスして再利用できるようにするプロセスです。このプロセスは、特に各アセットの値を設定してパフォーマンスを向上させ、中〜低スペックのデバイスでのメモリ使用量を最適化する場合、環境を構築する準備をする際に大幅な時間を節約できます。
環境アート - アセンブリング .rbxlファイルを参照として、この環境アートカリキュラムのセクションでは、ポリッシュされたアセットからアセットライブラリを構築する方法を示し、以下のステップバイステップの指示を含みます。
- タイル可能なテクスチャから地形用のカスタムマテリアルを作成する。
- トリムシート用のSurfaceAppearanceオブジェクトを作成し、それをアセットライブラリ内のアンラップされたメッシュに適用する。
- すべてのデバイスで最適なパフォーマンスを確保するために、アセットのレンダリングパラメータを設定する。
- アセットをパッケージに変換し、すべてのプロジェクトで更新して再利用できるようにする。
このセクションを完了すると、アセットライブラリを創造的に活用してグレーボックス環境を置き換えたり変換したりし、全体の3D空間を向上させる最終的な仕上げを追加する方法を学びます。

カスタムマテリアルの作成
Studioは、カスタムマテリアルをMaterialVariantオブジェクトとしてMaterialService内で表現します。これらのMaterialVariantオブジェクトには、4つのプロパティがあり、4つのタイル可能なテクスチャマップを組み合わせて、高品質の物理特性を持つカスタムマテリアルを作成します。
- MaterialVariant.ColorMap – アルベドテクスチャマップを表します。
- MaterialVariant.MetalnessMap – メタリックテクスチャマップを表します。
- MaterialVariant.NormalMap – ノーマルテクスチャマップを表します。
- MaterialVariant.RoughnessMap – 粗さテクスチャマップを表します。
これらのプロパティにテクスチャマップを供給した後、パーツ、メッシュ、地形の両方に新しいカスタムマテリアルを適用できます。サンプルテクスチャマップの.pngファイルを使用または変更して、最終的なサンプルレーザータグ環境内でLumpy Moss、Flowering Lumpy Moss、Lumpy Moss with Stones、Stonesのカスタムマテリアルを作成することができます。または、チュートリアルの前のセクションでデザインした独自のものを使用することもできます。
タイル可能なテクスチャ用のMaterialVariantオブジェクトを作成するには:
ウィンドウ ⟩ 3Dメニューからマテリアルを選択して、マテリアルマネージャーを開きます。
マテリアルリストから、タイル可能なテクスチャに最も合致する基本マテリアルを選択します。たとえば、Lumpy Mossタイル可能テクスチャ用のMaterialVariantオブジェクトを作成する場合、デフォルトの地面マテリアルを選択して、マテリアルがその物理特性を継承するようにします。
上部ツールバーで**⊕**アイコンをクリックします。新しいMaterialVariantがパレットに表示され、右下隅にカスタムマテリアルであることを示すアイコンが表示されます。

インスペクターで、一般セクションに移動し、マテリアルの名前をタイル可能なテクスチャの名前に合わせて変更します。

テクスチャマップセクションで、Colorの右側にあるインポートボタンをクリックします。ファイルブラウザが表示されます。

ファイルブラウザで、対応するタイル可能なテクスチャのアルベドテクスチャマップ.pngファイルを選択し、開くボタンをクリックします。ファイルブラウザが閉じ、新しいカラーマップがそのアセットIDと共に表示されます。
Metalness、Normal、およびRoughnessテクスチャマップについてもこのプロセスを繰り返します。カスタムマテリアルはテクスチャマップを反映するように更新されます。


オーバーライドセクションで、オーバーライドとして設定トグルを有効にして、地形に地面を適用する際にStudioがこのカスタムマテリアルを使用するようにします。

- オプション有機的なマテリアルを表すカスタムマテリアルを作成する場合、
- タイルセクションで、パターンドロップダウンをクリックします。
- 有機的を選択して出力をランダム化し、目に見えるタイルを減らします。

ゲームに含めたい各タイル可能なテクスチャについてこのプロセスを繰り返します。
SurfaceAppearanceパッケージの作成
Studioは、UVデータを含むMeshPartsに親子関係を持つSurfaceAppearanceオブジェクト内でトリムシートを利用します。カスタムマテリアルと同様に、SurfaceAppearanceオブジェクトには、4つのトリムシートテクスチャマップを組み合わせて高品質の3Dビジュアル表面処理を作成する4つのプロパティがあります。
SurfaceAppearance.ColorMap – アルベドテクスチャマップを表します。
SurfaceAppearance.MetalnessMap – メタリックテクスチャマップを表します。
SurfaceAppearance.NormalMap – ノーマルテクスチャマップを表します。
SurfaceAppearance.RoughnessMap – 粗さテクスチャマップを表します。
これらのプロパティにテクスチャマップを供給した後、SurfaceAppearanceオブジェクトをトリムシートにマッピングされたUVデータを持つMeshPartの子にすることができ、UVデータは自動的に親メッシュに適用されます。このため、SurfaceAppearanceオブジェクトをパッケージにすることが便利で、すべてのモジュラーアセットやプロップで同じSurfaceAppearanceオブジェクトを再利用できます。たとえば、以下のメッシュはすべて、単一のSurfaceAppearanceオブジェクトパッケージ内で表現される同じトリムシートレイアウトにマッピングされたUVデータを持っています。

サンプルテクスチャマップの.pngファイルを使用または変更して、最終的なサンプルレーザータグ環境内のサンプルモジュラーアセットやプロップのUVデータを尊重するSurfaceAppearanceオブジェクトを作成することができます。または、チュートリアルの前のセクションでデザインした独自のものを使用することもできます。
モジュラーキットやプロップに子として追加できるSurfaceAppearanceパッケージを作成するには:
SurfaceAppearanceオブジェクトをWorkspaceに挿入します。
SurfaceAppearanceオブジェクトを選択し、プロパティウィンドウでColorMapプロパティを選択します。ポップアップが表示されます。
**画像を追加...**ボタンをクリックします。ファイルブラウザが表示されます。

対応するタイル可能なテクスチャのアルベドテクスチャマップを選択し、開くボタンをクリックします。ファイルブラウザが閉じ、ColorMapプロパティが新しいアセットIDで更新されます。
MetalnessMap、NormalMap、およびRoughnessMapプロパティについてもこのプロセスを繰り返し、それぞれのテクスチャマップをファイルブラウザから選択します。
エクスプローラーウィンドウで、SurfaceAppearanceオブジェクトを右クリックし、コンテキストメニューからパッケージに変換を選択します。パッケージに変換ダイアログが表示されます。
タイトルと説明フィールドを入力し、所有権を自分またはグループに設定し、送信ボタンをクリックします。完了すると、SurfaceAppearanceオブジェクトのアイコンの上に鎖のリンクシンボルが表示され、パッケージとして識別されます。

- オプションSurfaceAppearanceオブジェクトの子PackageLinkオブジェクトを選択し、プロパティウィンドウで自動更新を有効にして、SurfaceAppearanceオブジェクトに変更を加えた場合にパッケージが自動的に更新されるようにします。
モジュラーアセットとプロップのインポート
Studioは、インポートしたモジュラーアセットとプロップを、アセットの各コンポーネントに対して子MeshPartsを持つModelオブジェクトとして表現します。たとえば、上部トリム、下部トリム、および壁コンポーネントを持つ壁セクションをインポートする場合、Studioは.fbxまたは.objファイルをWall_Section Modelとして表現し、別々の子Top_Trim、Bottom_Trim、およびWall MeshPartsを持ちます。

インポータを使用して、サンプルモジュラーキットとプロップをStudioにインポートしてアセットライブラリで使用することができます。または、チュートリアルの前のセクションでデザインしたアセットをインポートすることもできます。このツールの機能についての詳細は、インポータを参照してください。
ゲームにモジュラーアセットとプロップをインポートするには:
ファイルメニューからインポートを選択します。ファイルブラウザが表示されます。
モジュラーアセットまたはプロップ用の.fbxファイルを選択します。
オブジェクトのプレビューを確認し、インポート設定が正しいことを確認します。

警告またはエラーメッセージを確認します。
インポートをクリックします。アセットがエクスプローラーウィンドウとビューポートに表示されます。
各モジュラーアセットとプロップについてこのプロセスを繰り返します。
すべてのアセットをゲームのグレーボックスジオメトリの近くの1つのエリアに移動します。このゾーンがアセットライブラリです。
SurfaceAppearanceデータの適用
サードパーティのモデリングソフトウェアでメッシュのUVをアンラップするプロセスを通じて、ソフトウェアはメッシュの.fbxまたは.objファイル内にUVデータを保存します。そのメッシュをStudioにインポートすると、結果として得られるMeshPartオブジェクトはそのデータを保持しますが、アセットにトリムテクスチャを表示するためには、トリムシートからのテクスチャマッププロパティを持つSurfaceAppearanceオブジェクトを適用する必要があります。
アセットライブラリ内のアンラップされたメッシュにSurfaceAppearanceテクスチャマップデータを適用するには:
- エクスプローラーウィンドウで、SurfaceAppearanceパッケージをクリックし、CtrlD (⌘D)を押して複製します。
- 複製したSurfaceAppearanceパッケージをモジュラーアセットまたはプロップに子として追加します。アセットはそのUVデータをテクスチャマップに適用し、ビジュアル処理を表示します。
- 各モジュラーアセットとプロップについてこのプロセスを繰り返します。
物理およびレンダリングパラメータの設定
Studio内にアセットがあるので、すべてのデバイスで最高の視覚品質を維持できるように、物理およびレンダリングパラメータを設定することが重要です。一般的に、このセクションのガイダンスに従うほど、ゲームのパフォーマンスが向上します。ただし、各アセットを全体の環境内でどこに配置するかの文脈を慎重に考慮し、審美的な目標とゲームプレイの要件を維持することが重要です。
アンカー
BasePart.Anchoredプロパティは、Robloxエンジンの物理システムがオブジェクトの位置に影響を与えるかどうかを決定します。このプロパティをPartまたはMeshPartに対して有効にすると、ゲーム内で常に実行されている動的シミュレーションの物理計算からオブジェクトが除外され、オブジェクトは重力や他のオブジェクトからの衝突によって位置が変わることはありません。
物理応答をシミュレートしないオブジェクトは、物理計算に必要なGPUを占有しないため、レンダリングコストが低くなります。GPUを解放すると、特に高速なゲームプレイのためにGPUを節約する必要がある低スペックデバイスで、ゲームのパフォーマンスが向上します。このため、最終的なサンプルレーザータグ環境では、ドアを除くすべてのアセットがアンカーされています。
CanCollide
BasePart.CanCollideプロパティは、オブジェクトが他のオブジェクトと物理的に相互作用できるかどうかを決定します。このプロパティをPartまたはMeshPartに対して有効にすると、オブジェクトは侵入不可能になり、Robloxエンジンは物理計算においてそれを考慮します。これらの計算は、エンジンが物理計算で考慮しなければならないオブジェクトが多い場合、ゲームのパフォーマンスに影響を与える可能性があります。
このパフォーマンスへの影響を軽減するために、ユーザーが決して相互作用しないオブジェクトについてはこのプロパティを無効にします。たとえば、最終的なサンプルレーザータグ環境では、すべての植生に対してこのプロパティが無効になっています。

CanTouch
BasePart.CanTouchプロパティは、TouchedおよびTouchEndedイベントがオブジェクトで発生するかどうかを決定します。このプロパティをPartまたはMeshPartに対して有効にすると、Robloxエンジンはオブジェクトのタッチイベント状態を確認して、イベントをトリガーまたは停止する必要があるかどうかを判断します。
このプロセスは、エンジンが一度に多くのオブジェクトのタッチイベント状態を確認する必要がある場合、メモリを大幅に消費する可能性があります。このメモリへの影響を軽減するために、イベントをトリガーする必要があるオブジェクトに対してのみこのプロパティを有効にします。
CanQuery
BasePart.CanQueryプロパティは、Robloxエンジンが空間クエリ操作(レイキャスティングなど)の際にオブジェクトを考慮するかどうかを決定します。StudioはデフォルトですべてのPartまたはMeshPartに対してこのプロパティを有効にしており、エンジンは各オブジェクトが空間クエリ操作を呼び出す必要があるかどうかを確認します。このプロセスは、エンジンが一度に多くのオブジェクトに対してこれらのチェックを行う必要がある場合、メモリを大幅に消費する可能性があります。
このため、Robloxエンジンが空間クエリ操作のために考慮する必要がないオブジェクトについては、このプロパティを無効にすることをお勧めします。このプロパティを無効にする場所を決定する際には、各アセットがゲームプレイに与える影響を考慮してください。たとえば、最終的なサンプルレーザータグ環境では、ユーザーがレーザーを発射する際にエンジンがこれらの表面を考慮する必要があるため、建物内のすべての壁に対してこのプロパティが有効になっています。エンジンがこれらのアセットを考慮しない場合、レーザーは建物を通り抜けることになります。
CastShadow
BasePart.CastShadowプロパティは、オブジェクトが影を落とすかどうかを決定します。このプロパティをPartまたはMeshPartに対して有効にすると、Robloxエンジンはランタイムでオブジェクトのすべての頂点位置を計算し、太陽から隣接するオブジェクトに向かってレイキャストを描画し、他のオブジェクトと衝突するまで影を作成します。
これらの計算は、幾何学的複雑さのある多くのオブジェクトがある場合、パフォーマンスコストがかかる可能性があります。これは、幾何学的複雑さのあるオブジェクトは、幾何学的に単純なオブジェクトよりも多くのポリゴンを持ち、エンジンがオブジェクトの影を計算するために必要な頂点が多くなるためです。オブジェクト内のポリゴンが少ないほど、操作は速く、影も安価になります。

影は、3D幾何学的深さを持つオブジェクトにリアリズムを与える素晴らしい要素となるため、このプロパティを無効にする場所を決定する際には、オブジェクトが環境に与える視覚的改善の重要性を考慮してください。たとえば、植生の複雑な影は、ユーザーがそれを見る可能性のある屋外空間で没入感を提供しますが、ユーザーが決して相互作用しない天井を通り抜ける植生には、そのような没入感は必要ありません。


DoubleSided
MeshPart.DoubleSidedプロパティは、メッシュ内の両面またはポリゴンをレンダリングするかどうかを決定します。このプロパティを平面のMeshPart(葉、髪、布カードなど)に対して有効にすると、Robloxエンジンはメッシュ内の両面またはポリゴンをレンダリングし、ユーザーがオブジェクトをどの角度から見てもその完全性を確認できるようにします。たとえば、以下の木の葉は単面の平面メッシュであり、このプロパティを有効にすると、カメラから離れた葉もユーザーに見えるようになります。


このプロパティは、環境にリアリズムを追加するのに役立ちますが、パフォーマンスコストがかかります。なぜなら、エンジンはオブジェクトのポリゴンを2回レンダリングする必要があるからです:1回はユーザーのカメラに向かっている方向のため、もう1回はユーザーのカメラから離れたメッシュのためです。このパフォーマンスへの影響を軽減するために、最終的なサンプルレーザータグ環境では、リアリズムに強い視覚的影響を与えるために、植生に対してのみこのプロパティを有効にしています。
CollisionFidelity
MeshPart.CollisionFidelityプロパティは、メッシュまたはユニオンの物理ヒットボックスがその視覚表現にどれだけ近いかを決定します。デフォルトでは、この設定はメッシュのポリゴン形状とほぼ同じヒットボックスをレンダリングします。つまり、ユーザーがオブジェクトに衝突する場所は、メッシュの実際のジオメトリに似ています。たとえば、以下の画像の城のメッシュは、ジオメトリの形状にほぼ一致するデフォルトのヒットボックスを持っています。


このプロパティを異なる値に設定して、メッシュのヒットボックスの精度を低下させることができます。たとえば、このプロパティをHullに設定すると、Robloxエンジンはメッシュのヒットボックスの頂点を大幅に減少させ、Boxに設定すると、メッシュを囲む立方体にヒットボックスが減少します。さらに、メッシュのヒットボックスの精度を高めたい場合は、このプロパティをPreciseConvexDecompositionに設定して、ヒットボックス内の頂点の数を増やすことができます。



BasePart.CastShadowと同様に、Robloxエンジンがレンダリングする必要がある頂点が多いほど、パフォーマンスコストが高くなります。このため、ユーザーが各メッシュとどのように相互作用するかを考慮し、エンジンがメッシュのヒットボックスをレンダリングするために必要な頂点の数を減らすことができるかどうかを確認することが重要です。ヒットボックスが正確である必要がない場合は、このプロパティをBoxまたはHullに設定します。
この概念を示すために、最終的なサンプルレーザータグ環境の1階と2階の間に高低差を提供する壁モデルのすべてのメッシュのヒットボックスを表示する以下の画像を参照してください。メインの壁のデフォルトのヒットボックスは、ユーザーがその方向に移動できないようにするために必要な表面を提供するだけで、不要なジオメトリが多く含まれています。このメッシュのプロパティをBoxに設定すると、ヒットボックスの目的を維持しながら、この冗長なジオメトリを削除できます。



これらの決定を行う際には、デフォルトの値を変更することがユーザーにどのように悪影響を与えるかを考慮することが重要です。たとえば、壁モデルのトリムメッシュに対してプロパティをBoxに設定すると、ユーザーが壁の近くでジャンプしようとしたときにヒットボックスに衝突します。代わりに、これらのメッシュをHullに設定して、頂点数を減らしながらヒットボックスをメッシュのジオメトリの形状に近づけます。


メッシュの形状に正確に適合するヒットボックスを持つことが重要な場合があります。特に、ユーザーがその形状にどのように衝突するかを正確に制御する必要がある場合です。たとえば、最終的なサンプルレーザータグ環境では、ユーザーがドアの端にのみ衝突し、ドア自体には衝突しないことが重要です。そうでないと、戦闘ポケットに出入りできなくなります。

RenderFidelity
MeshPart.RenderFidelityプロパティは、ユーザーに表示されるメッシュの詳細レベルを決定します。このプロパティをEnum.RenderFidelity.Automaticに設定すると、ユーザーがメッシュから遠ざかるにつれてメッシュの精度が低下し、このプロパティをEnum.RenderFidelity.Preciseに設定すると、メッシュのすべての頂点が距離に関係なく正確にレンダリングされます。
エンジンがユーザーに対してどの距離からでも正確にレンダリングする必要があるオブジェクトが多いほど、特に高い頂点数を持つ場合、パフォーマンスコストが高くなります。このため、サンプルアセットライブラリ内の植生のような幾何学的複雑さのあるオブジェクトに対しては、このプロパティをEnum.RenderFidelity.Performanceに設定することをお勧めします。なぜなら、これらのオブジェクトは、ゲームプレイの要件から距離から完全に表示する必要がないからです。これにより、全体的な視覚品質を損なうことなく、ゲームのポリゴン数を減らすことができます。
アセットをパッケージに変換
すべてのモジュラーアセットがStudioにあり、すべてのユーザーに対して高い視覚品質を維持するためにレンダリングパラメータが設定されているので、これらをパッケージに変換する時が来ました。アセットをパッケージに変換することは、現在のゲームや他のプロジェクトで繰り返し再利用できるようにするために重要です。さらに、パッケージに対して簡単に編集を行うことができ、その変更がすべてのインスタンスに即座に反映されるため、反復プロセスで多くの時間を節約できます。
SurfaceAppearanceオブジェクトはすでにパッケージであるため、Modelオブジェクトをパッケージに変換すると、それらはネストされたパッケージになります。ネストされたパッケージは、Modelオブジェクトパッケージとは独立して変更できる子オブジェクトの複雑な階層を維持することを可能にします。これにより、アセットの個々のコンポーネントをより細かく制御できます。

モジュラーアセットとプロップをパッケージに変換するには:
エクスプローラーウィンドウで、モジュラーアセットまたはプロップを右クリックし、コンテキストメニューからパッケージに変換を選択します。パッケージに変換ダイアログが表示されます。
タイトルと説明フィールドを入力し、所有権を自分またはグループに設定し、送信ボタンをクリックします。完了すると、モデルのアイコンの上に鎖のリンクシンボルが表示され、パッケージとして識別されます。

各モジュラーアセットとプロップについてこのプロセスを繰り返します。
アセットライブラリの全体的なレイアウトに満足したら、新しくポリッシュされたアセットで環境を装飾し、3D空間の追加要素を構成して、あなたの世界に命を吹き込むことができます。