UnityのWebGLビルドで新しいタブでURL開いたり、クリップボード操作したり

公開日:2018-12-23
最終更新:2018-12-23

適当記事

拡張子jslibのjsファイルを作って連携させる感じでやれるっぽい。

参考
WebGL: ブラウザースクリプトとの相互作用
https://docs.unity3d.com/ja/current/Manual/webgl-interactingwithbrowserscripting.html

これは悲しい話ですがUnityのjslibはES2015(ES6)以降で記述が出来ないという話があります、マジかどうかどこに書いてんのかよく分からなかったが、自分はconstとか使おうとするとうまくビルド出来なくて検索してたら、そう書いてあるQiita記事があったのでそうなんだと思う。

で、こんな感じにjslibを書く

.jslib

mergeInto(LibraryManager.library, {  
    openWindow: function(link)  
    {  
        var url = Pointer_stringify(link);  
        document.onmouseup = function()  
        {  
            window.open(url);  
            document.onmouseup = null;  
            document.ontouchend = null;  
        }  
        document.ontouchend = function()  
        {  
            window.open(url);  
            document.onmouseup = null;  
            document.ontouchend = null;  
        }  
    },  

    clipboardWriteText: function(str)  
    {  
        var text = Pointer_stringify(str);  
        navigator.clipboard.writeText(text);  
    },  
});  

openWindowでdocument.onmouseupとかやってるのはこれやらないとブラウザにポップアップブロックされるから、めんどい、それと一応適当にontouchendも入れといてみた。

navigator.clipboard(Clipboard API)については、
https://developers.google.com/web/updates/2018/03/clipboardapi
とかを参考、これで楽にクリップボード操作出来る。
ただし!HTTPS or localhostじゃないとダメらしいし、読み取りの場合には権限が必要で、最初に許可するかのダイアログ出るっぽい。

このjslibをAssets/Plugin/WebGLとかに入れる。

 

Unity スクリプト

using System.Runtime.InteropServices;  

public static class Util  
{  

  [DllImport("__Internal")]  
  private static extern void openWindow(string url);  

  [DllImport("__Internal")]  
  private static extern void clipboardWriteText(string str);  

}  

こんな感じにしとけば使える。

もうちょっとやっていくと、こう

using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
using System.Runtime.InteropServices;  

public static class Util  
{  

  public static void OpenURLNewTab(string url)  
  {  
    var uri = new System.Uri( url );  
    if( Application.platform == RuntimePlatform.WebGLPlayer )  
    {  
      openWindow( uri.AbsoluteUri );  
    } else {  
      Application.OpenURL( uri.AbsoluteUri );  
    }  
  }  

  public static void ClipboardWrite(string str)  
  {  
    if( Application.platform == RuntimePlatform.WebGLPlayer )  
    {  
      clipboardWriteText(str);  
    } else {  
      GUIUtility.systemCopyBuffer = str;  
    }  
  }  

  [DllImport("__Internal")]  
  private static extern void openWindow(string url);  

  [DllImport("__Internal")]  
  private static extern void clipboardWriteText(string str);  
}  

こんな感じにしてみました。
 
はい

 

実際に使ったゲームというか実際に動いてる例(画面下のinfo押したら出る画面で割と無意味に使っている)
https://unityroom.com/games/ngng-clickcube

おわり

記事が少しでもいいなと思ったらクラップを送ってみよう!
0
+1
@zzz5tの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする