Unity3D剪貼板
最近遇到一個(gè)需要調(diào)用Android與IOS設(shè)備本身剪貼板的需求航徙,就是在Unity中赴捞,要將文本復(fù)制到設(shè)備本身的剪貼板中可很,然后在其他應(yīng)用程序中都能粘貼睛驳。
最開始在網(wǎng)上查到的方式是使用Unity3D本身自帶的TextEditor 類進(jìn)行使用,使用方法如下:
TextEditor te =newTextEditor();te.content =newGUIContent(yourText);te.OnFocus();te.Copy();
期初在電腦上測試時(shí)是可以用的稿械,然而這種到了Android和IOS設(shè)備上卻坑了……完全沒反應(yīng)选泻。在多方查找之下,終無結(jié)果美莫,所以能想到的方法就是在Unity中使用C#調(diào)用Android和IOS自身的接口分別實(shí)現(xiàn)页眯。
ClipboardManager cm =(ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);//復(fù)制到剪貼板cm.setText(message);//從剪貼板獲取文本stringtext = cm.getText();
針對Android和IOS雙平臺
Unity3D調(diào)用Android剪貼板
publicclassClipboardTools{publicstaticClipboardManager clipboard =null;// 向剪貼板中添加文本 publicvoidcopyTextToClipboard(finalContext activity,finalString str)throwsException{? ? ? ? clipboard = (ClipboardManager) activity.getSystemService(Activity.CLIPBOARD_SERVICE);? ? ? ? ClipData textCd = ClipData.newPlainText("data", str); ? ? ? ?clipboard.setPrimaryClip(textCd);? ? }// 從剪貼板中獲取文本publicStringgetTextFromClipboard(){if(clipboard !=null&& clipboard.hasPrimaryClip()? ? ? ? && clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {? ? ? ? ? ? ClipData cdText = clipboard.getPrimaryClip();? ? ? ? ? ? ClipData.Item item = cdText.getItemAt(0);returnitem.getText().toString();? ? ? ? }return"null";? ? }}
Android復(fù)制
首先,Android剪貼板的使用要通過從Activity中獲取ClipboardManager 服務(wù)厢呵,然后才能進(jìn)行使用窝撵。在這里我們先定義了一個(gè)靜態(tài)的ClipboardManager 引用:
publicstaticClipboardManager clipboard =null;
原因是當(dāng)Unity3D對Android類(ClipboardTools)的方法掉用完后,可能會被垃圾回收襟铭,所以將ClipboardManager 定義為靜態(tài)才能通過getTextFromClipboard()方法獲取先前存入剪貼板的文本碌奉。
對Android剪貼板類ClipboardManager 的使用是固定的用法。
Android粘貼
做好了復(fù)制寒砖,粘貼模塊就比較簡單了,固定的模式赐劣,博主在此處添加了一些 if 的邏輯判斷,是對剪貼板中內(nèi)容進(jìn)行判斷哩都,如:是否為文本魁兼,是否有內(nèi)容等……但要注意的是,若沒有將ClipboardManager 設(shè)為靜態(tài)漠嵌,則在調(diào)用完復(fù)制方法時(shí)咐汞,ClipboardTools類可能會被垃圾回收盖呼,那么ClipboardManager 的引用會變?yōu)閚ull,從新獲取不太方便化撕,所以博主就將其設(shè)為靜態(tài)了几晤。
Android剪貼板項(xiàng)目導(dǎo)入U(xiǎn)nity3D
在Unity3D中調(diào)用Android的東西,首先要在Unity3D項(xiàng)目中創(chuàng)建好環(huán)境:
1.在Untiy3D項(xiàng)目的Assets目錄下創(chuàng)建Plugins目錄侯谁。2.在Plugins目錄下創(chuàng)建Android目錄锌仅。3.在Android 目錄下創(chuàng)建bin目錄。4.在bin 目錄下放置你編寫的類的jar包墙贱。
前三步都是創(chuàng)建文件夾就沒什么好說了,從第四步開始贱傀,這里所說的Jar包僅僅是你所寫的那個(gè)類的jar包惨撇,并非整個(gè)Android項(xiàng)目的jar包,使用Eclipse編寫的同學(xué)可以在府寒?魁衙??中將Is Library勾上株搔,就可以直接在Android項(xiàng)目下的bin文件夾下找到打好的Jar包剖淀。
第五步所說的Unity3D的 classes.jar 包,在你的Unity3D安裝目錄下的Editor\Data\PlaybackEngines\androidplayer\development\bin 目錄下纤房,直接將其復(fù)制到你的Unity3D項(xiàng)目的bin 目錄下即可纵隔。
注:有些朋友可能進(jìn)行了第五步后會出現(xiàn)Unity報(bào)錯(cuò),這時(shí)可以先不進(jìn)行第五步看看能不能搞定炮姨,原因可能是因?yàn)榕渲脝栴}捌刮,還待校驗(yàn)……
Unity3D調(diào)用Android類與方法
在Unity3D中對Android類與方法的調(diào)用方法代碼如下:
#ifUNITY_ANDROIDAndroidJavaObject androidObject =newAndroidJavaObject("com.test.ClipboardTools");? ? AndroidJavaObject activity =newAndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity");if(activity ==null)return;// 復(fù)制到剪貼板androidObject.Call("copyTextToClipboard", activity, input);// 從剪貼板中獲取文本String text =androidObject.Call("getTextFromClipboard");#endif
首先,或取出先前編寫的Android類的實(shí)例對象:
AndroidJavaObject androidClass = androidClass =newAndroidJavaObject("com.test.ClipboardTools");
要注意的是舒岸,后面的字符串"com.test.ClipboardTools"是你Android項(xiàng)目的<類目錄> + <類名>绅作,這個(gè)不能寫錯(cuò),寫錯(cuò)就無法或取出你要的Android類蛾派。
接著俄认,是獲取Android所需要的Activity對象,也就是Android 項(xiàng)目中 copyTextToClipboard 方法所需要的 Context 參數(shù)洪乍,由于我們的Android類沒有繼承于Activity 類眯杏,而對ClipboardManager 的使用又需要當(dāng)前Android運(yùn)行時(shí)主線程的Activity,所以博主采用的是從 Unity3D 中獲取后傳輸過去典尾。
最后是對ClipboardManager 類的 “復(fù)制”役拴、“獲取”兩個(gè)方法的調(diào)用。
#if UNITY_ANDROID 和 #endif 代表的是在指定的平臺才進(jìn)行編譯钾埂,如此處的 UNITY_ANDROID 代表期間的代碼只在Android平臺才進(jìn)行編譯河闰,若是直接使用科平,則可能在IOS平臺出現(xiàn)編譯異常,因?yàn)镮OS平臺并沒有AndroidJavaObject 這種類的庫文件姜性。
Unity3D調(diào)用IOS剪貼板
使用Unity3D調(diào)用IOS的剪貼板相對容易瞪慧,但是需要在MAC上進(jìn)行編寫測試。
IOS對剪貼板的使用
對IOS平臺的調(diào)用博主采用簡潔的方式部念,讓Unity3D調(diào)用C弃酌,再用C去調(diào)用IOS的方法。先附上兩個(gè)文件的源碼:
Clipboard.h 文件 :
@ interface Clipboard :NSObjectextern"C"{/*? compare the namelist with system processes? */void_copyTextToClipboard(constchar*textList);}@end
Clipboard.mm 文件 :
@implementationClipboard//將文本復(fù)制到IOS剪貼板- (void)objc_copyTextToClipboard : (NSString*)text{UIPasteboard*pasteboard = [UIPasteboardgeneralPasteboard];? ? pasteboard.string = text;}@endextern"C"{staticClipboard *iosClipboard;void_copyTextToClipboard(constchar*textList)? ? {NSString*text = [NSStringstringWithUTF8String: textList] ;if(iosClipboard ==NULL)? ? ? ? {? ? ? ? ? ? iosClipboard = [[Clipboard alloc] init];? ? ? ? }? ? ? ? ? ? ? [iosClipboard objc_copyTextToClipboard: text];? ? }}
.h文件和.mm文件需要放在Unity項(xiàng)目的Assets/Plugins/目錄下的任意目錄下儡炼。
與C相同妓湘,Object-C也是需要一個(gè)頭文件負(fù)責(zé)定義,還有一個(gè)真正編寫內(nèi)容的文件乌询,這個(gè)文件可以有兩種后綴“.m"和”.mm"榜贴,“.m"中只能編寫Object-C代碼,而”.mm"中可以編寫C代碼妹田。
在Clipboard.h中唬党,我們定義了一個(gè)C的方法,在Clipboard.mm中鬼佣,我們實(shí)現(xiàn)了C的方法驶拱,并在其中調(diào)用了IOS的剪貼板功能。代碼挺簡單晶衷,就不進(jìn)行一一解釋了蓝纲。
這里稍微發(fā)下牢騷:博主學(xué)習(xí)過數(shù)種編程語言,自信在學(xué)習(xí)一種新語言時(shí)不會寫至少能看懂房铭,然而Object-C的出現(xiàn)碾碎了博主的現(xiàn)實(shí)驻龟,尼瑪,這方法定義到底是神馬意思缸匪?簡直反人類啊……
Unity3D對IOS類的調(diào)用
Unity3D對IOS的使用倒是比較簡單翁狐,不過也需要進(jìn)行環(huán)境配置:
1.在Untiy3D項(xiàng)目的Assets目錄下創(chuàng)建Plugins目錄。2.在Plugins目錄下創(chuàng)建IOS目錄凌蔬。3.在IOS 目錄下放置".h"文件和".mm"文件露懒。
然后是調(diào)用的C#源碼:
usingUnityEngine;usingSystem.Collections;usingSystem.Runtime.InteropServices;publicclassClipboardManager{#ifUNITY_IPHONE/* Interface to native implementation */[DllImport ("__Internal")]privatestaticexternvoid_copyTextToClipboard(stringtext);#endifpublicstaticvoidCopyToClipboard(stringinput){#ifUNITY_ANDROID// 對Android的調(diào)用#elifUNITY_IPHONE_copyTextToClipboard(input);#endif}}
這是一個(gè)C#類,CopyToClipboard()方法是對剪貼板的應(yīng)用砂心,大家可以看到懈词,在ClipboardManager類里面,定義了這種東西:
#ifUNITY_IPHONE/* Interface to native implementation */[DllImport ("__Internal")]privatestaticexternvoid_copyTextToClipboard(stringtext);#endif
這表示在IOS平臺的編譯上辩诞,會導(dǎo)入Objcet-C編寫的IOS方法坎弯,這是固定的寫法,大概了解即可,不要忘了導(dǎo)入庫文件哦(using System.Runtime.InteropServices;)
在下面抠忘,就可以直接對IOS定義方法的調(diào)用了撩炊,不過博主還是推薦加上以下東西:
#ifUNITY_ANDROID#elifUNITY_IPHONE#endif
以免在跨平臺編譯時(shí)出現(xiàn)問題。