Unity移动端的复制要这么写示例代码

 更新时间:2018年08月26日 11:00:28   作者:wuzhang  
这篇文章主要给大家介绍了关于Unity移动端的复制的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧

前言

Unity官网提供了详尽的文档和丰富的教学视频,昨天跟着视频做了一个简单的3d游戏“roll-a-ball”。游戏涉及了许多Unity的基本知识,用来入门很不错。

本文主要给大家了关于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";
 }
}

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

/// <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 (本地下载

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 详解iOS集成GoogleMap(定位、搜索)

    详解iOS集成GoogleMap(定位、搜索)

    这篇文章主要介绍了iOS集成GoogleMap(定位、搜索)需要注意的地方,对此有兴趣的读者一起学习下吧。
    2018-02-02
  • iOS实现容器视图控制器的方法

    iOS实现容器视图控制器的方法

    本篇文章给大家详细讲述了iOS实现容器视图控制器的方法,对此感兴趣的朋友可以测试学习下。
    2018-02-02
  • iOS App开发中使用及自定义UITableViewCell的教程

    iOS App开发中使用及自定义UITableViewCell的教程

    这篇文章主要介绍了iOS App开发中使用及自定义UITableViewCell的教程,自定义TableViewCell文中使用Objective-C演示而非ib,需要的朋友可以参考下
    2016-04-04
  • iOS自动移除KVO观察者的实现方法

    iOS自动移除KVO观察者的实现方法

    在 Apple 的应用开发里 KVO 提供了一个途径,使对象(观察者)能够观察其他对象(被观察者)的属性,当被观察者的属性发生变化时,观察者就会被告知该变化。下面这篇文章主要给大家介绍了关于iOS如何自动移除KVO观察者的实现方法,需要的朋友可以参考下。
    2017-12-12
  • iOS中修改UISearchBar圆角的小技巧分享

    iOS中修改UISearchBar圆角的小技巧分享

    UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle、text、placeholder等等。下面这篇文章主要给大家分享了iOS中修改UISearchBar圆角的小技巧,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-05-05
  • 详解iOS 多线程 锁 互斥 同步

    详解iOS 多线程 锁 互斥 同步

    在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题,本篇文章主要介绍了5中方法来解决问题,有兴趣的可以了解一下。
    2016-12-12
  • IOS开发中NSURL的基本操作及用法详解

    IOS开发中NSURL的基本操作及用法详解

    NSURL其实就是我们在浏览器上看到的网站地址,这不就是一个字符串么,为什么还要在写一个NSURL呢,主要是因为网站地址的字符串都比较复杂,包括很多请求参数,这样在请求过程中需要解析出来每个部门,所以封装一个NSURL,操作很方便
    2015-12-12
  • iOS开发之级联界面(推荐界面)搭建原理

    iOS开发之级联界面(推荐界面)搭建原理

    这篇文章主要为大家详细介绍了iOS级联界面(推荐界面)搭建原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • iOS移动端软键盘弹起空白和滚动穿透问题解决方案

    iOS移动端软键盘弹起空白和滚动穿透问题解决方案

    这篇文章主要为大家介绍了iOS移动端软键盘弹起空白和滚动穿透问题解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • iOS贝塞尔曲线画哆啦A梦的代码实例

    iOS贝塞尔曲线画哆啦A梦的代码实例

    本篇文章主要介绍了iOS贝塞尔曲线画哆啦A梦的代码实例,这里整理了详细的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-07-07

最新评论