游戏上线很久了,有些玩家慢慢就流失了,为了让刚流失的玩家再度回归所以做了召回功能!如果一个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();
return item.getText().toString();
}
return "null";
} }

安卓中如何调用这段代码呢?

 /// <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

Unity 移动端的复制这么写的更多相关文章

  1. 移动端无法复制:使用clipboard.js碰到的一个小问题

    移动端无法复制:使用clipboard.js碰到的一个小问题   直接看下面的代码:在移动端访问,点击,能正常复制. <html> <head> <meta http-e ...

  2. php求和为s的两个数字(多复制上面写的代码,有利于检查错误)(由浅入深,先写简单算法,做题的话够用就行)

    php求和为s的两个数字(多复制上面写的代码,有利于检查错误)(由浅入深,先写简单算法,做题的话够用就行) 一.总结 1.多复制上面写的代码,有利于检查错误 2.一层循环就解决了,前后两个指针,和大了 ...

  3. clipboard.js一个可以在移动端一键复制的插件

    网址:https://clipboardjs.com/ 使用方法: 1.引入js <script src="dist/clipboard.min.js"></sc ...

  4. Unity PC端发布失败解决办法

    Unity的PC端有时候发布的时候报错.原因可能是你的游戏里面使用了NGUI的label,而且字体选择的是unity自带的字体.因为支持中文.在选择unity自带的字体时最好都选一样的字体.如果一个l ...

  5. [Unity移动端]Touch类

    Touch类的信息只能在移动端(触摸屏)上能够获取,在编辑器上是不能获取到的.因此,为了方便测试,可以打包apk后在模拟器上跑: unity打包apk:https://www.jianshu.com/ ...

  6. 【PC桌面软件的末日,手机移动端App称王】写在windows11支持安卓,macOS支持ios,龙芯支持x86和arm指令翻译

    面对这场突如其来的变革,作为软件开发者,应该如何选择自己今后的发展方向?桌面软件开发领域还有前景吗? 起源 自从苹果发布m1处理器,让自家Mac支持IOS移动端app运行之后,彻底打破了移动端app和 ...

  7. 移动端接口:java写get方式访问数据(springmvc+spring。。。)

    很多时候,一个问题想明白,找对点了再去问,这样被问的人也知道怎么给你讲,你也听的明白. 就比如做移动端接口,上去就问 怎么弄接口呀,其实是没找到主要的点上,所以不知道怎么弄,那个点就是手机接口是干嘛的 ...

  8. Unity 移动端触摸屏操作

    Unity 触屏操作 当将Unity游戏运行到IOS或Android设备上时,桌面系统的鼠标左键可以自动变为手机屏幕上的触屏操作,但如多点触屏等操作却是无法利用鼠标操作进行的.Unity的Input类 ...

  9. Unity服务端链接MySQL数据库

    链接数据库,可以分为以下几个流程: 链接MySQL(数据库地址.端口.用户名.密码) 选择数据库 执行sql语句 关闭数据库 转换为代码如下: using System; using MySql.Da ...

随机推荐

  1. 【转】32位和64位系统区别及int字节数

    http://blog.csdn.net/zhongzhiwei/article/details/8678885 一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持 ...

  2. centos7 編譯 chmsee

    安装libchm及相关的devel包,安装 xulrunner 及 devel 包!否则后面make的时候会出错! 到解压出来的chmsee/src目录下,找到与你系统对应的Makefile文件,我选 ...

  3. ORACLE 新增记录 & 更新记录

    开发中偶尔需要新增一条记录或修改一条记录的几个字段,语法中有微妙的区别. 由于不是经常写,久不写就忘记了,而又要重新查找或调试. 新增记录语法: --新增记录(仿照已有表记录)INSERT INTO ...

  4. c# 封装的7zip压缩 (全源码,不含任何类库)

    1,从soureforge下载sdk(包括汇编,c,c++,c#,java) 下载地址http://nchc.dl.sourceforge.net/project/sevenzip/LZMA%20SD ...

  5. oracle相关链接

    shilei1的个人空间 http://blog.itpub.net/196700/

  6. Linux下crontab内环境变量与Shell环境变量的关系【转】

    crontab,总是不会缺省的从用户profile文件中读取环境变量参数 经常导致在手工执行某个脚本时是成功的,但是到crontab中试图执行时就会报错. 解决办法如下: 方法一:在shell文件中获 ...

  7. mysql 安装 注意点

    选择连接数: next next 选择编码 next next 输入root默认密码 勾上 允许远程连接本机

  8. 用C#写一个多进程监控自动关机工具

    因为据说某server开着就很贵,所以我们跑完测试的job后就要赶紧关机才行,但是测试的job要跑很久,过程中又不需要干什么,所以就得有个守家的,有时候会走很晚.如果有一个自动化关机的工具就好了,当指 ...

  9. Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载

    Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载 2018年5月26日 19:03 阅读 375 评论 7 我本地和服务器的连接一直使用的是 Xshell 5,而在与服务 ...

  10. C语言 · 最大最小值

    算法提高 题目1 最大最小值   时间限制:1.0s   内存限制:1.0GB      问题描述 给定 N 个整数,请你找出这 N 个数中最大的那个和最小的那个. 输入格式 第一行包含一个正整数 N ...