2

私はこれらの属性を持つプロジェクトに取り組んでいます:

  1. ページを駆動するjQuery
  2. jQuery を使用してページに埋め込まれた Unity 3d プレーヤーとunityobject.js(Unity からの指示に従って)
  3. ユーザーのカーソルが Unity のキャンバス領域内にある場合、Unity にはカスタム マウス カーソルがあります。

問題: Unity はマウス カーソルをキャプチャしますが、それを含む Web ページが非アクティブになったときに解放しません。これは、ユーザーが別のタブに切り替える (または新しいウィンドウを開く) 場合、Unity があったはずの領域にマウスを移動すると、マウス カーソルが消えることを意味します。これは Unity 3d フォーラムで説明されている Unity のバグです: http://forum.unity3d.com/threads/4565-Unity-Web-player-issue-mouse-hidden-for-all-new-windows

いいえ、Unity Web クライアントの最新バージョンではまだ修正されていません。

この問題を軽減するために、Unity が JavaScript を介して現在のブラウザー ウィンドウのステータスをリッスンし、受け取ったステータスに基づいてカスタム マウス カーソルをキャプチャ/リリースすることにしました。しかし、他にも問題があります:

Unity がウィンドウ ステータスを受け取る方法:

// GetUnity returns the Unity object in the DOM<br>
NAMESPACE.windowStatus = function( statusStr ) {
    GetUnity().SendMessage( "_AppShell", "OnRecieveWindowStatusFromWebPage", statusStr );
}

私は次の方法を試しました...

方法 1: イベントを「window」オブジェクトにバインドする

$( window ).live( 'focus', function() {
    NAMESPACE.windowStatus( 'active' );
} );

$( window ).live( 'blur', function() {
    NAMESPACE.windowStatus( 'inactive' );
} );

問題: IE7 と IE8 では、新しいブラウザー タブは別の「ウィンドウ」と見なされないため、コードは Unity に影響しません。真の別のブラウザ ウィンドウが開いている場合にのみ機能します。



方法 2 :イベントを「ドキュメント」オブジェクトにバインドする$( document ).live(...);

問題: $( document ) jQuery では実際には何もしません。難しい方法を見つけました。
ソース: http://forum.jquery.com/topic/should-document-live-map-to-document-bind-window-too


<body>
方法 3 :イベントをオブジェクトにバインドする$( 'body' ).live(...);

問題:どういうわけか IE は Unity オブジェクトが DOM の一部であることを認識しません (.live()メソッドを使用しているにもかかわらず)。そのため、ユーザーが組み込みの Unity プレーヤーをクリックするたびに、ブラウザーはblurイベントを Unity に送信し、マウス カーソルがロックされます ( Unity がクリックされるとconsole.log()出力されます)。inactiveまた場合によっては、マウス カーソルを解放することさえできず、ブラウザ全体がマウス イベントに応答しなくなります。カーソルを解放する唯一の方法は、ブラウザー ウィンドウの外側をクリックし、ブラウザーをもう一度クリックすることです)。


私が試した他のこと:

window.addEventListener( 'focus', function() {...} );
document.addEventListener( 'focus', function() {...} );
document.body.addEventListener( 'focus', function() {...} );
document.getElementsByTagName('body')[0].addEventListener( 'focus', function() {...} );

問題: .addEventListener()これらの要素のメソッドは、IE ではまったくサポートされていません! ガッ!


おまけ:
より注意深い人は、「ねえ、Unity オブジェクト自体でマウス クリック イベントを検出して、そのblurイベント (.live()複数可) を無視してみませんか?」と言うかもしれません.bind()。それを試しました。IEもそれが好きではありません。イベントを完全に無視し、それらのイベントはオブジェクトには使用できないと伝えます。

だから私の仲間のJavascriptグル。この問題にエレガントな方法で最善の方法でアプローチする方法について、私はアイデアがありません。任意のポインタをいただければ幸いです。

4

1 に答える 1

1

問題が解決しました。どこかに埋められたUnity3dのフォーラムで解決策が提供されました... http: //forum.unity3d.com/threads/27516-Mouse-input-possible-from-different-tab

その要点は次のとおりです。フレームワークが常に答えであるとは限りません。ルーツに戻ります。

.addEventListener()IEにネイティブではないことを忘れてしまいました.attachEvent()。したがって、IEが検出されたときに、すべてのイベントリスナーをIE固有のリスナーに置き換えていれば、上記のコードは機能していました。

したがって、変更されたコードは次のとおりです。

if ( navigator.appName == 'Microsoft Internet Explorer' ) {
    GetUnity().attachEvent( 'onmouseover', onFocus, false );
    GetUnity().attachEvent( 'onfocusin', onFocus, false );
    GetUnity().attachEvent( 'onmouseout', onBlur, false );
} else {
    // Netscape, Firefox, Mozilla, Chrome and Safari.
    GetUnity().addEventListener( 'mouseover', onFocus, false );
    GetUnity().addEventListener( 'focus', onFocus, false );
    GetUnity().addEventListener( 'mouseout', onBlur, false );
}

function onFocus() {
    NAMESPACE.WindowStatus( 'active' );
}

function onBlur() {
    NAMESPACE.WindowStatus( 'inactive' );
}

これを実際に機能させるには、メソッドのコールバック関数でイベントの添付ファイルを作成する必要がありますunityobject.embedUnity()。Unityがロードされる前にイベントをアタッチしようとすると、ブラウザーはそれがまたはであると文句をGetUnity()言いnullますundefined

これが誰かが同じ問題で頭を悩ませるのに役立つことを願っています。

于 2011-04-08T08:19:56.540 に答える