前言
Unity官网提供了详尽的文档和丰富的教学视频,昨天跟着视频做了一个简单的3d游戏“roll-a-ball”。游戏涉及了许多Unity的基本知识,用来入门很不错。
本文主要给大家了关于Unity移动端的复制的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
游戏上线很久了,有些玩家慢慢就流失了,为了让刚流失的玩家再度回归所以做了召回功能!如果一个200级的玩家10天没上线且成功召回的,就会给予召回玩家丰厚的奖励!
Q:那如何召回这个流失的玩家呢?
A:召回肯定得有类似召回码的东东啊,是的。服务器根据玩家ID生成一定位数的字母和数字组合,发给客户端,客户端召回界面显示召回码
Q:不可能让玩家一个一个在聊天框输入吧?玩家肯定会骂:“什么傻逼设计,老子不玩了,,,”
A:玩家是大爷,所以做复制召回吗功能还是很有必要的!
那么如何实现这个功能呢?Unity不支持复制吗?是的,Unity是支持,仅仅支持PC端的,就是这玩意TextEditor!
1
2
3
4
|
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包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
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" ; } } |
安卓中如何调用这段代码呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/// <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类,
1
2
3
4
5
6
7
|
@ interface Clipboard : NSObject extern "C" { /* compare the namelist with system processes */ void _copyTextToClipboard( const char *textList); } @end |
接下来是Clipboard.mm文件,切记千万不要忘记引用 #import "Clipboard.h"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#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声明的函数即可:
1
2
3
|
//调用clipboard.h中的接口 _copyTextToClipboard (input); Debug.LogError ( "CopyToClipboard_______" +input); |
就这么调用就OK了,是不是很失望!这个是所有平台的调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.cnblogs.com/wuzhang/p/wuzhang20180826.html