在Unity中开发软件中,会出现很多时候需要将Unity中的文本内容复制到剪贴板中,然后复制到其他软件的应用中去,例如分享一个链接,例如会议软件复制会议号码等
注意 除了本篇的复制文本功能,其他的Webgl扩展功能请查看另一篇专栏文章
该专栏文章《Unity的Webgl端编写jslib常用功能》,提供了10个常用功能,功能如下(后续如果有增加功能还会更新至该文章中):
1、“监听网页关闭或刷新”
2、“获取当前设备时PC还是移动端”
3、“获取当前网址”
4、“获取LocalStorage的数据”
5、“保存数据到LocalStotage”
6、“获取SessionStorage的数据”
7、“保存数据到SessionStorage”
8、“将文本拷贝到剪贴板”
9、“关闭当前网页”
10、“打开网页”
首先C#语言中提供了一个字段,只要将字符串内容赋值给这个字段,就能将文本内容复制到系统的剪贴板中
这个字段如下
GUIUtility.systemCopyBuffer = “测试内容复制到剪贴板”;
只需要将复制文本内容赋值给上面这个字段即可,但是这个字段原先只有在PC端有效果,现版本的Unity,不知道是语言版本更新导致的还是Unity版本里做了适配,支持移动端的复制到剪贴板了。
但在Webgl端还是不支持,Webgl端是个特殊的版本,因此很多C#语言库中的方法和功能都会在跨平台编译时导致失效,不管是用Mono还是IL2CPP的跨平台编译。
因此将文本复制到剪贴板这个功能就无效,需要我们自己写js代码放到Unity中调用,好在新版本的Unity已经支持js代码了
因此我们只需要在Assets文件夹下创建一个txt文件,将后缀改成jslib,就可以在该文件中编写js代码了如下图:
在jslib文件中首先需要声明一个对象,并且将全局对象添加到Unity的全局库中
例如:
var WebglPlugin = {
};
mergeInto(LibraryManager.library, WebglPlugin);
如此一来,所有在WebglPlugin对象中编写的js方法,都可以在Unity中通过C#调用,
这里的功能是将文本复制到剪贴板,那么js代码就是常用的复制功能即可,但是需要注意的是Unity传输到js的内容需要进行转换,因为两种代码编译方式不同,如果不转换的话会导致乱码
Unity传输到js的 字符串转换方式:UTF8ToString
js传回给Unity的 字符串转换方式:stringToUTF8
下面直接贴上js的复制代码:
CopyTextToClipboard: function (ptr) {
var text = UTF8ToString(ptr);
navigator.clipboard.writeText(text).then(function () {
console.log('Async: Copying to clipboard was successful!');
}, function (err) {
console.error('Async: Could not copy text: ', err);
});
},
编写完之后jslib并且将文件放在Assets文件夹下后,就可以在C#中调用了
C#中调用也很简单,声明一个和jslib中方法名以及参数一样的静态方法,再加上调用外部方法的特性即可,但是需要注意的是该方法只有Webgl平台可用,因此如果需要打包其他平台时,最好加上声明方法前加上预编译,代码如下:
#if UNITY_WEBGL && !UNITY_EDITOR
[System.Runtime.InteropServices.DllImport("__Internal")]
public static extern void CopyTextToClipboard(string text);
#endif
合并其余平台的复制方法形成一个通用的复制到剪贴板的方法:
public static void CopyToClipboard(string value)
{
#if UNITY_WEBGL && !UNITY_EDITOR
CopyTextToClipboard(value);
#else
GUIUtility.systemCopyBuffer = value;
#endif
}
到此将文本内容复制到剪贴板的功能就完成了,但是目前这个方法,本人测试过只有Windows,Android,Webgl这三个平台,理论上Mac和IOS也可以使用,但是这两个平台当时不是我弄,就不清楚是否有问题。
如果有朋友测试有问题,可以将解决方案写到评论区哦,我会更新到文章代码中。非常感谢~