前言
為徽州等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及徽州網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、徽州網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
Unity官網(wǎng)提供了詳盡的文檔和豐富的教學(xué)視頻,昨天跟著視頻做了一個簡單的3d游戲“roll-a-ball”。游戲涉及了許多Unity的基本知識,用來入門很不錯。
本文主要給大家了關(guān)于Unity移動端的復(fù)制的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧
游戲上線很久了,有些玩家慢慢就流失了,為了讓剛流失的玩家再度回歸所以做了召回功能!如果一個200級的玩家10天沒上線且成功召回的,就會給予召回玩家豐厚的獎勵!
Q:那如何召回這個流失的玩家呢?
A:召回肯定得有類似召回碼的東東啊,是的。服務(wù)器根據(jù)玩家ID生成一定位數(shù)的字母和數(shù)字組合,發(fā)給客戶端,客戶端召回界面顯示召回碼
Q:不可能讓玩家一個一個在聊天框輸入吧?玩家肯定會罵:“什么傻逼設(shè)計(jì),老子不玩了,,,”
A:玩家是大爺,所以做復(fù)制召回嗎功能還是很有必要的!
那么如何實(shí)現(xiàn)這個功能呢?Unity不支持復(fù)制嗎?是的,Unity是支持,僅僅支持PC端的,就是這玩意TextEditor!
TextEditor text = new TextEditor(); text.content = new GUIContent(yourText); text.OnFocus(); text.Copy();
這么就實(shí)現(xiàn)了PC端的復(fù)制,那么移動端的怎么做呢,別著急,小伙子,一個一個來,先看看Android是怎么復(fù)制的!
首先創(chuàng)建安卓庫工程,在MainActivity里添加這段代碼就好,導(dǎo)出jar包在Unity中調(diào)用即可,接下來會說Unity里如何去調(diào)用!
步驟:
1. 在Untiy3D項(xiàng)目的Assets目錄下創(chuàng)建Plugins目錄。
2. 在Plugins目錄下創(chuàng)建Android目錄。
3. 在Android 目錄下創(chuàng)建bin目錄。
4. 在bin 目錄下放置你編寫的類的jar包
package com.wuzhang.testandroid; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; import android.R.string; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningAppProcessInfo; import android.app.Service; import android.content.ClipData; import android.content.ClipDescription; import android.content.ClipboardManager; import android.content.Context; import android.os.Looper; import android.support.v4.app.NotificationCompat; import android.support.v4.content.FileProvider; import android.view.ContextThemeWrapper; public class MainActivity extends UnityPlayerActivity { private Vibrator mVibrator01;//聲明一個振動器對象 private static Context instance; private String TAG = "log"; public static String gameObgectName = "Main Camera"; public static String methodName = "OnCoderReturn"; public static ClipboardManager clipboard = null; private BatteryListener listener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); instance = getApplicationContext(); } public static Context getContext() { return instance; } /* * 向剪貼板中添加文本 */ public void copyTextToClipboard(final String str) throws Exception { if (Looper.myLooper() == null){ Looper.prepare(); } clipboard = (ClipboardManager) MainActivity.instance.getSystemService(Activity.CLIPBOARD_SERVICE); ClipData textCd = ClipData.newPlainText("data", str); clipboard.setPrimaryClip(textCd); } /* * 從剪貼板中獲取文本 */ public String getTextFromClipboard() { if (clipboard != null && clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) { ClipData cdText = clipboard.getPrimaryClip(); ClipData.Item item = cdText.getItemAt(0); return item.getText().toString(); } return "null"; } }
安卓中如何調(diào)用這段代碼呢?
////// 剪切文本 /// /// public void CopyToClipboard(string input) { #if UNITY_ANDROID // 對Android的調(diào)用 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = jc.GetStatic("currentActivity"); if (activity == null) return; // 復(fù)制到剪貼板 activity.Call("copyTextToClipboard", input); //從剪貼板中獲取文本 string text = activity.Call ("getTextFromClipboard"); #endif }
安卓的好了,接著該是高大上的IOS了,有些人看到IOS就慫了,不知道從哪下手,不知道該怎么去寫,完全沒概念。不好意思,我和你們也是一樣慫,我也是大姑娘上轎,頭一回!不要慫,就是干,大不了第一次不會成功,就去調(diào)試唄!有這個心態(tài),說明你還是幸運(yùn)的,我們直接是線上項(xiàng)目,沒有時間去調(diào)試的,做完時,我心里沒一點(diǎn)底??!超慫的那種,,,后來出iPhone的測試包,沒想到一次過了,心里的大石頭終于落下了!那我們看看IOS是怎么實(shí)現(xiàn)的吧?IOS使用的ObjectC和C語言還是有些類似的,在OC中.h文件是聲明,.m文件是實(shí)現(xiàn),所以需要Clipboard.h和Clipboard.mm兩個文件!
首先去聲明這個Clipboard類,
@ interface Clipboard : NSObject extern "C" { /* compare the namelist with system processes */ void _copyTextToClipboard(const char *textList); } @end
接下來是Clipboard.mm文件,切記千萬不要忘記引用 #import "Clipboard.h"
#import"Clipboard.h" @implementation Clipboard //將文本復(fù)制到IOS剪貼板 - (void)objc_copyTextToClipboard : (NSString*)text { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = text; } @end extern "C" { static Clipboard *iosClipboard; void _copyTextToClipboard(const char *textList) { NSString *text = [NSString stringWithUTF8String: textList] ; if(iosClipboard == NULL) { iosClipboard = [[Clipboard alloc] init]; } [iosClipboard objc_copyTextToClipboard: text]; } }
.h文件和.mm文件需要放在Unity項(xiàng)目的Assets/Plugins/下的任意路徑下即可,一般程序員大多數(shù)是有潔癖的不放到Assets/Plugins/IOS/文件夾下,心里就是不舒服!再啰嗦兩句.m和.mm有什么區(qū)別嗎?還真有,“.m"中只能編寫Object-C代碼,而”.mm"中可以編寫C代碼。所以有 extern "C" 說明我們使用的是C代碼!
Unity3D對IOS類的調(diào)用
1. 在Untiy3D項(xiàng)目的Assets目錄下創(chuàng)建Plugins目錄。
2. 在Plugins目錄下創(chuàng)建IOS目錄。
3. 在IOS 目錄下放置".h"文件和".mm"文件。
好了,趕緊說怎么調(diào)用呢,這會都夜里1點(diǎn)了,再啰嗦就天亮了!調(diào)用.h聲明的函數(shù)即可:
//調(diào)用clipboard.h中的接口 _copyTextToClipboard (input); Debug.LogError ("CopyToClipboard_______"+input);
就這么調(diào)用就OK了,是不是很失望!這個是所有平臺的調(diào)用
public static void CopyToClipboard(string input) { #if UNITY_ANDROID // 對Android的調(diào)用 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = jc.GetStatic("currentActivity"); if (activity == null) return; // 復(fù)制到剪貼板 activity.Call("copyTextToClipboard", input); #elif UNITY_IPHONE //調(diào)用clipboard.h中的接口 _copyTextToClipboard (input); Debug.LogError ("CopyToClipboard_______"+input); #elif UNITY_EDITOR TextEditor te = new TextEditor(); te.content = new GUIContent(input); te.OnFocus(); te.Copy(); #endif }
好了,到此寫完了,現(xiàn)在感覺熬夜寫博客事件很奢侈的事情了,睡覺嘍!有問題的小伙伴記得@我,共同交流,下篇寫獲取手機(jī)剩余存儲空間的插件!
傳送門:https://gitee.com/wuzhang/UnityCallClipboard.git (本地下載)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。