前提・実現したいこと
開発環境:Unity2017.3.0f3(windows 8.1)
実装環境:WebGLプラットフォーム(ブラウザアプリ)
開発言語:C#
Unity上で、ゲームスコアをTwitterに投稿する機能を実装しようとしています。
有名なプラグインとして『SocialConnector』様がありますが、今回はもっとシンプルに実装したいのでこのプラグインは無しで実装したいと考えております。
発生している問題・エラーメッセージ
Application.OpenURL()を使うことで、ブラウザを起動してツイートを投稿することはできましたが、今回使用するプラットフォームはWebGLです。
そのため、OpenURL()ではアクティブになっているゲームタブをツイートに使用してしまいます。
ゲームの実行を妨げないためにも、ツイート投稿を新しいタブかポップアップウィンドウで実行するよう実装したいです。
該当のソースコード
C#
1//キーボードから[A]キーを押すとブラウザでツイート画面を開く 2Void Update(){ 3 if(Input.GetKeyDown(KeyCode.A)){ 4 //指定したURLを開く:Twitterインテントを利用して投稿フォームを開く 5 Application.OpenURL("http://twitter.com/intent/tweet?text=test"); 6 } 7}
試したこと
「Application.ExternalEval()を用いると新しいウィンドウで開く」というネット文献は確認しましたが、この関数はUnity2017.3では廃止されており使用できませんでした。
公式リファレンス:https://docs.unity3d.com/ja/2017.3/ScriptReference/Application.ExternalEval.html
Unity2017.3以降のバージョンで「別窓でブラウザを開くことができる」代替関数、もしくは機能を探しています。ご助言戴けると痛み入ります。
###改良後のソースコード(2018/03/24 13:00追記)
ruccho 様より戴いた回答を元にソースコードを修正しました。
ファイル構造:/Assets/Plugins/WebGL/TwitterPlugin.jslib
JS
1var TwitterPlugin = { 2 3 //指定されたURLを開くJavascript 4 OpenNewWindow: function(openUrl){ 5 //引数の定義 6 var url = Pointer_stringify(openUrl); 7 8 //名前を指定して新しいウィンドウを開く 9 window.open(url, "TweetWindow"); 10 } 11}; 12 13mergeInto(LibraryManager.library, TwitterPlugin);
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Runtime.InteropServices; 5 6public class TweetController : MonoBehaviour { 7 8 //JS関数の呼び出し 9 [DllImport("__Internal")] private static extern void OpenNewWindow(string url); 10 11 void Update () { 12 if(Input.GetKeyDown(KeyCode.A)){ 13 OpenNewWindow("http://twitter.com/intent/tweet?text=" + WWW.EscapeURL("てすと" + "#Unity")); 14 } 15 } 16}
このコードはUnity上で動作確認するとライブラリ未登録エラー(EntryPointNotFoundException: OpenNewWindow)が出ましたが、ビルドしてブラウザ上で実行したところ、問題なく動作確認しました。
しかし、window.Openを用いた方法ではウェブブラウザのポップアップブロック機能に引っかかってしまうようです。
個別にポップアップを許可すればツイートが可能ですが、できればポップアップブロック無しで投稿できるようにしたいところです。
引き続き、ポップアップブロックを回避する方法についてご教授戴けることを願います。
###ポップアップブロック対策の解決(2018/03/24 21:30追記)
UnityC#スクリプトで実行しようとした場合、メソッドの実行が1フレーム遅れるため、「ユーザの意図しない動作によるポップアップ」に該当するためブロックされます。
これを回避するには「ユーザが入力した動作によるポップアップ」と判断させる必要があると参考文献にありました。
参考:https://goonytoons.com/blog/index.php/2017/04/06/unity-webgl-stuck-points/
これを回避するために用意したコードがこちらです。
JS
1var TwitterPlugin = { 2 3 //指定されたURLを開くJavascript 4 OpenNewWindow: function(openUrl){ 5 //引数の定義 6 var url = Pointer_stringify(openUrl); 7 8 document.onmousedown = function(){ 9 window.open(url); 10 document.onmousedown = null; 11 } 12 } 13}; 14 15mergeInto(LibraryManager.library, TwitterPlugin);
このような形でJavaScriptを実装すると「マウスクリックして押し込んだ瞬間」の動作を登録することができます。
このコードを実行したあとにマウスをクリックするとポップアップブロックを回避して実行できました。
あとはこのコードをマウスクリックする動作の直前(GUIボタンにカーソルを合わせたとき)などで実行することで、擬似的なTwitter投稿ボタンが実装できるハズと考えております。
ご助言戴き感謝致します、ありがとうございました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/24 03:53