いつもビルドしてアイテム表示画面を開くとiframe内の戻る・進むボタンは用意されているけど一回もそれが機能したことがない...

今回はなぜ動かないのか,その原因と対策について考えていく.

まず自分がwebviewを表示させるために使用しているコードの確認.

20行目の記述を見ても分かるように,Start()の部分でGameObjectを作成して,それにコンポーネントとして「WebViewObject」というものを付け加えていることが分かる.

そして37行目の.CanGoBack()の関数でまずはブラウザの戻るボタンが有効かどうかを判断して,有効ならGUIを有効化,無効ならGUIも無効化する.そのうえでGUIのボタンを作成して,有効なボタンが押されたら戻る関数を実行するという流れになっている.

45行目から始まる,進むボタンに関する記述も同じ流れ.

じゃあ,そもそも.CanGoBack()とかの関数はどこで定義されているのかというと,それはおそらくコンポーネントとして追加された「WebViewObject」というプログラム内で定義されていると考えられる.

Assets > Plugins > WebViewObject.csに「WebViewObject」のファイルがあるので見てみると以下のような記述を発見.

900行目付近を探せばおそらく同じような記述が見つかるはず.なるほど,UNITY_WEBGLの環境だと問答無用でfalseが返ってくるようになっているのですね.そりゃずっとボタンが有効にならないわけだ...UNSUPPORTEDと記述があるので,現状ではWebGLの環境でwebviewの戻る・進むボタンを有効にするのは難しいんですかね??

ちょっと今回は自分なりに色々考えてチャレンジしてみようと思います.

そもそも.CanGoBack()の関数以外のちゃんとWebGL上でも機能している関数はそもそもどのようにして表現されているのだろうか?試しに.SetVisibility()の関数の定義を見てました.

なるほど,Unity_Editor上のゲームプレイモードではなく,ビルドしたWebGLの環境であるならば690行目にあるように「_gree_unity_webview_setVisibility(name, v)」という関数を実行しているようですね.

そもそも「_gree_unity_webview_setVisibility(name, v)」なんて関数,どこで定義されているんだ?

もっと上の方に行ってみると360行目周辺で次のような記述を発見.

どうやら,DLLimportを使って外部から色んな関数をまた引っ張ってきているようだ.

じゃあその引っ張ってきている関数をまとめたライブラリはどこにあるのだろうか?

探してみるとAssets > Plugins > unity-webview-webgl-plugin.jslibというファイルを発見.

中身はこんな感じ.

おそらくこれが,unityのC#のスクリプトとwebviewで使用するJavaScriptを中継してくれているのだろう.それだったら,JavaScriptで.GoBack等の関数を定義してあげて,同様の手順でC#と結び付ければいいのではないだろうか?

ということで,作成したJavaScriptのファイルが以下のような感じ.WebViewのアセットをインストールする際にWebGLTemplatesというファイルが作成されたはず.Assets > WebGLTemplates > unity-webview-2020 > unity-webview.jsのファイルを今回はいじりました.

「追加のコード」部分が今回書き足した部分です.

さて,この作成した各関数に対してunityのC#でも機能するように中継役であるAssets > Plugins > unity-webview-webgl-plugin.jslibのファイルを次のように改編.

赤い四角で囲った部分が追加した部分.

これで中継役の接続もできたはず.そしたら本命のC#のファイル(Assets > Plugins > WebViewObject.cs)も改編.

新たに追加した関数をそれぞれこちらのC#のファイルでもimportしてあげましょう.

importした関数は使わないと意味がありません.

という事で同じファイル内の下の方に記述されている,それぞれの関数に関する記述を以下のように変更.

1.GoForward()

2.GoBack()

これで,GoForward()とGoBack()の関数は使えるようになったはず.

ということで,最後にcanvas上のGameObjectにコンポーネントとして追加してる以下のC#のコードもちょっと変更.

.CanGoBack()と.CanGoForward()の関数は今回用意していないのでその部分を削除しただけ.

色んなファイルが出てきて,ちょっと今回は複雑になってしまった...

時間できた時にもう少し分かりやすく図にまとめようかなと思っていますけど,それは第一優先ではないので,そのうちまた.とりあえず,各ファイルの役割等をうまく図に表してくれているブログを見つけたのでそこのURLだけ下に載せておきます.

https://note.com/npaka/n/nca1e35a649e3

最終的にこれだけコードをいじった結果,何とか戻るボタンと進むボタンは機能するようになりました.

ただ,これIOSだとうまく機能しないんです.iframeの操作に対する履歴は残らなくて,ブラウザの戻るボタン自体が常に無効化されている状態...

ちょっとこの辺はもっとどうするべきか考えなきゃですね.

もしいい方法知っている方いたら教えてください...

投稿者 horseshoe

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です