はじめに
入力フィールドを使用しないでコピペしたかった。
調べてみた結果
(WebGLの場合) | GUIUtility.systemCopyBuffer | .jslib |
---|---|---|
コピー | × (ローカル○) | ○ |
貼り付け | × (ローカル○) | △ |
※Ctrl+C/Vは使わない(コピペボタンを設置したい)。 |
GUIUtility.systemCopyBuffer
PC・Mac環境(非WebGL環境)やローカル環境のWebGLなら使えます(スマホ環境は未確認)。
参考:
https://kan-kikuchi.hatenablog.com/entry/Clipboard
JavaScriptでコピペする
結論から書くとこの方法はローカル環境では動作しますが、unityroomなどのサイトにアップロードすると貼り付け処理だけブロックされることがあります(コピー処理は動作します)。
手順
- Pluginsフォルダ下に作成した**(任意ファイル名).jslib**に以下のコードを張り付けてください。
コピーペースト処理は次の記事を参考にしました。butakoma様に感謝します。
//.jslibファイルに張り付けてください。
mergeInto(LibraryManager.library, {
CopyWebGL: function(str) {
var str = Pointer_stringify(str);
var listener = function(e){
e.clipboardData.setData("text/plain" , str);
e.preventDefault();
document.removeEventListener("copy", listener);
}
document.addEventListener("copy" , listener);
document.execCommand("copy");
},
AsyncPasteWebGL: function() {
if(navigator.clipboard){
navigator.clipboard.readText()
.then(function(text){
SendMessage('GameSceneManager', 'PasteWebGL', text); //クリップボードから取得したテキストを渡します。引数はゲームオブジェクト名、メソッド名、渡す値
});
}
}
});
2.次のコードをどこでもいいので追加してください。(C#)
//コピー
[DllImport("__Internal")]
private static extern void CopyWebGL(string str);
//ペースト
[DllImport("__Internal")]
private static extern void AsyncPasteWebGL();
CopyWebGLを呼ぶことでクリップボードへコピーすることができます。
AsyncPasteWebGLは、ローカル環境では動作しますが、前述したように環境によってはブロックされることがあります。(それでももし使う場合はAsyncPasteWebGL関数内の**SendMessage(ゲームオブジェクト名, 呼び出すメソッド名, 渡すテキスト);**を指定してください)
Ctrl+C/Vでコピペする場合 : WebGLInput
「WebGLInput」パッケージを導入するとInputFieldとキーボードを使ってコピペができるようになります。
導入方法は、easy_light2213様の記事が参考になるかもしれません。
おわりに
CopyWebGLメソッドとWebGLInputパッケージを併用することでだいたいのやりたいことはできると思います。貼り付け処理が厳しいのはユーザーの情報を勝手に抜き取れないようにするためだと考えられます。
もし間違いがあればコメントにてご指摘ください。