zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    理解Fragment生命周期
    嵌入式操作系统内存管理有哪几种,各有何特性
    laravel的auth用户认证的例子
    laravel验证器例子
    laravel加载js和css等资源
    laravel的blade模板的布局嵌套
    laravel的phpstorm插件laravel-ide-helper
    laravel开启调试模式
    laravel的中间件demo
    laravel路由定义
  • 原文地址:https://www.cnblogs.com/wuzhang/p/wuzhang20180826.html
Copyright © 2011-2022 走看看