【Unity2018】WebGLで外部ブラウザを新規ウィンドウで開く方法
目次
はじめに
いつからか、UnityC#でjavaScriptの関数を呼び出す「Application.ExternalCall」と「Application.ExternalEval」関数が廃止になりました。
これにより、上記関数を用いたjavaScriptの関数が呼び出せなくなり、別の方法でjavaScript関数を呼び出す必要が出てきました。
私の場合、WebGLでリンクをクリックすると新規ウィンドウでそのリンク先を開いてほしかったのですが、「OpneURL」だと同一ウィンドウ内で開いてしまうし、調べても解決方法が見当たらなかったので、先輩の助言のもと、javaScriptを直接呼び出す方法で実装することにしました。
途中の諸々を飛ばしたい方は、目次の「Unity(C#)でjavaScriptの関数を呼ぶ方法」からどうぞ
今まではどう実装できたか?
「Application.External~」が使用できていた時は、
Application.ExternalEval(string.Format("window.open('{0}','_blank')", url));
等といった記述で、新規ウィンドウを開いてリンクを開くことが出来ました。
【参考】
EvalとCallの違いは、リファレンスを読む限り、呼び出す関数に引数を含むか含まないかだと思われます。
そもそも引数に記述されている内容の意味は?
Application.ExternalEval(string.Format("window.open('{0}','_blank')", url));
の引数に、
string.Format("window.open('{0}','_blank')", url)
とあるのですが、「string.Format」は「どのような文字列にするか」を指定できる関数になります。そしてこのプログラムの場合、「{0}」には「url」変数の値が入ります。
他にもいろいろ出来るのですが、詳しくはこちらなどを参考に。
さて、では「string.Format」に渡された引数をもとに出力した文字列に直すと、
window.open('url','_blank')
となります(「url」部分は実際にはURLの文字列が入ります)。
では、この「window.open」とは何なのでしょうか。
「window.open」って?
ずばりこれがjavaScriptです!
「Application.ExternalEval」はこの関数を呼び出していたのです!
具体的には、関数名通りウィンドウを開く関数になります。
引数には、「URL」「開くウィンドウの名前」「ウィンドウオプション」が指定できます。
プロパティについてはこの記事では省略しますが、こちらのサイトに情報が載っています。
この時、open関数の第二引数に
nullもしくは_blank
を渡すと、新規ウィンドウが生成されます!
つまりまとめると、
window.open('url','_blank')
は「新規ウィンドウでURLのリンク先を開いてね」という関数だということです。
じゃあ、このプログラムをUnityC#で呼べれば新規ウィンドウを開くことが出来ますね!
Unity(C#)でjavaScriptの関数を呼ぶ方法
この方法に至っては、リファレンスの方で誘導がなされていました。
このページに記述されているURLに飛ぶと、
このリファレンスに飛びます。
内容をまとめると、
になります。
この「2.」で書くプログラムで「window.open」関数を呼び出せば出来そうですね!
書いてみる
まずは、jslibの方を記述していきます。
※jslibは必ず「Plugins」フォルダ内に作成しましょう!
書き方はリファレンスを参考に、
独自に追加したのは
OpenToBlankWindow: function (_url) {
window.open(Pointer_stringify(_url),'_blank')
},
です。
Pointer_stringify
は受け取った文字列をjavaScript文字列に変換します。
次に呼び出すC#側を記述していきます。
[DllImport("__Internal")]
は、「この関数は外で定義されていますよ」と知らせるものです。
これで、C#でjavaScriptを呼び出すことが出来るようになり、window.openを呼び出して新規ウィンドウでリンクを開くことが出来るようになりました。
まとめ
javaScriptをC#で直接呼び出してリンクを新規ウィンドウで開けるようになった!