在 Unity 中使用 Android SDK(二) 联系客服

发布时间 : 星期二 文章在 Unity 中使用 Android SDK(二)更新完毕开始阅读89573a4c5727a5e9856a618b

12.在场景里创建一个空物体AndroidBridge,把UnityPluginTest.cs脚本挂上去。然后把测试脚本挂到任何一个物体上。添加场景到build settings里面。完成playersettings各种设置,公司名、产品名、包名。

13.连接你的手机,大胆的build and run吧。

14.测试通过后,你就可以把插件导出为unitypackage了,仅需要导出Plugins文件夹,这样在以后就可以方便的重用了。

将各种社交、计费、统计 等 SDK 做成 Unity 插件

请确保自己已经完全理解了第一部分的内容再继续。现在,你已经掌握了如何让自己的 java 代码可以在unity中执行了。你已经可以做很多有意思的事情了,比如浏览文件、弹出对话框、调用系统分享......但是你的老板想要的更多。下面我们通过一个实际的例子来看如何把第三方sdk做成unity的插件。再讲例子的过程中我会把各种sdk可能遇到的问题都提出来,这篇文章适用范围几乎是所有的sdk。思来想去,为了感谢小企鹅日复一日为我弹的广告,接下来就拿小米统计做个例子,一方面它比较简单,做例子不会太麻烦,另一方面任何人都可以很方便的做测试。这个我也没用过,我们一起开始吧。

1.下载小米统计 SDK:http://dev.xiaomi.com/doc?page_id=4023,解压后看看里面有什么东西:demo,doc,sdk。打开doc里面的html,看看说了什么东西。

2.创建Eclipse Android项目MiStats(参考第一部分)。复制刚才解压后sdk目录里的jar文件到项目的libs目录。有的其他sdk要求添加src,res,assets 等等,同样复制过来。有的sdk还会以library的形式提供sdk,就是含有一个library项目,然后要求你导入这个项目并引用它。当然不要理它了,直接把这个library项目里所有有价值的东西都复制过来。由

于library项目的包名和你的项目包名可能不同,导致自动生成的R.java包名发生变化,你可以手动修改一下使用这个类的那些类的导入位置,或者到Manifest里把package改成library项目相同的包名,重新生成R.java就好了。如果任何现有源代码发现了乱码,请注意修复项目编码。哎,我在说什么呢?文章来源于【狗刨学习网】

3.根据文档要求配置 Manifest。此sdk仅要求添加几个权限。最后Manifest是这样的:

Manifest中,你最好为sdk要求添加的内容写上注释,因为我们最后并不使用这个Manifest文件,而仅使用sdk要求的内容。某些sdk还会要求添加 Activity,service,meta-data......把他们都复制过来就行了。

4.开码,创建MiStats类。把文档中提到的可能在Unity中使用的东西都包装起来。这里情况比较简单,基本只需要挨个调用现成的方法。此sdk中统计页面功能在游戏中用不了,因为游戏基本就是一个Activity,所以没写了。

package unityplugin;

import android.util.Log;

import com.unity3d.player.UnityPlayer;

import com.xiaomi.mistatistic.sdk.MiStatInterface;

public class MiStats {

// 初始化

public static void Initialize(String appId, String appKey, String channel, int policy, int interval) {

MiStatInterface.initialize(UnityPlayer.currentActivity, appId, appKey, channel); MiStatInterface.setUploadPolicy(policy, (long)interval * 1000);

Log.i(\ }

// 上传(仅开发模式有效) public static void Upload() {

MiStatInterface.triggerUploadManually(); }

// 计数(value = 1)

public static void Count(String category, String key) {

MiStatInterface.recordCountEvent(category, key); }

// 计算

public static void Calculate(String category, String key, int value) {

MiStatInterface.recordCalculateEvent(category, key, value); }

// 设置属性(String类型)

public static void SetProperty(String category, String key, String value) {

MiStatInterface.recordStringPropertyEvent(category, key, value); }

// 设置属性(int类型)

public static void SetProperty(String category, String key, int value) {

MiStatInterface.recordNumericPropertyEvent(category, key, value); } }

有的sdk里,经常会有各种listener、event之类的回调,回调结果必须传递给unity,那么可以使用 UnityPlayer.UnitySendMessage(gameObjectName, method, param) 方法。

5.接下来创建一个Unity项目,用来制作、测试和导出MiStats插件。切换平台为android,创建目录结构如下。

相比于第一部分,多了AndroidManifests 目录。第一部分我们并没有用到manifest,但是由于此sdk需要添加权限,所以必须含有manifest。但是,一个unity项目仅可以含有一个manifest文件,如果多个sdk都要求添加manifest该如何解决?解决办法就是每个sdk都把自己需要的manifest放到这个AndroidManifests 目录里面,只要使用此sdk就将其对应的manifest合并到最终的manifest里面。

6.把eclipse项目里的有用的东西都搬过来。本sdk有用的东西就是MiStats_SDK_Client_1_0_0.jar、AndroidManifest.xml 和 你写的java代码。MiStats_SDK_Client_1_0_0.jar 直接复制到unity项目的libs目录,AndroidManifest.xml改名为 MiStats.xml 复制到 AndroidManifests目录——不要问为什么,一如既往的任性。你写的java代码通过导出jar的方式来使用,参考第一部分。其他sdk可能还有res、assets这些资源,直接复制这些文件夹到unity的Android目录。

7.使用解压软件打开MiStats_SDK_Client_1_0_0.jar,检查是否含有assets目录。如果有的话,复制出来放到Android目录。对所有不是你导出的jar都执行此操作。Unity导出包的时候会丢掉jar中非代码的资源。如果你一目十行没看到这句话,祝你好运!

8.为插件写代码。把第一部分的AndroidBehaviour脚本复制到AndroidScripts,然后创建新脚本MiStats.cs, 代码如下。

public class MiStats : AndroidBehaviour {

public enum UploadPolicy : int { realTime = 0, wifiOnly = 1, batch = 2, whileInitialize = 3, interval = 4, development = 5 }

[SerializeField] string appId; [SerializeField] string appKey; [SerializeField] string channel;

[SerializeField] UploadPolicy policy;

[SerializeField][Range(300, 86400)] int interval = 300;

protected override string javaClassName { get { return \