次の方法で共有


HoloLens 2 Unity アプリの WebView2

この記事は、イマーシブ HoloLens 2 Unity アプリケーションで WebView2 を使用する開発者向けです。

重要

Hololens 2 の WebView2 は引き続き使用できます。 ただし、Hololens 2 での WebView2 のサポートは廃止されました。計画されたバグ修正やコンテンツの更新はなく、テクニカル サポートは終了しました。 Hololens 2 で WebView2 を使用するアプリケーションは、引き続き動作する保証はありません。

HoloLens 2の WebView2 とUnity用の WebView プラグインはどちらもプレビュー段階であり、一般公開前に変更される場合があります。

WebView2 は、Windows 11更新プログラムを実行しているHoloLens 2デバイスでのみ機能します。 詳細については、「Update HoloLens 2」を参照してください。

HoloLens 2での WebView2 対応 2D アプリケーションについては、「WinUI 2 (UWP) アプリでの WebView2 の概要」を参照してください。

制限事項と既知の問題

WebView2 を使用してHoloLens 2 Unity アプリを開発するときは、いくつかの制限事項と既知の問題に注意してください。

  • ポップアップ: ポップアップは、HoloLens 2上Unityアプリ内の WebView2 内ではうまく機能しませんが、デバイス上の 2D XAML アプリでは正常に動作します。 ポップアップを避け、HTML、CSS、JavaScript を使用して WebView 内のカスタム ポップアップのような要素などの代替手法や UI デザインを使用します。

  • 新しいウィンドウ: HoloLens 2の WebView2 インスタンスは、デスクトップとは異なり、既定で同じウィンドウ内を移動します。 この既定の動作に従って、ユーザー エクスペリエンスを向上させます。 さらに、DevTools ウィンドウを起動できません。

  • エンタープライズ認証: OS レベルのトークンを利用する自動シングル Sign-On (SSO) は、現在、HoloLens 2の WebView2 ではサポートされていません。 ユーザーは、デバイス レベルの認証が必要な場合を除き、資格情報を指定してサインインできます。 Cookie ストレージは期待どおりに動作します。

  • ユーザー操作: ネイティブ HoloLens 2 スレートとは異なり、WebView2 は遠距離相互作用ハンド レイを使用して操作するのが最適です。 タッチからスワイプ、スクロールの操作はサポートされていない可能性があります。

  • パフォーマンス: JavaScript または高度なレンダリングを大量に使用する複雑な Web サイトは、システムのパフォーマンスやホスト アプリケーションのフレームレートに影響を与える可能性があります。 一般的なパフォーマンス関連の制限事項と推奨事項については、Mixed Reality のドキュメントの 「Mixed Reality のパフォーマンス について」を参照してください。 以下の 「パフォーマンスの最適化」も参照してください。

パフォーマンスの最適化

スムーズなユーザー エクスペリエンスを実現するには、HoloLens 2 Unity アプリでの WebView2 のパフォーマンスの最適化が不可欠です。 いくつかの推奨事項を次に示します。

  • WebView2 インスタンスの数を制限する: Unity アプリ内で WebView2 のインスタンスを 1 つだけ使用することをお勧めします。 同じインスタンスを再利用するか、破棄し、必要に応じて新しいインスタンスを作成します。 シーンから WebView プレハブを削除しても、基になる WebView2 インスタンスが破棄されないことに注意してください。 ゲーム オブジェクトを適切に破棄するには、 Destroy() メソッドを呼び出す必要があります。

  • 一般的なUnity最適化手法を適用する: WebView2 のパフォーマンスを最適化するには、オクルージョン カリングや更新レートの制限など、標準的なUnity最適化アプローチを使用します。 詳細については、Mixed Reality ドキュメントの「Unityのパフォーマンスに関する推奨事項」を参照してください。

  • WebView2 のパフォーマンスをプロファイリングおよび監視する: HoloLens 2 Unity アプリケーションのパフォーマンスをプロファイリングするには、いくつかの方法があります。

    • Unity Profiler: HoloLens 2を含むさまざまなプラットフォームでアプリケーションのパフォーマンスを測定および最適化できる、Unityの組み込みツールです。

    • Visual Profiler: アプリケーションのパフォーマンスのアプリケーション内ビューを提供する Mixed Reality Toolkit の機能。

    • PIX: HoloLens 2でアプリケーションを Unityプロファイリングするためにも使用できる Windows 用のパフォーマンス チューニングおよびデバッグ ツール。

一部のナビゲーション 方法については、「手順 7 - HoloLens 2 Unityアプリでの WebView2 の概要 (プレビュー)」の WebView2 機能の拡張に関するページを参照してください。 このセクションでは、そのデモについて説明します。

関連項目:

IWebView インターフェイス

IWebView インターフェイスでは、ページ ナビゲーションに関連するいくつかのメソッド、イベント、プロパティが公開されています。 ここで公開されているメイン機能は、Load(Uri url)を使用して特定の URL に移動する機能です。

public interface IWebView
{
    // Non-navigation methods are removed for clarity.

    event WebView_OnNavigated Navigated;

    Uri Page { get; }

    void Load(Uri url);

    void Reload(bool ignoreCache);
}

IWithBrowserHistory インターフェイス

IWithBrowserHistory インターフェイスでは、ページ ナビゲーションに関連するいくつかのメソッドとイベントが公開されています。 これは主に、一般的な Web 閲覧エクスペリエンスと同様に、開発者が前後に移動できるようにします。

public interface IWithBrowserHistory : IWebView
{
    // Non-navigation methods are removed for clarity.

    event WebView_OnCanGoForwardUpdated CanGoForwardUpdated;

    event WebView_OnCanGoBackUpdated CanGoBackUpdated;

    void GoBack();

    void GoForward();
}

SetVirtualHostNameToFolderMapping と SetVirtualHostMapping

CoreWebView2.SetVirtualHostNameToFolderMapping メソッドを使用すると、仮想ホスト名とフォルダー パス間のマッピングが可能になり、そのホスト名を使用して Web サイトからアクセスできるようになります。 このメソッドはローカル ドメイン名をローカル フォルダーにマップするため、WebView2 コントロールは、そのドメインのリソースにアクセスしようとしたときに、指定されたローカル フォルダーからコンテンツを読み込みます。

Unity用の WebView プラグインは、IWithVirtualHost インターフェイスを介してこの機能を公開します。このインターフェイスには、次の 1 つのメソッドSetVirtualHostMapping(string hostName, string folderPath)があります。

public interface IWithVirtualHost : IWebView
{
    void SetVirtualHostMapping(string hostName, string folderPath);
}

SetVirtualHostMapping メソッドを使用するには、hostNameを有効な URL 準拠文字列 (webview2.sample など) に設定します。 folderPath は、絶対パスまたはアプリケーションの作業ディレクトリを基準としたパス ( Assets\Htmlなど) にすることができます。

Assets\Htmlの下に demo.html という HTML ファイルがあると仮定すると、次のコード スニペットは、Unityに WebView プラグインを使用してdemo.htmlを読み込む方法を示しています。

using Microsoft.MixedReality.WebView;

public class WebViewExample : MonoBehaviour
{
    private void Start()
    {
        var webViewComponent = gameObject.GetComponent<WebView>();

        webViewComponent.GetWebViewWhenReady((IWebView webView) =>
        {
            ((IWithVirtualHost)webView).SetVirtualHostMapping("webview2.sample", "Assets\\Html");

            // Navigate to our local content.
            webViewComponent.Load(new Uri("http://webview2.sample/demo.html"));
        });
    }
}

Input

Mixed Reality アプリケーションのUnityの入力を処理するには、さまざまな方法があります。

Unity アプリケーション内で使用される入力システムに関係なく、さまざまなアプリケーション入力イベントとUnity用の WebView プラグイン間の相互運用コードが必要です。 つまり、これらのイベント (Pointer イベントなど) を WebViewMouseEventData オブジェクトに変換し、 IWithMouseEvent インターフェイスを介してそれらのイベントをプラグインに転送します。

public interface IWithMouseEvents : IWithInputEvents
{
    void MouseEvent(WebViewMouseEventData mouseEvent);
}

WebView2 はUnityの入力システムを認識していないので、Unity シーンとは異なる座標系を持つ可能性があります。 その結果、ポインターダウン イベントがある場合、その座標を WebView2 コントロールの座標系に変換する必要があります。 さらに、ポインターダウン イベントは、適切な WebViewMouseEventData イベントの種類に変換する必要があります。

簡単な例:

using Microsoft.MixedReality.WebView;

public class WebViewExample : MonoBehaviour, IPointerDownHandler
{
    // WebView setup steps skipped for brevity

    public void OnPointerDown(PointerEventData eventData)
    {
        IWithMouseEvents mouseEventsWebView = webView as IWithMouseEvents;

        // Call hypothetical function which converts the event's x, y into the WebView2's coordinate space.
        var hitCoord = ConvertToWebViewSpace(eventData.position.x, eventData.position.y);

        WebViewMouseEventData mouseEvent = new WebViewMouseEventData
        {
            X = hitCoord.x,
            Y = hitCoord.y,
            Type = WebViewMouseEventData.EventType.MouseDown,
            Button = WebViewMouseEventData.MouseButton.ButtonLeft,
            TertiaryAxisDeviceType = WebViewMouseEventData.TertiaryAxisDevice.PointingDevice
        };

        // Propagate the event to the WebView plugin.
        mouseEventsWebView.MouseEvent(mouseEvent);
    }
}

上の例では、ポインターダウン イベントは WebViewMouseEventData オブジェクトに変換され、Unityのために WebView プラグインに転送されます。 これは基本的にマウスダウン イベントに変換されます。 マウス クリック イベントを作成するには、ポインターアップ イベントも同様の方法で処理する必要があります。

上の例では、 ConvertToWebViewSpace は意図的に実装されていません。

関連項目

API リファレンス:

Hololens ドキュメント:

Mixed Realityドキュメント:

Unityドキュメント: