N煎ログブログ

n番煎じと言っても過言ではない今更な、でも個人的に躓いたUnityやUE4等での開発についての云々を書いていきます

【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));

等といった記述で、新規ウィンドウを開いてリンクを開くことが出来ました。

【参考】

belhb.hateblo.jp

EvalとCallの違いは、リファレンスを読む限り、呼び出す関数に引数を含むか含まないかだと思われます。

docs.unity3d.com

docs.unity3d.com

そもそも引数に記述されている内容の意味は?

Application.ExternalEval(string.Format("window.open('{0}','_blank')", url));

 の引数に、

string.Format("window.open('{0}','_blank')", url)

とあるのですが、「string.Format」は「どのような文字列にするか」を指定できる関数になります。そしてこのプログラムの場合、「{0}」には「url」変数の値が入ります。

他にもいろいろ出来るのですが、詳しくはこちらなどを参考に。

www.sejuku.net

 さて、では「string.Format」に渡された引数をもとに出力した文字列に直すと、

 window.open('url','_blank')

 となります(「url」部分は実際にはURLの文字列が入ります)。

では、この「window.open」とは何なのでしょうか。

「window.open」って?

ずばりこれがjavaScriptです!

「Application.ExternalEval」はこの関数を呼び出していたのです!

具体的には、関数名通りウィンドウを開く関数になります。

引数には、「URL」「開くウィンドウの名前」「ウィンドウオプション」が指定できます。

developer.mozilla.org

プロパティについてはこの記事では省略しますが、こちらのサイトに情報が載っています。

amenti.usamimi.info

この時、open関数の第二引数に

nullもしくは_blank

を渡すと、新規ウィンドウが生成されます!

つまりまとめると、

 window.open('url','_blank')

 は「新規ウィンドウでURLのリンク先を開いてね」という関数だということです。

じゃあ、このプログラムをUnityC#で呼べれば新規ウィンドウを開くことが出来ますね!

Unity(C#)でjavaScriptの関数を呼ぶ方法

この方法に至っては、リファレンスの方で誘導がなされていました。

docs.unity3d.com

このページに記述されているURLに飛ぶと、

docs.unity3d.com

このリファレンスに飛びます。

内容をまとめると、

  1. Plugins サブフォルダーの下に .jslib拡張子のファイルを作成
  2. プラグインファイルの中に構文(プログラム)を記述
  3. C#で呼び出す

になります。 

この「2.」で書くプログラムで「window.open」関数を呼び出せば出来そうですね!

書いてみる

まずは、jslibの方を記述していきます。 

※jslibは必ず「Plugins」フォルダ内に作成しましょう!

gist.github.com

書き方はリファレンスを参考に、

独自に追加したのは

OpenToBlankWindow: function (_url) {
    window.open(Pointer_stringify(_url),'_blank')
}, 

 です。

Pointer_stringify

は受け取った文字列をjavaScript文字列に変換します。

次に呼び出すC#側を記述していきます。

gist.github.com

[DllImport("__Internal")]

は、「この関数は外で定義されていますよ」と知らせるものです。

 これで、C#javaScriptを呼び出すことが出来るようになり、window.openを呼び出して新規ウィンドウでリンクを開くことが出来るようになりました。

まとめ

javaScriptC#で直接呼び出してリンクを新規ウィンドウで開けるようになった!