Unity 移動端的復制這么寫


游戲上線很久了,有些玩家慢慢就流失了,為了讓剛流失的玩家再度回歸所以做了召回功能!如果一個200級的玩家10天沒上線且成功召回的,就會給予召回玩家豐厚的獎勵!

Q:那如何召回這個流失的玩家呢?

A:召回肯定得有類似召回碼的東東啊,是的。服務器根據玩家ID生成一定位數的字母和數字組合,發給客戶端,客戶端召回界面顯示召回碼

Q:不可能讓玩家一個一個在聊天框輸入吧?玩家肯定會罵:“什么傻逼設計,老子不玩了,,,”

A:玩家是大爺,所以做復制召回嗎功能還是很有必要的!

那么如何實現這個功能呢?Unity不支持復制嗎?是的,Unity是支持,僅僅支持PC端的,就是這玩意TextEditor!

TextEditor text = new TextEditor();
text.content = new GUIContent(yourText);
text.OnFocus();
text.Copy();

這么就實現了PC端的復制,那么移動端的怎么做呢,別着急,小伙子,一個一個來,先看看Android是怎么復制的!

首先創建安卓庫工程,在MainActivity里添加這段代碼就好,導出jar包在Unity中調用即可,接下來會說Unity里如何去調用!
步驟:

1. 在Untiy3D項目的Assets目錄下創建Plugins目錄。

2. 在Plugins目錄下創建Android目錄。

3. 在Android 目錄下創建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";
    }


}
View Code

安卓中如何調用這段代碼呢?

 /// <summary>
    /// 剪切文本  
    /// </summary>
    /// <param name="input"></param>
    public void CopyToClipboard(string input)
    {
#if UNITY_ANDROID
        // 對Android的調用  
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");

        if (activity == null)
            return;

        // 復制到剪貼板  
        activity.Call("copyTextToClipboard", input);

        //從剪貼板中獲取文本  
        string text = activity.Call<string>("getTextFromClipboard");
#endif
    }

安卓的好了,接着該是高大上的IOS了,有些人看到IOS就慫了,不知道從哪下手,不知道該怎么去寫,完全沒概念。不好意思,我和你們也是一樣慫,我也是大姑娘上轎,頭一回!不要慫,就是干,大不了第一次不會成功,就去調試唄!有這個心態,說明你還是幸運的,我們直接是線上項目,沒有時間去調試的,做完時,我心里沒一點底啊!超慫的那種,,,后來出iPhone的測試包,沒想到一次過了,心里的大石頭終於落下了!那我們看看IOS是怎么實現的吧?IOS使用的ObjectC和C語言還是有些類似的,在OC中.h文件是聲明,.m文件是實現,所以需要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
//將文本復制到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項目的Assets/Plugins/下的任意路徑下即可,一般程序員大多數是有潔癖的不放到Assets/Plugins/IOS/文件夾下,心里就是不舒服!再啰嗦兩句.m和.mm有什么區別嗎?還真有,“.m"中只能編寫Object-C代碼,而”.mm"中可以編寫C代碼。所以有 extern "C" 說明我們使用的是C代碼!

Unity3D對IOS類的調用

1. 在Untiy3D項目的Assets目錄下創建Plugins目錄。

2. 在Plugins目錄下創建IOS目錄。

3. 在IOS 目錄下放置".h"文件和".mm"文件。

好了,趕緊說怎么調用呢,這會都夜里1點了,再啰嗦就天亮了!調用.h聲明的函數即可:

//調用clipboard.h中的接口  
_copyTextToClipboard (input);  
Debug.LogError ("CopyToClipboard_______"+input); 

就這么調用就OK了,是不是很失望!這個是所有平台的調用

public static void CopyToClipboard(string input)
    {
#if UNITY_ANDROID
        // 對Android的調用  
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");
        if (activity == null)
            return;

        // 復制到剪貼板  
        activity.Call("copyTextToClipboard", input);
#elif UNITY_IPHONE
        //調用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
    }

好了,到此寫完了,現在感覺熬夜寫博客事件很奢侈的事情了,睡覺嘍!有問題的小伙伴記得@我,共同交流,下篇寫獲取手機剩余存儲空間的插件!
傳送門:https://gitee.com/wuzhang/UnityCallClipboard.git

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM