アセットライブラリの構築は、ゲーム内の中央の場所にアセットのコレクションをインポートして構成するプロセスであり、簡単にアクセスして再利用できるようにします。このプロセスは、特に各アセットの値を設定してパフォーマンスを向上させ、中〜低スペックのデバイスでのメモリ使用量を最適化する場合、環境を構築する準備をする際に大幅な時間を節約できます。
環境アート - アセンブリング .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内にアセットがあるので、物理およびレンダリングパラメータを設定することが重要です。これにより、アセットはメモリやGPUの制限があるデバイスで最高の視覚品質を保持できます。一般的に、このセクションのガイダンスに従うほど、ゲームのパフォーマンスが向上します。ただし、各アセットを全体の環境内で配置する場所の文脈を慎重に考慮し、審美的な目標やゲームプレイの要件を維持することが重要です。
アンカー
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回レンダリングする必要があるため、パフォーマンスコストがかかります。ユーザーのカメラに向かっている方向と、ユーザーのカメラから離れたメッシュの両方をレンダリングする必要があるためです。このため、最終的なサンプルレーザータグ環境では、リアリズムの視覚的影響が強い植生に対してのみこのプロパティを有効にしています。
CollisionFidelity
MeshPart.CollisionFidelityプロパティは、メッシュまたはユニオンの物理ヒットボックスがその視覚表現にどれだけ密接に一致するかを決定します。デフォルトでは、この設定はメッシュのポリゴン形状とほぼ同じヒットボックスをレンダリングします。つまり、ユーザーがオブジェクトに衝突する場所は、メッシュの実際のジオメトリに似ています。たとえば、以下の画像の城のメッシュは、ジオメトリの形状にほぼ一致するデフォルトのヒットボックスを持っています。


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



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



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


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

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

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

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