リアルタイム3D産業用アプリケーションをより迅速に構築する:Unity Industry基礎テンプレートからの重要なヒント

May 28, 2026|15 分
Unity_リアルタイム3Dアプリケーションをより速く構築_アセットトランスフォーマー_業界の基本テンプレートからルールセットを作成

プロトタイプからトレーニングアプリケーション、デジタルツイン、ヒューマンマシンインターフェース、製品コンフィギュレーターまで、 Unity Industryで開発および公開できるアプリケーションの種類には、ほぼ制限がありません。

組織でUnityをどのように活用できるかにご興味をお持ちですか?新規加入者の方、あるいはスキルアップを目指す経験豊富なUnity Industry開発者の方でしょうか?エディターを初めて開く場合でも、数々のプロジェクトをリリースしてきたベテラン開発者の場合でも、Unityの強力な機能を最も効率的に活用する方法を学ぶことは常に有益であり、日々の作業をできる限り生産的で楽しいものにするのに役立ちます。

CADから3Dへの変換、レスポンシブUI、コードアーキテクチャなどにより生産性を向上させます。

このガイドでは、 Unity Industry開発者向けの新しいエディター内学習テンプレートであるUnity Unity Industry Fundamentalsテンプレートの概要を説明します。


業界基礎テンプレートは、 Unity HubでUnity Industryの購読者または30日間の無料トライアル利用者向けに提供されています。

業界基礎テンプレートは、 Unity HubでUnity Industryの購読者または30日間の無料トライアル利用者向けに提供されています。

業界の基礎知識から得られる重要なポイント

Unity Industry Fundamentalsテンプレートは、一連のチュートリアルを通して、 Unity Industryプロジェクトに重要な機能を実装するための手順を示します。これには以下が含まれます。

  • Asset Transformer Toolkitを使用して、CADデータをリアルタイムの産業プロジェクトですぐに使用できる3Dアセットに換算および最適化する方法
  • HMIのビルド方法とUIとリアルタイムデータの接続方法
  • 自動ナビゲーションと手動ナビゲーションの両方に対応するナビゲーションシステムを実装する方法
  • 複雑で大規模な環境のシミュレーションにおいて、ユーザーが常に必要なビューを得られるように仮想カメラを設定する方法
  • ScriptableObjectsを使用してロボットの動作、状態管理、データフローをハンドルC#スクリプトを設計し、データレイヤーの疎結合を維持する方法

「業界の基礎」の目的は、 Unity開発体験をより効率的、集中的、かつ生産的なヘルプにすることです。ここで得られるヒントは、ヒューマンマシンインターフェース(HMI)、トレーニングシミュレーション、デジタルツイン、製品コンフィギュレーターなど、多くの種類のリアルタイム3D産業アプリケーションに適用できます。

業界の基礎テンプレートを入手する

開始前に、まだテンプレートを見つけてダウンロードしてください。

Unity Industryの購読者の場合

1.Unity Hubを開き、 Unity 6.4にアップグレードしてください。

2.新しいプロジェクトを作成してから「業界の基礎」を検索か、学習カテゴリに移動してそこからテンプレートを選択してください。

Unity Industryのサブスクリプションをお持ちでない場合:

1.無料トライアルページにアクセスし、指示に従って無料トライアルをご利用ください。

2.トライアルが開始されたら、業界向け購読者と同じ手順に従ってください。

Unity Industryを無料でお試しください

探るおよび変更可能なテンプレート

自動モードの管理画面UIと倉庫のミニマップ

自動モードの管理画面UIと倉庫のミニマップ

このテンプレートは、 3Dインタラクティブ産業アプリケーションを作成するためのワークフローと手順を解説する4つのチュートリアルで構成されています。Unity エディターでプロジェクトを開くと、完成したシーン「Warehouse」がScenesフォルダー内にあります。このシーンは、複数のロボットがフロア全体に配置され、在庫の取り出し、保管、移動を行う準備が整った、完全に構築された倉庫環境です。

このデモシーンは、ラピッドプロトタイピングのために設計されています。独自の3Dモデルをシーンにドラッグ&ドロップし、コンポーネントを1つ接続するだけで、すべてが自動的に配線されます。作成したアセットはUI上に表示され、瞬時に自律型ロボットとして動作し、環境内を移動したり、UIの入力と出力に反応したりします。

ゲームビューを開き、再生モードに入ると、シミュレーションされた倉庫内で操作を開始できます。UIを通して各ロボットを制御・監視でき、ロボットのバッテリー残量や状態などのリアルタイムデータが表示されます。ユーザーインターフェースには、ロボットが現在どこにいるかを示すミニチュアマップが表示されます。また、自動から手動モードに切り替えることで、ロボットの設定の一部を手動でオーバーライド、WASDキーを使って各ロボットの動きを制御したりすることもできます。各ロボットのスピードを調整し、スライダーを使ってアームの長さを調節してください。

この倉庫シミュレーションの主な特徴を見ていきましょう。

時計:スタートガイド

時計:業界の基礎知識:スタートガイド

アセットトランスフォーマーツールキット:CADから最適化された3Dアセットまで

Industry Fundamentalsテンプレートのメイン倉庫サンプルシーンで使用されているロボット3Dモデルの1つ

Industry Fundamentalsテンプレートのメイン倉庫サンプルシーンで使用されているロボット3Dモデルの1つ

CADソフトウェアは、モデルにおける数学的な精度と幾何学に基づいた詳細を優先する一方、リアルタイムアプリケーションは、視覚的な品質と、管理可能なポリゴン数、効率的なテクスチャサンプリング、および取捨選択とバッチ処理が可能な階層構造といった実用的なパフォーマンス上の考慮事項とのバランスを取る必要がある。

Unity Industryライセンスに含まれるUnity Asset Transformer Toolkitは、組織のCADデータとUnityプロジェクトをつなぐ架け橋となるツールです。自動化されたデータ準備ワークフローを通じて、既存のデータをUnityにシームレスに統合し、時間と労力を節約します。あらゆる3DファイルまたはCADファイルをインポートでき、複数回のインポートやモデルの再作成が不要になります。メッシュのサイズと品質を完全に制御できるため、ターゲットデバイスでのデータを最適化することができます。

業界の基礎の例では、 Unityに新しいロボットアセットをインポートする方法を説明します。オリジナルのCADファイルを基に作成されたロボットモデルは、アセットがあり、見た目も粗いため、洗練されたプレゼンテーションには適さない。アセットトランスフォーマーツールキットは、デスクトップやウェブなどのプラットフォームに適したインタラクティブな3Dアプリケーションで使用するために、モデルを換算および最適化するために使用されます。

エディターでアセットトランスフォーマーツールキットをインストールして開く方法については、このセクションの最後にあるビデオをご覧ください。

まずはツールバーを見て開始ましょう。

Asset Transformer Toolkit のツールバーをご覧ください。

アセットトランスフォーマーツールキットのツールボックス

アセットトランスフォーマーツールキットのツールボックス

ツールバーで利用できる操作について、簡単に説明します。

  • インポートモデル:ここをクリックして、CADデータをUnityに取り込むためのインポートプロセスを開始。
  • メッシュと最適化:これらを使用してジオメトリを縮小し、穴や内部面例えばの不要な詳細を削除します。
  • リメッシュ:この特徴を使用すると、高性能なユースケース向けにジオメトリを完全にリビルドできます。
  • 階層構造:これらを使用して、CADアセンブリから取り込まれた乱雑なオブジェクト構造をクリーンアップ。
  • Transform:モデル内のピボットポイントや整列の問題を迅速に修正。
  • 紫外線と衝突型加速器:これらの設定を使用して、 Unityがテクスチャリングや物理ベースのインタラクションに必要なデータを生成します。

インポート時にモデルの設定と変更を保持する

このガイドではインポートの手順については詳しく説明していません。エディター内のチュートリアルと、このセクションの最後にあるビデオで、重要な手順をすべて確認できます。

ここで強調しておきたいキー点は、インポートしたいファイルを選択すると、プロジェクトウィンドウのアセットフォルダーに、モデルと同じ名前のScriptableObjectが作成されるということです。

これは実際のモデルではありません。ここでの利点は、ScriptableObjectにはモデルをインポートするために使用できる設定のコレクションが含まれており、モデルの設定と変更を保持できることです。CADモデルに変更が加えられ、再インポートする必要がある場合でも、すべてを最初から設定し直す必要はありません。これらの設定はすべてScriptableObjectに保存されます。

インポートするファイルを選択すると、プロジェクトウィンドウのアセットフォルダーに、モデルと同じ名前のScriptableObjectが作成されます。このScriptableObjectには、モデルをインポートする際に使用できる設定のコレクションが含まれており、モデルの設定や変更内容を保持することができます。

インポートするファイルを選択すると、プロジェクトウィンドウのアセットフォルダーに、モデルと同じ名前のScriptableObjectが作成されます。このScriptableObjectには、モデルをインポートする際に使用できる設定のコレクションが含まれており、モデルの設定や変更内容を保持することができます。

ScriptableObjectを選択してInspectorウィンドウを開くと、上部にインポートモードフィールドが表示され、これをPrefabまたはSceneに設定できます。

  • プレハブ:単一オブジェクトの場合
  • シーン:数千、あるいは数百万ものオブジェクトを含む高層ビルなど、非常に大規模で詳細なアセットの場合

Inspectorには、次の3つのタブも用意されています。モデル、ルールエンジン、およびLOD:

  • モデル:ここから、モデルのインポートパラメータを設定できます。これは、Rawのソースモデルを最適化された3Dアセットに変換するステップです。
  • ルールエンジン:モデルのデータ準備を、データ取り込みステップから直接自動化できるルールセットを定義します。ルールセットは、ソースモデルが進化するにつれて再インポート必要がある場合に特に役立ちます。ルールエンジンとルールセットの概要については、次のセクションを参照してください。
  • LOD(レベル・オブ・ディテール) :LODを生成するためのLODルールを追加します。これらは、最終ステップとして、モデルインポートプロセス中に直接生成できます。

設定が完了したら、 [インポート]をクリックすると、モデルプレハブがProject ウィンドウの[アセット] > [3Dモデル]フォルダーに追加されます。モデルをシーンビューにドラッグ&ドロップすると、階層構造にも追加されます。

時計:Unity Asset Transformer Toolkitをインストールします

YouTube video

3Dアセットを最適化する

アセットトランスフォーマーツールキットは、インポートされたモデルをクリーンアップ、リアルタイム環境向けに準備するためのツールを提供すると同時に、視覚的な忠実度と必要なメタデータを維持します。これは、前述のルールセットを使用してインポート処理中に自動的に実行することも、インポート後にアセットトランスフォーマーツールバーのツールを使用して個別の操作として手動で実行することもできます。

階層構造を整理する

テンプレートで、新しいロボットアセットをインポートする手順を実行すると、階層構造体が過度に複雑になっていることがわかります。1というゲームオブジェクトのような基本要素のいずれかをクリックすると、そのInspectorで、そのパーツに関連付けられたすべてのメタデータがコンポーネントに追加されていることがわかります。しかし、その子オブジェクトにはメッシュフィルターが含まれており、実際の形状と現在割り当てられているマテリアル情報が表示されます。

1オブジェクトの子ゲームオブジェクトに Mesh Filterコンポーネントが追加されました。

1オブジェクトの子ゲームオブジェクトに Mesh Filterコンポーネントが追加されました。

メタデータとともにそれらの詳細情報をすべて1つのオブジェクトにまとめておく方が、分離しておくよりも効率的です。

この問題を修正には、マージツールを使用してください。デフォルトでは、マージツールは「すべてマージ」に設定されています。これを適用すると、すべてが単一のプレハブにマージしまうため、適用しない方が良いでしょう。すべてのオブジェクトの最終レベルを維持したい。ドロップダウンメニューで「最終レベル」オプションを選択すると、マージツールは階層内のリストを順にたどり、各ツリーの最後のオブジェクトを見つけて、そのすぐ上のオブジェクトとマージ。

マージツール_Unity_Asset Transformer Toolkit

Asset Transformer Toolkit のマージツール

詳しい手順については、こちらの動画をご覧ください。

デシメーション

モデル内の不要な形状を削除することで、モデルを軽量化できます。Asset Transformer Toolkit の「統計」オプションは、選択したモデル、またはモデルの一部に関する統計情報を表示します。このテンプレートチュートリアルでインポートするCADモデルは、最適化前の段階で510個のゲームオブジェクトと60万個以上の三角形を含んでおり、非常に高密度なモデルとなっています。このビデオをご覧いただくと、新型ロボットモデルの穴がどのように除去されるかがわかります。

デバッグメニューをアクティブにしてビューを頂点比率に変更することで、モデルの密度を調べます。これは、シーン内の他のすべての要素と比較して、極めて密度が高いオブジェクトが存在する場所を赤色で示しています。これは、モデルを最適化するためにデシメーションを使用できる箇所を示す良い指標です。

スケールな壊滅

スケールな壊滅

今回のようにモデルに多くのジオメトリが含まれている場合、デシメーションは面倒な作業になる可能性があります。つまり、スケール間引きを行うオプションもあるということです。

デシメーションツールの「基準」オプションを「品質」に設定し、階層構造でCADモデルの最上位レベルを選択することで、目標とする品質レベルを選択し、ツールを実行してすべてにデシメーションを適用できます。

このアクションを品質を低く設定したロボットアセットに適用すると、三角形の数が65%削減れ、その数は20万個弱になり、モバイルでの実行に最適化されました。

法線を調整する

このような高度な最適化を行う際によく発生する問題の一つは、モデルの滑らかさを損なう可能性があることです。ライトの下での見た目や見え方は、デシメーション後に変化する可能性があり、突然アーティファクトが現れたり、以前よりも角が硬くなったりすることがあります。それは、モデルの法線を調整することで修正できます。アセットトランスフォーマーツールキットには、モデルの法線を調整またはリセットさまざまなツールが用意されています。

時計:CADモデルを最適化する

YouTube video

ルールセットを使用すると、アセットの再インポート時に時間を節約できます。

CADモデルは設計プロセス中に何度も修正されることが多く、CADアプリケーションで変更を加えた後にモデルを再インポートたびに上記のアクションをすべて実行する必要があると、非効率になる可能性があります。

デザインプロセスのどの段階にいるか、またデザインの反復回数がいくつあるかによっては、それは面倒なプロセスになりかねません。

そこにこそ、ルールセットが大きな利点をもたらすのです。Asset Transformer Toolkitのルールエンジンで設定するルールセットは、 Unityがインポート時に従う、または手動で適用できる一連の命令(アクションと呼ばれる)であり、CADモデルに通常適用したい多くのアクションを自動化します。

ルールセットを作成する

ルールセットとは、基本的にレシピのようなもので、指定された基準に基づいてアセットトランスフォーマーツールキットが特定のオブジェクトを見つけ出し、指定したアクションを適用するように指示するものです。例えば、CADファイル内でこのマテリアル名を見かけたら、それをこのUnityマテリアルにマップ。このパターンで命名された部品を見つけたら、それらをまとめてグループ化してください。ポリゴン数がこのしきい値を超えた場合、 LODレベルを生成します。これらのルールを使えば、本来なら面倒な手作業を自動化できます。

業界基礎テンプレートには、ルールセットフォルダーにいくつかの事前構築済みルールセットが含まれています。それらは、その機能だけでなく、最適化の優先順位付けについて考えるきっかけを与えてくれるという点でも、研究する価値がある。テンプレートでは、1つのルールセットがロボットモデルを処理します。ロボットモデルは、ユーザーが注目する腕の関節部分には高いディテールが必要ですが、目立たない土台部分はディテールを低くしても問題ありません。もう1つは倉庫環境を扱うもので、形状は単純だが量が多いため、積極的なLOD生成が理にかなっている。

インポート時に、デシメーションと階層構造のクリーンアップ処理を自動プロセスとして適用するルールセットがあります。このテンプレートには、モデルの視覚的な忠実度を高めるために、アンビエントオクルージョンを頂点データに自動的にベイク別のルールセットも含まれています。最後に、インポート処理中にマテリアルやオブジェクトをスワップ方法を示すルールセットがあります。

ルールセットを作成するには:

1.プロジェクトフォルダー内で右クリックし、 [作成] > [アセットトランスフォーマー] > [ルールセット]を選択します。

2.ルールセットの名前を設定してください。

3.専用タブ(Inspectorの横に自動的に開きます)からルールセットを編集します。

4.フィルター、アクション、追加ルール例えば、項目をシーケンスに追加します。ルールは上から下へ、順番に適用されます。

下の画像を見ると、右側にルールセットが開いています。最初のアクションはデフォルトで「取得」に設定されています。これによりシーン内のオブジェクトが取得され、その後に続くすべての処理はその選択されたオブジェクトに適用されます。

ロボットモデルの1つに対するルールセット(右)

ロボットモデルの1つに対するルールセット(右)

取得」アクションはロボットモデル全体を選択し、以降のアクションもロボットモデル全体に​​適用されます。そのため、以降のアクションを適用したい特定の要素を見つける方法が必要です。そのためには、このルールにフィルタアクションを追加し、アクションを「メタデータでフィルタ」に設定して、CADモデルとともにインポートされたメタデータを使用するようにします。

資産を効率的に再輸入する

上記のようなルールセットは、以下の方法で手動で実行できます。

  • 適用したいオブジェクトを選択します
  • ルールセットを選択し、実行ボタンをクリックします。

ただし、インポート処理の一環としてルールセットが自動的に適用されるように設定することも可能です。それを設定するには、 Assets > 3DModelフォルダーに作成されたインポート設定 ScriptableObject を選択すると、そのInspectorでインポートボタンの名前が再インポートに変更されていることがわかります。

「ルールエンジン」ボタンを選択し、インポート処理中に実行するルールセットを指定します。

この設定後、 「再インポート」ボタンを選択すると、CADモデルが再インポートされるたびに、指定されたルールが適用されます。インポートルールの中に複数のルールルールセットをネストことで、インポート処理中にそれらがすべて適用されるようにすることもできます。

時計:ルールセット

YouTube video

時計:上級者向けルールセット

YouTube video
Unity Industryを無料でお試しください

テンプレートに新しいロボットを追加する

CADデータをインポート、最適化、そして自動化する方法を理解したら、次はシミュレーション内で、このCADデータを機能的なデータ駆動型ロボットに変換する段階です。

このテンプレートには、プロセスを進めるために必要なすべてのコンポーネントが含まれています。これには、モデルをUIにリンクし、異なるロボットのバリアントを切り替えられるように設定し、ロボットの動作をリアルタイムでテストするためのC#スクリプトも含まれています。

テンプレートで説明されているワークフローの1つを見てみましょう。

倉庫のシーンには複数のロボットが存在しており、新しいロボットモデルを他のロボットと同じ機能を持つように設定したいと考えている。そのためには、モデルを再インポート必要があります。ルールセットが既に設定されているため、これは効率的で予測可能なプロセスです。手順は以下のとおりです。

1.プロジェクト > 3Dモデルの中に、以前に設定したすべての設定を含むインポート用ScriptableObjectアセットがあります。Inspectorを開き、 「ルールエンジン」タブでインポートルールが正しく設定されていることを確認してください。

このモデルに以前に設定されたルールセットを含むルールエンジンタブ(右側)

このモデルに以前に設定されたルールセットを含むルールエンジンタブ(右側)

2.「モデル」タブで、 「メタデータのインポート」設定が選択されていることを確認してください。これは、フィルターとすべてのルールセットが正しく機能するために不可欠です。

3.モデルを再インポートすると、 [アセット] > [3Dモデル]に表示されます。そこからシーンビューにドラッグアンドドロップできます。

4.階層構造を見ると、シーン内の既存のロボットは親のRobots ゲームオブジェクトの下にネストされていることがわかります。これを展開し、子ロボットオブジェクトのいずれかを選択すると、ロボットデータスクリプタブルオブジェクトが添付されたロボットスクリプトが見つかります。このスクリプタブルオブジェクトには、各ロボットに関するすべての情報が含まれています。

ロボットデータSOスクリプタブルオブジェクトには、各ロボットに関するすべての情報が含まれています。

ロボットデータSOスクリプタブルオブジェクトには、各ロボットに関するすべての情報が含まれています。

5.Assets > Warehouse > RobotDataフォルダーを見ると、現在シーンにある 4 台のロボットそれぞれに、個別の RobotDataSO ScriptableObject があることがわかります。新しいロボットにも同じScriptableObjectをアタッチする必要があります。

6.そのためには、[Assets]フォルダーを右クリックし、 [作成] > [業界テンプレート] > [ロボットデータ]を選択します。ロボットの型番に合わせて名前を付けてください。

7.追加した新しいロボットをクリックしてInspectorを開き、 「コンポーネントの追加」をクリックします。ドロップダウンリストから「Robot.cs」という名前のロボットスクリプトを探して追加します。

8.新しいロボットのScriptableObjectを新しいスクリプトのDataフィールドにドラッグすると、このロボットが他のロボットと同じように動作するために必要な他のすべてのスクリプトとコンポーネントが自動的に追加されます。

テンプレート内のチュートリアルに従って、CADデータを取得し、それをリアルタイムアプリケーションに取り込んでデジタルツインを作成し、UIを通してロボットを監視するための制御を設定する各ステップを確認してください。

時計:UIとインタラクティビティ

YouTube video

UI Toolkitを使用して監視管理画面を作成します。

Unityには、ユーザーインターフェース(UI)を作成するための2つのシステムがあります。Unity UI (uGUI) およびUI Toolkit。Industry FundamentalsはUI Toolkitを使用しています。

UI Toolkitは、プラットフォームを問わず最適なパフォーマンスと適応性を実現するように設計されており、標準的なウェブ技術から着想を得ています。ウェブページやアプリケーションの開発経験がある方であれば、 UI Toolkitの基本的な概念は既にご存知でしょう。UI Toolkitは、マークアップ言語とスタイルシートに関する既存の知識を活用できる強力なツールとワークフローを提供します。

UI Toolkit:標準的なウェブ技術に触発されて

UI Toolkit を使用すると、HTML、CSS、 JavaScriptと同様に、UI の構造体、スタイル、動作を分離できます。

UXMLは、HTMLとXMLにヒントを得たマークアップ言語であり、UI構造体と再利用可能なテンプレートを定義します。C#でUIをビルドこともできますが、UXMLを使用すると、UnityのUIビルダーウィンドウ内でUIレイアウトを操作することができ、視覚的なオーサリング体験が得られます。

スタイルシートとは、UIに視覚的なスタイルやレイアウトルールを適用するものです。CSSと同様に、USSは標準的なCSSプロパティの一部をサポートしています。C#でスタイルを定義することもできますが、USS(Unified Style Standard)を使用することをお勧めします。USSを使用すると、UI全体でスタイルを再利用できるため、統一感のある外観を実現し、スタイル管理を簡素化できます。

UI Builderで管理画面UIを作成する

UI Builderで管理画面UIを作成する

UI Toolkitは、 UI要素のプロパティをデータソースにリンクできるデータバインディングシステムをサポートしています。これは、データが変更されるとUIが自動的に更新され、その逆もまた同様であることを意味します。

このセクションでは、管理画面のデザインと、データバインディングとの連携方法について見ていきます。

業界の基礎知識における管理画面の配線

管理画面のUIは、左側にロボットのリストが表示され、右側に詳細情報とコントロールが表示されます。

管理画面のUIは、左側にロボットのリストが表示され、右側に詳細情報とコントロールが表示されます。

管理画面は明確なセクションに分かれており、上部に概要情報、左側にロボットのリスト、右側に詳細情報と操作方法が表示されます。ダッシュボードのUSSファイルは、色や間隔の変数、ボタンやステータスインジケーターなどの繰り返し要素のクラスなど、完全なデザインシステムを定義しています。

各ロボットには、標準、警告、重大という3つの状態があり、それらを視覚的に表現する必要がある。USSは、ステータス標準、ステータス警告、ステータス危機という3つのクラスを定義しており、それぞれに異なる背景色が割り当てられています。AC#スクリプトは、ロボットの状態に基づいてこれらのクラスを追加および削除します。ロボットのバッテリー残量が一定のしきい値を下回ると、時間の経過とともにロボットの健全性が低下します。バッテリー残量が少ないほど、健全性の低下は速くなります。ロボットの状態やバッテリーが警告または危険な範囲に陥った場合、ステータスクラスがそれに応じて更新され、オペレーターは管理画面上で即座に視覚的な信号を受け取ることができます。

各ロボットには、標準、警告、重大という3つの状態があり、それらを視覚的に表現する必要がある。

各ロボットには、標準、警告、重大という3つの状態があり、それらを視覚的に表現する必要がある。

実際のプロジェクトでは、この分離によって、デザイナーはコードに触れることなく警告色を調整でき、プログラマーはCSSを理解せずに新しいステータスタイプを追加できるようになります。

UIControllerスクリプト

UIControllerスクリプトがすべてを繋ぎ合わせます。起動時にUI要素への参照をキャッシュし、ボタンやスライダーのイベントコールバックを登録し、ロボットマネージャーのイベントを購読し、状態が変化したときにUIを更新します。このテンプレートは、UI更新における2つのアプローチを示しています。バッテリー残量などの連続値にはデータバインディングを使用し、ロボット選択などの離散イベントには明示的なコード。

データバインディング

UI Toolkitにおけるデータバインディング

UI Toolkitにおけるデータバインディング

すべてのラベルとプログレスバーを手動で更新するコードを書く代わりに、UI要素のプロパティをデータソースのプロパティに接続するバインディングをUXMLで宣言します。データが変更されると、UIは自動的に更新されます。

このテンプレートは、UI要素を各ロボットのRobotDataSO ScriptableObjectに直接バインドします。これにより、バッテリー残量、状態、温度、スピードが提供されます。UXMLでは、「このラベルのテキストは、このデータソースのBatteryプロパティをパーセンテージ形式で表示したものであるべきである」といったバインディングを宣言します。

このバインディングは双方向です。例えば、アーム範囲スライダーは値をディスプレイだけでなく、値を設定することもできます。ユーザーがスライダーをドラッグすると、バインドされたプロパティが更新され、ロボットアームが動きます。UIは単なるディスプレイ面ではなく、操作面となる。

コンバーターはデータバインディングの不可欠な要素であり、データ型とディスプレイ形式の間のギャップを処理します。データソース上のバッテリー値は0から100までのfloat数ですが、「75.0」ではなく「75%」とディスプレイたいのですね。このテンプレートには、書式設定機能を登録するコンバーターアセットが含まれています。バインディング内でこれらのコンバーターを参照すると、データからディスプレイへの過程で値が変換されます。

ミニマップ

管理画面のミニマップ。ミニマップの背景は、オーバーヘッドカメラからのレンダリングテクスチャです。

管理画面のミニマップ。ミニマップの背景は、オーバーヘッドカメラからのレンダリングテクスチャです。

ミニマップは、UI Toolkit内でのカスタムレンダリングの例を示しています。ミニマップの背景は、オーバーヘッドカメラからのレンダリングテクスチャです。ロボットの位置を示すドットは、ワールド座標をUI空間に変換して配置されたUI要素です。毎フレーム、コードは各ロボットのワールド座標を読み取り、それがミニマップ要素上のどこにマッピングされるかを計算し、ドットの位置を更新します。これは、空間的な関係を示すためのシンプルながら効果的な手法です。

時計:UIの詳細解説

YouTube video

自動ナビゲーションと手動ナビゲーションを設定する

倉庫にある事前焼成済みのナビメッシュ

倉庫にある事前焼成済みのナビメッシュ

ロボットはどのようにして移動できる場所を知るのでしょうか?倉庫内には棚、パレット、他のロボットなど、障害物がたくさんあり、それぞれのロボットはそれらを迂回する経路を見つける必要がある。これはUnityのAI Navigationシステムの役割です。

エディターで倉庫シーンを開き、上部のツールバーに移動して、 [表示/非表示の切り替え]ボタンをクリックすると、 ナビメッシュ が青いオーバーレイとしてシーンに表示されます。ナビメッシュとは、 Unityが生成するメッシュで、経路探索やAI制御によるナビゲーションのために、環境内の歩行可能な領域や障害物を近似的に表現するものです。

よりパフォーマンスの高いオプションは、ランタイム時にナビメッシュを作成するのではなく、シーンにナビメッシュをベイクことです。ベイク処理中、ナビゲーションシステムはシーンを分析し、設定したパラメータに基づいて、エージェント(この場合はロボット)が移動できるすべての領域を検出します。

UnityのAI Navigationシステムは、自律制御と手動制御の両方における移動ロジックを処理します。

UnityのAI Navigationシステムは、自律制御と手動制御の両方における移動ロジックを処理します。

テンプレートでは、各ロボットにはナビメッシュ Agentコンポーネントがアタッチされているため、自身のルートを把握しています。例えば、スピード、加速度パラメータ、回避半径、高さなど、調整可能なプリセットもいくつかあります。

ナビメッシュエージェントコンポーネント

ナビメッシュエージェントコンポーネント

移動ロジックの多くはナビメッシュシステムによってマネージいますが、 Assets > Warehouse > Scriptsには、ターゲットの目的地を設定するRandomAgentMovementスクリプトもあります。そのシーンには、あらかじめ定義された特定の目的地が存在する。ランタイム時に、このスクリプトはそれらの目的地のうちの1つをロボットに割り当て、その後、そのロボットが目的地からどれだけ離れているかを継続的にチェックします。ロボットがその目的地に到着すると、そこで数秒間停止する。次に、スクリプトは新しい目的地を割り当てます。NavMeshのおかげで、ロボットは目的地までの最適な経路を自動的に決定し、その経路を進み始めます。

RandomAgentMovementスクリプト

RandomAgentMovementスクリプト

ロボットのような自律型エージェントと並行して、多数のオブジェクトを手動で制御する必要があるアプリケーションでは、課題が生じる可能性がある。ロボットは、ドアの開閉や動く木箱など、動く物体を認識する必要がある。ロボットがこれらの動きを認識するためには、 ナビメッシュの設定に組み込む必要があります。

Industry Fundamentalsでは、これを管理するためにナビメッシュシステムにNavMeshObstacleコンポーネントが追加されます。これは、 ナビメッシュに対してロボットの周囲に指定された領域を切り出すように指示するものです。ロボットが移動すると、周囲も一緒に移動するため、ロボットが棚などの障害物をすり抜けたり、他のロボットと衝突したりするのを防ぐことができる。

ロボットを制御するために手動モードに切り替えると、NavMeshObstacleコンポーネントが割り当てられてアクティブ化され、NavMeshAgentコンポーネントは無効になります。

ナビメッシュに沿って移動する倉庫ロボット

ナビメッシュ上を移動する倉庫ロボット

Unity_Buildリアルタイム3D、より高速な自動または手動ロボットナビゲーション

モードの切り替えは、ロボットのデータScriptableObjectを介して行われます。OperationModeプロパティはAutoまたはManualのいずれかであり、さまざまなコンポーネントがこの値をチェックして、実行する動作を決定します。UIにはモードをトグルとデータアセットが更新され、コンポーネントが反応します。このデータ駆動型のアプローチにより、新しいモードを追加したり、モードの動作を変更したりする際に、複数のスクリプトに手を加える必要がなくなります。

時計:ナビメッシュの解説

YouTube video

Cinemachineを使用したバーチャルカメラシステム

Industry Fundamentalsテンプレートは、 Cinemachineバーチャルカメラシステム(パッケージとしてダウンロード可能)を3つの方法で使用します。

  • アクティブなロボットを追跡するカメラを作成し、異なるカードを選択する際に異なるロボット間のスムーズなブレンドを実現する。
  • 倉庫内を移動するロボットにカメラを固定し、様々な物体をすり抜けないようにするため
  • 3Dビューを管理画面UIに直接プッシュする

基本的な考え方は単純明快だ。シーンには、 Cinemachine BrainコンポーネントによってマネージUnity Camera ゲームオブジェクトが1つあり、複数の仮想カメラによって潜在的なショットが定義されます。Brainコンポーネントは、優先順位に基づいて仮想カメラを切り替えます。最も優先度の高いバーチャルカメラのみが、表示される内容を制御します。

産業の基礎におけるカメラ

倉庫のシーンを開くと、ロボットがいくつか散らばっているのが見えます。これは、独自のロボットを追加する前に作業するための要素として利用できます。シーンに独自のロボットを追加する際には、そのロボットにバーチャルカメラが割り当てられていることを確認する必要があります。

階層構造の中で、デフォルトのショットを提供するCinemachine Shots ゲームオブジェクト を見つけます。

Unity_リアルタイム3Dをより高速に構築_倉庫内のCinemachine仮想カメラ

倉庫内のCinemachine仮想カメラ

「再生」ボタンを押すと、各ロボットにはランタイム時にスクリプトによって追加される独自の「追跡」カメラが設定されます。そのスクリプトは、シーン内にロボットがいくつあるか(新しく追加されたものも含む)のリストを取得し、それぞれのロボットに対して、 Cinemachine CameraコンポーネントとThird-Person Followコンポーネントを作成します。サードパーソンフォローコンポーネントを使用すると、移動するオブジェクトの背後にカメラを作成し、追跡対象として指定されたオブジェクトを追跡させることができます。

CinemachineコンポーネントがアタッチされたRobotFollowCamゲームオブジェクト

CinemachineコンポーネントがアタッチされたRobotFollowCamゲームオブジェクト

管理画面のUIに関しては、 Cinemachineは2つの異なる方法で実装されています。現在レンダリングされているカメラを表示するための3Dカメラと、ミニマップ用の3Dカメラ。ミニマップは、上空からのビューをレンダリングする別のカメラを備えたレンダーテクスチャを使用し、そのビューをレンダーテクスチャに出力します。3Dカメラはテクスチャを使用せず、実行中のアプリケーションからの実際のカメラのビューを、UIの矩形の切り抜きを通してレンダリングします。

Cinemachineを使用すると、柔軟なカメラシステムをビルドできます。Cinemachineの頭脳が、異なるカメラ間の切り替えに関するすべてのロジックをハンドル、実際のメインカメラの位置保持器として機能する仮想カメラを作成します。最後に、リアルタイムアプリケーションの構築に伴う多くの面倒な作業を担う三人称視点追跡カメラなどの追加コンポーネントも提供します。

Unity Industryを無料でお試しください

時計:Cinemachineのウォークスルー

YouTube video

ユニバーサルレンダーパイプライン (URP)で照明を最適化する

ユニバーサルレンダーパイプライン (URP)(URP)は、Unityが提供するスケーラブルなレンダリングのためのソリューションです。高性能デスクトップからモバイルデバイス、ウェブブラウザまで、あらゆる環境で効率的に動作しながら、高品質なビジュアルを生成するように設計されています。産業用途においては、この柔軟性は極めて重要である。展示会でのキオスクディスプレイとして、遠隔地の顧客向けのウェブアプリとして、そして現場技術者向けのタブレットアプリとして、同じアプリケーションが必要になる場合があります。

テンプレートのURP設定は、Settingsフォルダーにあります。レンダーパイプラインアセットは、グローバルレンダリング設定を制御します。これらの設定が何をするのかを理解することで、自分のプロジェクトに合わせて賢明な調整を行うことができます。

インダストリー・ファンダメンタルズ・テンプレートの倉庫シーンに登場するロボットの1体

インダストリー・ファンダメンタルズ・テンプレートの倉庫シーンに登場するロボットの1体

フォワードレンダリング

このテンプレートはForward+レンダリングを使用しており、複数の光源を効率的に処理しながら、範囲ハードウェアとの互換性を維持しています。Forward+ は、スクリーンスペース内でライトをクラスタリングすることで動作するため、シーンにライトを追加しても、従来のフォワードレンダリングのようにパフォーマンスに悪影響を与えることはありません。

アンチエイリアシングは、ジオメトリと背景が接する部分に現れるギザギザしたエッジを滑らかにします。このテンプレートは、品質設定ではMSAAを適用しません。MSAAは最新のGPUでは高速ですが、より多くのメモリを使用するため、階層型アプローチではターゲットデバイスに基づいてスケールできます。

シャドウカスケードを使用する

影は視覚的な品質を高めるが、計算コストが高くなる場合がある。このテンプレートはシャドウカスケードを使用しており、カメラ付近では高解像度の影を、距離では低解像度の影を生成します。

焼き付けライトとライトプローブの組み合わせ

テンプレート内の照明は、ハイブリッド方式を採用しています。倉庫の床、壁、棚などの静的な形状には、焼き付け済みの照明が使用されます。ロボットのようなダイナミック物体は、リアルタイムの照明やライトプローブを使用する。

ライトプローブとは、シーン内の目に見えない点であり、ベイクされた照明をサンプルです。動的オブジェクトがライトプローブの近くを移動すると、その場所の周囲の光を拾い上げる。このテンプレートには倉庫全体にライトセンサーが配置されており、ロボットが環境の上に乗り上げるのではなく、環境に溶け込んでいるように感じられるようになっている。

LightRigシステムは、さらに別のレイヤーを追加します。各ロボットには、そのロボットが選択されるとアクティベートスポットライトが備え付けられている。これにより、高価なグローバル照明を必要とせずに、稼働中のロボットに視覚的な焦点を当てることができます。この実装は、選択状態に基づいてライトを有効または無効にするだけのシンプルなコンポーネントです。

各ロボットには、そのロボットが選択されるとアクティベートスポットライトが備え付けられている。

各ロボットには、そのロボットが選択されるとアクティベートスポットライトが備え付けられている。

環境照明はHDRI画像から取得され、影を埋め、金属表面に反射光を与える繊細なアンビエントライトを提供します。このテンプレートには複数のHDRIオプションが含まれているため、さまざまな照明環境がシーンの雰囲気にどのような影響を与えるかを確認できます。

C#スクリプト

テンプレートで使用されているスクリプトとScriptableObjectを見てみましょう。

前述のセクションで説明したように、ロボットの動き、故障の仕方、UIへの報告方法など、ロボットに関するすべての詳細はScriptableObjectに含まれています。Project ウィンドウに移動し、 [アセット] > [ウェアハウス] > [ロボットデータ]の順に選択すると、各ロボットの ScriptableObject が見つかります。これらのいずれかのInspectorを開くと、ロボットの名前、現在の動作モード、現在のステータス、アクティブなバリアント、バッテリー、健康状態、動作温度、スピードなど、ロボットの詳細情報が表示されます。ScriptableObject自体は何も実行しません。この文脈では、単にそのモデル固有のすべてのデータを保持するコンテナとして機能します。

また、ロボット全体の平均バッテリーレベル、稼働中のロボットの数、各ステータスカテゴリに属する​​ロボットの数など、ロボット群全体のデータを保持するScriptableObjectもあります。これらはすべて管理画面のユーザーインターフェースに反映されます。

スクリプトは、これらのすべてのデータを実際のロボットとリンクさせ、例えば移動や異なるバリアント間の切り替えといった機能を与えるために使用されます。テンプレートでは、それらはWarehouse scriptsフォルダーにあります。ロボットを操作したり、すべてのScriptableObjectを実際のモデルにリンクさせたりするためのスクリプトがあります。これらのいずれかを選択すると、ロボット、シミュレーター、およびバリアントのスクリプトが表示されます。

RobotManager

RobotManagerスクリプトは、起動時にすべてのデータを有効化します。このスクリプトはシングルトンなので、シーン全体でこのスクリプトのインスタンスは1つだけです。アプリケーションが起動すると、シーン内のすべてのロボットを検出し、それらをリストに保存します。このスクリプトには、2つの重要なイベントが含まれています。ActiveRobotChangedは、ユーザーが別のロボットを選択するたびに発生し、 RobotListChangedは、ロボットがリストに追加または削除されたときに発生します。

このスクリプトは、プロジェクト全体のコミュニケーションの要となるものです。他のスクリプトを見ていくと、それらの多くがこれらのイベントを購読していることがわかるでしょう。

Unity_Build real-time 3D faster_RobotManager_ActiveRobotChanged

RobotManagerスクリプト

OverallDataUpdaterスクリプトは毎フレーム実行され、OverallData ScriptableObjectに対して、各ロボットのデータをループし、数値を集計して、フリートの概要を更新するように指示します。つまり、データ全体にはすべての情報が含まれていますが、実際にそれを機能させるのはこのスクリプトです。

Unity_Build real-time 3D faster_OverallDataUpdater script

OverallDataUpdaterスクリプト

各ロボットはナビメッシュを使用して、移動可能な場所と移動不可能な場所を把握します。しかし、ロボットには目標となるものも必要であり、前述したように、各ロボットは自動または手動モードで動作することができる。それらすべてを管理するために、テンプレートには [アセット] > [倉庫] > [スクリプト] > [エディター] からアクセスできる RobotEditorスクリプトが含まれています。このスクリプトは、ロボットのプレハブにScriptableObjectを割り当てると、必要なものをすべて自動的に追加します。

RandomAgentMovementスクリプトは、ロボットが自動モードのときに有効になります。このスクリプトには、ターゲットの配列が含まれています。スクリプトが開始されると、ランダムに1つを選択し、エージェントをその場所へ向かわせる。毎フレーム、エージェントが到着したかどうかを確認します。残りの距離、経路がまだ計算中かどうか、そしてエージェントが移動を停止したかどうかを確認します。これら3つの条件がすべて満たされると、ロボットはランダムな時間(1~3秒)待機し、新しいターゲットを選択して、プロセス全体を再び開始します。

シミュレーションをご覧いただければわかるように、ロボットは倉庫内を歩き回り、それぞれの目的地に到着すると、まるでそこで何かをしているかのように少しの間一時停止、その後向きを変えて次の目的地へと移動します。

ご記憶のとおり、手動モードに切り替えると、Robotscriptはナビメッシュ Agentコンポーネントを無効にし、 ナビメッシュ Obstacleコンポーネントをカービング機能を有効にしてアクティブにします。そのコンポーネントが作動したロボットは、ナビメッシュ上を移動し、その周囲のナビメッシュ上に開口部を切り出す。自動モードで動作している別のロボットが近づいても、 ナビメッシュに開口部があるため、そこを通過することはできません。そのため、ロボットはそれを迂回する新しい経路を見つけます。自動に戻すと、そのナビメッシュ障害物コンポーネントが削除され、NavMeshAgentが再度有効になります。

RobotDataSimulatorスクリプトは、ロボットが動き回るにつれてバッテリーが消耗したり、機器が故障したりするなど、実際の環境で発生するであろう事象をシミュレートします。このスクリプトはScriptableObjectに更新情報を書き込み、それによってUI管理画面に何をディスプレイかを指示します。

最後に、各モデルについて、バリアントスクリプトでさまざまなバリアントとその動作を指定できます。バリアントを切り替えるボタンを選択すると、このスクリプトが関連するバリエーションを有効または無効にします。

時計:C#アーキテクチャとScriptableObjects

YouTube video

パフォーマンスの最適化

産業用アプリケーションは、複数のハードウェアデバイス間で円滑に動作する必要があることが多く、そのため、ユーザーエクスペリエンスを最適化する方法について慎重に検討する必要がある。テンプレートで使用されている戦略の一部を以下に示します。

  • 頻度管理の更新:全ての出来事が毎フレーム起こる必要はない。テレメトリーシミュレーターは、ユーザーが手動運転時に即時のフィードバックを期待するため、毎フレーム更新されます。集計統計は1秒ごとに更新されます。これは、艦隊全体の平均値がそれ以上の速さで大きく変化しないためです。このテンプレートでは設定変更が可能なので、応答性とCPU使用率のトレードオフを調整できます。
  • UIクエリのキャッシュ:UI ToolkitのQメソッドは、名前またはクラスで要素を検索します。これは便利ですが、いくつかのコストがかかります。同じ要素を見つけるために毎フレーム Q を呼び出すとサイクルが無駄になります。テンプレートは起動時に一度クエリを実行し、参照をフィールドに保存し、その後はキャッシュされた参照を使用します。
  • ナビメッシュクエリの最適化:A地点からB地点までの完全な経路を計算するフルパス経路検索はコストがかかるが、単一地点の検証はコストが安い。手動コントローラーは、次のステップが有効かどうかを知るだけでよく、ルート全体を知る必要がないため、CalculatePath の代わりにナビメッシュ .SamplePosition を使用します。
  • LOD(レベル・オブ・ディテール) :ロボットモデルには複数の詳細レベルがあり、画面サイズに基づいて自動的に選択されます。近くで見ると細部まで確認できますが、遠くにあるロボットは形状が簡略化されていますが、それでも正しく読み取ることができます。テンプレートのLODしきい値は倉庫環境に合わせて調整されています。シーンの一般的な視距離に基づいて調整してください。
  • レンダリングテクスチャ解像度:これは、品質とGPUメモリ、フィルレートのバランスを取るものです。防犯カメラとミニマップはフル解像度を必要としないため、より小さなテクスチャでレンダリングされます。これにより、GPUが処理する必要のあるピクセル数と、それらのテクスチャが消費するメモリ量が削減されます。
  • 物理レイヤーのフィルタリング:このテンプレートはロボットを「Bot」レイヤーに配置し、関連するレイヤーのみが衝突するように物理設定を構成します。ロボットは地面や他のロボットと衝突しますが、UIのレイキャストターゲットや、物理演算以外の目的でコライダーを使用する他のシステムとは衝突しません。
  • 品質レベル:このテンプレートは、設定が段階的に緩和される3つの階層を定義しています。ランタイム時に、デバイスの機能を検出するか、ユーザー設定を提供し、QualitySettings.SetQualityLevel を呼び出して切り替えます。URPレンダーパイプラインアセットは、階層ごとのオーバーライドをサポートしているため、ハイエンドデバイスに影響を与えることなく、ローエンドデバイスの影の解像度を下げることができます。

最後に、 Unityのプロファイリングツールはボトルネックを見つけるために不可欠です。対象となるハードウェア上でプロファイルを作成し、ホットスポットを特定して、すべてを時期尚早に最適化するのではなく、それらのホットスポットを重点的に最適化する。

Unity Industryエコシステム

Unity Industryには、マルチプラットフォームアプリケーションの作成、管理、スケールに必要な製品とサポートが含まれています。業界のクリエイター向けに設計されており、データインテグレーションから展開まで、あらゆる段階を網羅しています。

製造業、自動車産業、小売業など、さまざまな分野のトップ企業が、リアルタイム3Dテクノロジーを活用して競争優位性を獲得し、市場投入までの時間を短縮し、リソースを最適化しています。ぜひご参加ください。製品の可視化からシミュレーションまで、 Unity Industryは没入型体験を実現します。

業界の基礎テンプレートを入手する

Unity Industryの購読者の場合

1.Unity Hubを開き、 Unity 6.4にアップグレードしてください。

2.新しいプロジェクトを作成してから「業界の基礎」を検索か、学習カテゴリに移動してそこからテンプレートを選択してください。

Unity Industryのサブスクリプションをお持ちでない場合:

1.無料トライアルページにアクセスし、指示に従って無料トライアルをご利用ください。

2.トライアルが開始されたら、業界向け購読者と同じ手順に従ってください。

e ブックを入手する

このフォームにご記入いただくと、業界のエキスパートによる最先端の洞察やソリューションを入手できます