3

ユニティ5.4

Unity 側ですべての 3D コンテンツを処理する Unity WebGL アプリケーション (ゲームではない) を構築し、すべての UI を HTML/CSS/JS を使用して構築します。デフォルトでは、WebGLInput.captureAllKeyboardInput は true に設定されています。これにより、キーボード (テキスト) 入力を必要とする入力フィールドが壊れます。これは、入力フィールドに移動するのではなく、キーボード コントロールが Unity によって自動的に消費されるためです。やっている

#if !UNITY_EDITOR && UNITY_WEBGL
WebGLInput.captureAllKeyboardInput = false;
#endif

入力フィールドの問題を修正しますが、要素がフォーカスされた後でも unity がすべてのキーボード入力を無視するようにしますが、追加します

tabindex="1"

HTML 入力フィールドでのキーボード入力がフォーカス時に機能し、Unity WebGL アプリ内のキーボード コントロールがフォーカス時にも機能するように修正します。(これはすべてドキュメントごとです: https://docs.unity3d.com/ScriptReference/WebGLInput-captureAllKeyboardInput.html )。それで、すべてうまくいっています。

ただし、Unity WebGL アプリケーションは、マウス (キーボードではない) コントロールを使用する一部の入力フィールドで依然として問題を引き起こしています。つまり、input type="range" フィールド (HTML5 スライダー) と input type="number (キーボードを使用して数字を入力することはできますが、マウスを上下にクリックすることはできません) で気付きました。

これを修正するための回避策はありますか? 要素が最初にクリック/フォーカスされない限り、Unity WebGL キャンバスがすべてのマウス入力を自動的に取得しないようにする必要があります (キーボード コントロールの動作と同じように)。これを修正するために Unity 側で何か変更することはありますか? それとも、すべての入力を処理し、Unity シーンまたは HTML UI のどちらを対象としているかを判断するために、カスタム JavaScript を作成する必要がありますか?

4

1 に答える 1

5

私は同じ問題を抱えていましたが、回避策を見つけたと思います! 当初は、OnApplicationFocus を使用して WebGLInput.captureAllKeyboardInput を切り替えるだけでした。しかし、OnApplicationFocus は Unity の WebGL ビルドでは機能しないため、代わりにこれを実行しています。

ゲームがロードされたときの最初のシーンで、「GameControl」という名前のゲームオブジェクトに「GameControl」という名前のスクリプトがあります。

// In the Start function of this script I call a function on the webpage to let it know that the game has loaded.
void Start () {
    #if (UNITY_WEBPLAYER || UNITY_WEBGL) && !UNITY_EDITOR
    try {
        Application.ExternalCall("GameControlReady");
    } catch (System.Exception e) {
        Debug.LogError("GameControlReady function not on webpage"+e);
    }
    #endif
}

// This function will be called from the webpage
public void FocusCanvas (string p_focus) {
    #if !UNITY_EDITOR && UNITY_WEBGL
    if (p_focus == "0") {
        WebGLInput.captureAllKeyboardInput = false;
    } else {
        WebGLInput.captureAllKeyboardInput = true;
    }
    #endif
}

Webページには、次のjavascriptがあります。

var gameReady = false;

// Called by Unity in GameControl's start function
function GameControlReady () {
    gameReady = true;
}

function FocusCanvas(focus) {
    if (gameReady) {
        SendMessage("GameControl", "FocusCanvas", focus);
    }
}

そして、ウェブページのヘッドセクションには、次のものがあります

<script type='text/javascript'>
    document.addEventListener('click', function(e) {
        if (e.target.id == "canvas") {
            // Clicked on canvas
            FocusCanvas("1");
        } else {
            // Clicked outside of canvas
            FocusCanvas("0");
        }
    });
</script>
于 2016-10-29T21:13:48.680 に答える