アセット、アニメーション、Prefab、マテリアル、ライトマップなどのエクスポート
Last updated
Last updated
UnityシーンにExportInfo
コンポーネントを追加すると、テンプレートから新しいWebプロジェクトを生成したり、エクスポートしたい既存のWebプロジェクトにリンクしたり、他のライブラリやパッケージへの依存関係を設定したり、プロジェクトをデプロイしたりできます。
デフォルトでは、シーンは保存時にエクスポートされます。この設定は、ExportInfo
コンポーネントでAuto Export
を無効にすることで変更できます。
メッシュ、マテリアル、アニメーション、テクスチャなどをエクスポートするには、Hierarchyで新しいGameObjectを作成し、それにGltfObject
コンポーネントを追加します。これが新しいglTFファイルのルートになります。シーンを変更して保存するたびにエクスポートされます。
エクスポートされるのは、これらのルートオブジェクト上および内部のスクリプトとデータのみです。それらの外部にあるスクリプトとデータはエクスポートされません。
ルートオブジェクトの子としてCubeを追加し、シーンを保存します。出力のassets/
フォルダ(を参照)に、ルートGameObjectと同じ名前の新しい.glb
ファイルが含まれていることに注意してください。
Smart Export
設定(Edit/Project Settings/Needle
から)を有効にすると、このオブジェクトのHierarchyで変更が検出された場合にのみエクスポートが行われます。
:::details 特定のオブジェクトがエクスポートされないようにする方法EditorOnly
タグを持つオブジェクトは、その子Hierarchyを含めてエクスポート時に無視されます。
これは、無効化されたオブジェクトが後で有効になった場合でもエクスポートされるため、無効化よりも推奨されます。
:::
アプリケーションを複数のレベルまたはシーンに分割したい場合は、単純にSceneSwitcher
コンポーネントを使用できます。アプリケーションを複数のシーンまたはPrefabに構造化し、それらをSceneSwitcher配列に追加して実行時に読み込み/解放することができます。これは、すべてのコンテンツを最初に読み込むのを避け、読み込み時間を短く保つのに最適な方法です(例えば、では、Webサイトの各セクションを独自のシーンに分離し、必要なときにのみ読み込むことでこれを行いました)。
最大50 MB(非圧縮)のエクスポートサイズ(通常、圧縮後は約10-20 MBになります)
最大50万頂点(モバイルVRもターゲットとする場合はさらに少ない)
最大4x 2kライトマップ
シーンとPrefabを複数のglTFファイルに分割し、必要に応じて(必要なときにのみ)それらを読み込むことができます。これにより、読み込みパフォーマンスが速くなり、ファイルサイズが小さく保たれます。 を参照してください。
ここでのシーンの複雑さは、様々なWeb対応デバイスと帯域幅で良好なパフォーマンスを確保するために推奨されるものです。これには、デバイスの能力を超えた技術的な制限はありません。
Prefabのエクスポートはネストにも対応しています。Prefab内のコンポーネントは別のPrefabを参照でき、それもエクスポートされます。 このメカニズムにより、シーンを可能な限り軽量にし、最も重要なコンテンツを最初に読み込み、追加コンテンツの読み込みを遅延させることができます。
Prefabアセットと同様に、他のシーンアセットを参照できます。
まず、UnityEditor.SceneAsset
フィールドを持つコンポーネントをUnityで作成し、GltfObject内のGameObjectsのいずれかにそれを追加します。参照されたシーンは別のglTFファイルとしてエクスポートされ、TypeScriptからAssetReference
として読み込み/デシリアライズできるようになります。
参照されたシーン内で作業を続けながら、メインのエクスポーターシーン/Webサイトを更新することも可能です。シーン保存時またはプレイモード変更時に、現在のシーンが現在実行中のサーバーで使用されているかどうかを検出し、そのglbのみの再エクスポートをトリガーします。(このチェックは名前で行われます - <web_project>/assets/
フォルダ内にglbが存在する場合、それは再度エクスポートされ、メインシーンがそれを再読み込みします。)
スクリプトの1つからPrefabを参照して読み込みたい場合は、AssetReference
型を宣言できます。
最小限の例を以下に示します。
Needle Engineは、Unityのアニメーション機能のかなり強力なサブセットをサポートしています:
Timeline アクティベーショントラック、アニメーションラッグ、トラックオフセットを含む
Animator トップレベルの状態遷移を含む
Blend treesは現在サポートされていません。
サブステートマシンは現在サポートされていません。
AnimationClips ループモードを含む
Procedural Animations スクリプトを介して作成できます
現在の1つの制限は、エクスポート時にマテリアルが複製されないことです。例えば、同じマテリアルを異なる色でアニメーションさせたい場合は、現在マテリアルを2つに分割する必要があります。
UnityのSkyboxとカスタムのリフレクション(もしあれば)は、エクスポート時にテクスチャにベイクされ、NEEDLE_lightmaps
拡張機能内に自動的にエクスポートされます。
Skyboxの解像度を変更するには、シーンにSkyboxExportSettings
コンポーネントを追加します。
glbファイルでSkyboxを全くエクスポートしたくない場合は、GltfObject
コンポーネントのEmbed Skybox
オプションのチェックを外すことができます。
デフォルトでは、マテリアルはエクスポート時にglTFマテリアルに変換されます。glTFは物理ベースのマテリアルモデルをサポートしており、複雑なマテリアルを表現するのに役立つ多くの拡張機能を持っています。
エクスポートされるものを完全に制御するには、UnityGltfが提供するglTFマテリアルを使用することを強く推奨します。
PBRGraph
UnlitGraph
::: tip 迷ったらPBRGraphシェーダーを使用してください PBRGraphマテリアルには、StandardまたはURP/Litよりもはるかに多くの機能があります。これには、屈折、虹彩、光沢などの高度な機能が含まれます。さらに、PBRGraphおよびUnlitGraphを使用するマテリアルは、変換なしでそのままエクスポートされます。 :::
そのまま変換可能なマテリアル:
BiRP/Standard
BiRP/Autodesk Interactive
BiRP/Unlit
URP/Lit
URP/Unlit
カスタムのUnlitシェーダー(例えばShaderGraphで作られたもの)をエクスポートするには、エクスポートしたいシェーダーにExportShader
Asset Labelを追加します。Asset LabelはInspectorウィンドウの下部で確認できます。
現在、カスタムのUnlitシェーダーのみをサポートしています。Litシェーダーの変換は公式にはサポートされていません。
カスタムLitシェーダーは現在実験的です。すべてのレンダリングモードがサポートされているわけではありません。
カスタムシェーダーでのシャドウレシービングはサポートされていません。
カスタムシェーダーを使用したスキニングメッシュはサポートされていません。
Unityからthree.jsおよびglTFに移行する際に複数の座標系の変更があるため、高度なエフェクトを機能させるにはいくつかの変更が必要になる場合があります。エクスポート時にデータを変換しようとしますが、変換が必要なすべてのケースを検出できない場合があります。
UnityのUV座標は左下から始まります。glTFでは左上から始まります。
glTFでは、X軸の値がUnityと比較して反転します。これは左手系から右手系への座標系変更の一種です。シェーダーで使用されるデータは、正しく表示するためにXで反転する必要がある場合があります。
::: note glTF仕様の一部ではありませんカスタムシェーダーはglTF仕様の公式な一部ではないことに注意してください。カスタムシェーダーの当社の実装では、KHR_techniques_webglと呼ばれる拡張機能を使用しており、WebGLシェーダーコードをglTFファイルに直接保存します。結果として得られるアセットはNeedle Engineベースのビューアでは機能しますが、他のビューアでは正しく表示されない場合があります。 :::
複数のシーンで作業する場合は、「Auto Generate」を無効にして、ライトマップを明示的にベイクしてください。そうしないと、Unityはシーン変更時に一時的なライトマップを破棄します。
Lightmap Encoding: Normal Quality (Project Settings > Playerで調整)
Progressive GPU (高速で、通常は小規模シーンで十分な精度)
Non-Directional Lightmaps
Max Lightmap Size 2k (これより高くすることも可能ですが、ファイルサイズが大きくなることを想定してください)
シーンあたり最大4x 2kライトマップ (これより高くすることも可能ですが、ファイルサイズが大きくなることを想定してください)
Compress Lightmaps OFF (品質が向上します。そうしないと、エクスポート時に再び圧縮されます)
Unityがライトと環境を処理する方法と、three.jsがそれを処理する方法の間には、100%のマッピングはありません。例えば、Unityではライトマップされたオブジェクトと非ライトマップされたオブジェクトでコードパスが完全に分かれており(ライトマップされたオブジェクトはすでにマップにベイクされているため、環境光を受け取りません)、three.jsはそのように区別しません。
これは、シーンでベイクされたオブジェクトと非ベイクされたオブジェクトを混在させる場合に、最良の結果を得るために特定の推奨設定があることを意味します。
シーンにベイクされたオブジェクトがない場合、以下の設定でも正しい結果が得られるはずです。
ページはAIによって自動翻訳されました
Prefabは個別のglTFファイルとしてエクスポートされ、実行時にインスタンス化できます。PrefabをglTFとしてエクスポートするには、Prefabアセット(プロジェクトブラウザから、シーン内ではなく)をだけです。
の例では、各セクションが別々のシーンとして設定されており、エクスポート時には複数のglbファイルにパックされ、必要に応じて読み込まれます。
@
Needle Engineは、新しいをサポートする最初期のものの1つです。 これは、スクリプト変数を含むほぼすべてのプロパティがアニメーション可能であることを意味します。
他のマテリアルは、プロパティ名ヒューリスティクスを使用して変換されます。これは、マテリアルとシェーダーが使用するプロパティ名に応じて、カスタムシェーダーのプロパティをURP/LitまたはPBRGraphのプロパティ名を使用するようにリファクタリングするか、マテリアルをとしてエクスポートする必要がある場合があることを意味します。
ライトマップをエクスポートするには、Unityでだけです。ライトマップは自動的にエクスポートされます。
2021.3+
2020.3+