I 以前に実験した を組み合わせて ユニティゲームエンジン & フラッター (ネイティブにコンパイルされたクロスプラットフォームアプリ用のGoogleのUIツールキット)2019年後半、2020年初頭。 結果はまちまちです。 当時、私は AR Flutterプラグインが利用できなかった(そしてまだ利用できない)フレームワークであるVuforiaを使用したプロトタイプ。 いずれにせよ、Flutterは本質的に2Dプラットフォームですが、Unityは最も人気のあるリアルタイム3DオーサリングツールのXNUMXつです。 反対に、Unityはネイティブフィールモバイルインターフェイスのサポートが不十分です。 したがって、これらXNUMXつのテクノロジーの組み合わせは非常によく一致するはずです。
さらに、Unityでビルドされたアプリを埋め込むためのFlutterコンポーネントは、Flutterプラグインディレクトリにすでに公開されています。 それにもかかわらず、当時、私はXNUMXつのテクノロジー間の安定した統合をVuforiaとGoogleのネイティブであるArCoreのどちらとも検証できませんでした。 AR ツールキット。 ただし、このアプローチはAppleのARソフトウェアキットであるARKitで検証されましたが、ARKitが提供していないクロスプラットフォームソリューションを探していました。 そのため、Unity-FlutterARアプローチを片側に置く必要がありました。
それ以来、私はアニメーション化されていないもののためにARCoreとFlutterと協力してきました AR オブジェクトの配置とこれはリモートを使用してうまく機能します GLB形式のファイル。 しかし、最近では、より複雑なARユーザーケースをもう一度扱う新しい機会があります。 Unityの物理学とアニメーション機能を必要とするもの。 そのため、最初のUnity-Flutter実験からXNUMX年半、アプローチを再テストする新しい機会があります。
私はのベータリリースに従いました ユニティマーズ 2020年の間に大きな関心を持っています。MARSはUnityがAR開発のためのプロフェッショナルグレードのワークフローとして説明しているものです。 それは可能にします AR 開発者は、複雑なデータ指向のアプリを作成し、コード編集後のビルドを待たずにエディター内でテストし、「現実の世界に応答して適応するランタイムロジック」を備えたアプリを提供します
MARSツールは、最近高く評価されているWallace&Grommet ARインタラクティブストーリーテリングアプリの背後にあるクリエイティブチームによって採用されました— 大きな修正。 さらに、プロジェクトの背後にあるチーム— XNUMXつの英国のデザイン/ソフトウェア会社のクリエイティブコンソーシアムは、アプリのユーザーインターフェイスにFlutterを選択し、組み込みのUnity-Flutterアプローチを追求して一見素晴らしい結果をもたらしました。 コンソーシアムの名前であるFictioneersのプロダクトマネージャーであるBethは、プロジェクトの目標を次のように説明しました。
「スマートフォンに意味のあるコンテンツを配信する革新的なアプリを作成することが目標だったストーリーテリング体験」
Beth、プロダクトマネージャー@ Fictioneers
私が最初に実験したとき、私は以前に多くの課題を経験しました FlutterUnityウィジェット、パフォーマンス、Unity通信の問題、および一般的なUnityバージョンの互換性の問題を含みます。 ただし、これは、3.0.0年2020月にメジャー4.0.0バージョンがリリースされる前のことであり、これらの問題の多くに対処し、2021年XNUMX月初旬にはiOSのいくつかの重要な修正とパフォーマンスの問題を含むバージョンXNUMXがリリースされました。その他の改善。
最初のテストでは、UnityMARSパッケージで提供されているサンプルゲームを使用することにしました。 地上レベルの明確な通路が利用できない場合、表面上を動き回ったり、ある表面から別の表面にジャンプしたりすることができるアニメーションロボットを含む複雑なゲームを含むいくつかのシーンの例があります。 ロボットは、AR空間でも生成されるフローティングジェムを収集します。 これは、私が実験するのに適した、比較的複雑なテストケースのように思えました。
私はテストのために最新の2020LTSバージョンのUnityを使用し、新しいマイナーバージョンがリリースされたときに更新し続けました。 執筆時点で私は2020.3.11f1を使用しています
Flutter 2.1を使用しており、Google Pixel3XL物理デバイスでテストしています。
ローカルの詳細に基づいて、gradleビルドファイルとローカルプロパティにいくつかのカスタム調整が必要でした。 これらのほとんどは、ウィジェットのドキュメントページに記載されています。 また、この記事のさらに下にそれらを記載しました。
全体として、それはスムーズなプロセスでした。 複雑なゲームシーンをセットアップし、Flutter Widget Unityパッケージをインストールした後、APKを構築し、いくつかのMaterialAppBarウィジェットを使用して単純なFlutterUIをセットアップして、これがUnityが組み込まれたFlutterアプリであることを明確にすることができました寸法。 そしてそれはうまくいきました!
現在のプロジェクトのプロトタイプの目的で、実際の地面の上にフローティング仮想オブジェクトを配置したいと思います。
これらのオブジェクトは、物理的な衝突に反応する必要があります。たとえば、ARエクスペリエンスのユーザーがオブジェクトに足を踏み入れると、キルターがノックオフされ、前後に揺れてから、最初のポーズと状態に戻ります。
オブジェクトは、移動するユーザーの位置に基づいてエクスペリエンスに「フィード」されるため、実行時に動的にロードされ、事前構成されません。 Unityアプリの外部およびクラウドベースのデータベース内のデータに基づいているためです。
流動性を最大化するために、私が見つけたMARSの良い習慣は横たわることです スポーンポイント。 スポーンポイントは、表面平面、または私の場合は地面である他の関心ポイントです。 スポーンポイントは、仮想オブジェクトが配置される目的の平面上の位置です。 MARSの重要な機能は、これらの概念に使用する慎重に検討されたセマンティクスです。
たとえば、事前設定された条件に一致する実際の機能は、 プロキシ。 MARSのドキュメントでは、プロキシを、アプリが相互作用できる物理的な実世界のオブジェクトまたは空間の仮想表現として説明しています—デジタルコンテンツの配置( プレハブ)その上など。Unityのマニュアルには次のように書かれています。プロキシを次のように考えてください。 プレースホルダー アプリ内のデジタルコンテンツと現実世界を結び付けます。 たとえば、顔、テーブル、壁、床などです。 実行可能なプロキシを識別するときに適用する現在の条件には、サイズ、高さ、パディングなどがあります。 ただし、Unityの長期的な目標は、時間や現在の気象条件(雨を考えてください)など、より多くの抽象化を統合して一致させることです。
スポーンポイントは、実世界での位置であり、 プロキシ、 キャラクターなどのゲームオブジェクトが表示される場所(スポーン)。 私の実験とMARSのサンプルの複雑なゲームからインスピレーションを得るために、私はMARSを使用しました レプリケーター ターゲットサーフェス上に無制限の数のスポーンポイントを作成し、それぞれに 合成オブジェクト を割り当てるために添付 セマンティックタグ。 その後、さらに作成できます プロキシ 私の希望で ゲームオブジェクト (文字など)実行時にスポーンポイントから セマンティックタグ条件。 要約すると、一般化されたスポーンポイントは、検出されるとすぐにリアルタイムで作成されます。 これらはいくつかの基本的な条件しかないため、一般的です。 私の場合、XNUMX平方メートルを超える利用可能な水平面と垂直面があります。 次に、これらの事前に配置されたスポーンポイントに、より細かい制御でキャラクターやその他のARオブジェクトを作成できます。 たとえば、一定期間後または特定の順序で、または将来的にはスポーンポイントが特定の色またはテクスチャである場合にのみそれらが必要になる場合があります。
一般的にMARSとUnity / Flutterを一緒に使用する場合は、注意すべき点がいくつかあります。 途中でそれらに注意することによって、これらの小さいが時々ブロックする落とし穴に遭遇する人にとって役立つかもしれないそれらのいくつかがここにあります。
物理学 — Unityのリジッドボディアプローチを使用することをお勧めします。これにより、組み込みのPhysicsを使用して、よりリアルな感触を実現しながら、ボイラープレートを減らすことができます。 これは私が見つけた素晴らしいビデオで、人気のある非ARゲームでこれが実際に動作していることを示しています。これはARに適合させることができます。 (( https://youtu.be/qdskE8PJy6Q)
ランタイムプロキシ —実行時に新しいプロキシを作成する場合、たとえば、データベースからの外部イベントが新しいARオブジェクトをトリガーする場合、プロキシのSyncModifications()メソッドを使用して新しい状態をメインのMARSシステムと同期することが不可欠です。
これが必要なのは、MARS DBが、パフォーマンスのためにバックグラウンドスレッドで実行される、より最適な形式で保存された条件データの独自のコピーを持っているためです。 すべてのプロキシを含むすべてがインスペクターで事前構成されている場合、同期は自動的に処理されます。 ただし、実行時に変更を加える場合は、新しい/変更されたプロキシをシステムに通知する必要があります。 これを手伝ってくれたUnityTechnologiesのThomasKeyに感謝します。「SyncModifications()を呼び出すと、クエリデータベースに変更が通知され、「変更」変更アクションがスケジュールされます。 データベースクエリスケジューリングスレッドはアクションバッファを介してメインスレッドと断続的に同期されるため、変更の変更が反映されるまでに数フレームかかる場合があります。」
関連するクラスへのリンク:
https://docs.unity3d.com/Packages/c…Proxy.html#Unity_MARS_Proxy_SyncModifications
https://docs.unity3d.com/Packages/c…_ProxyGroup_SyncModifications_System_Boolean_
影 —私はAndroidの物理デバイスでテストしているので、ARCoreは手間のかかる作業を行うコンポーネントです。 理由はわかりませんが、MARSを使用すると、GameObjectsは平面に自動的に影を落としません。 これは手動で設定する必要があります。 これは、Flutter / ARCoreの実験と開発において、ARCoreのネイティブおよびアニメーション化されていないGLBオブジェクトで自然に機能するので驚きました。 とにかく、Unityでは、アニメーションオブジェクトに対してこれを手動で設定する必要がありました。 これは、シェーダーとリジッドボディコンポーネントをゲームオブジェクトに追加することで実現されました。 私が使用したシェーダーはここにあります: https://github.com/dilmerv/ARFoundationOcclusion/tree/feature/URPOcclusion/Assets/Shaders
これは、メインのPlan Visualizer Planeのクローンに適用され、メインのPlanVisualizerコンポーネントに割り当てられます。
フラッター —私のユースケースにはいくつかの調整が必要でしたが、セットアップによっては必要な場合と不要な場合があります。
androidappbuild.gradle
追加/編集:
unityStreamingAssets=.unity3d, google-services-desktop.json, google-services.json, GoogleService-Info.plist
lintOptions {disable'InvalidPackage 'checkReleaseBuilds false}
gradle.properties:
unityStreamingAssets=.unity3d, google-services-desktop.json, google-services.json, GoogleService-Info.plist
androidunityLibrarynuild.gradle
追加:
ndk.dir=C:/Program Files/Unity/Hub/Editor/2020.3.8f1/Editor/Data/PlaybackEngines/AndroidPlayer/NDK
def getNdkDir(){プロパティlocal = new Properties()local.load(new FileInputStream( "$ {rootDir} /local.properties"))return local.getProperty( 'ndk.dir')}
local.propertiesに追加:
ndk.dir=C:/Program Files/Unity/Hub/Editor/2020.3.8f1/Editor/Data/PlaybackEngines/AndroidPlayer/NDK
これは、プリミティブ3Dオブジェクトを使用した実験のデモへのリンクです。
これらのオブジェクトは実行時に動的に作成され、既存のスポーンポイントに配置されます。 オブジェクトは互いに物理的に相互作用し、検出された平面と相互に影を落とします。 これは私のプロジェクトの要件であるため、この機能にはフローティング効果が含まれています。 また、ユーザーがオブジェクトの100つをオブジェクトに近づけて元の場所に戻すことができる機能により、現実的な物理効果であらゆるものと衝突します。 また、MARSの地理的条件を使用しており、XNUMX回のセッションでXNUMXメートルの距離でこれが機能することをテストおよび検証しました。 ARエクスペリエンスは、最低限のFlutter UIに組み込まれており、これらXNUMXつのテクノロジーが連携して機能することを示しています。
UnityMARSとFlutterUnity Widgetは、以前にこのアプローチを試したので、過去12か月でそれぞれ長い道のりを歩んできました。 Unity2020とFlutter2.1を使用すると、プロセスが比較的簡単で安定していることがわかりました。 MARSワークフローは、新しいビルドを必要とせずに、シミュレーション環境を使用して開発プロセスの初期段階を実際にスピードアップします。 MARSを使用すると、開発者は、近い将来、気象検出、オブジェクト認識などの新しいAR機能/条件をワークフローに自然に組み込むことができるという知識を持って、完全に機能するARエクスペリエンスのフレームワークを構築できます。
次のステップは、FlutterとUnity間の通信のベンチマークテストです。 具体的には、Unity Firebase(db)接続とFlutterUnityを組み合わせたFlutterFirebaseのパフォーマンスの違いを理解したいと思います。 現在、私の哲学は、Unityを3D / AR機能に厳密に使用し、それ以降のすべてのビジネスロジックとプレゼンテーション層にFlutterを優先することです。 私は今後数週間にわたって、物事のこちら側に関する私の発見と意思決定を投稿します。
コインスマート。 BesteBitcoin-ヨーロッパのBörse
Source: https://arvrjourney.com/using-unity-mars-and-flutter-to-author-cross-platform-augmented-reality-ar-experiences-6aec23a80ac1?source=rss—-d01820283d6d—4