在 Unity 中使用 Android SDK

如果你想知道什么是爱、我们从哪里来、生命的意义、宇宙的起源,那么请不要看这篇文章。

这只是一篇无聊的文章,除非你是一只正在被折磨的猿猴,否则请跳过。

将 Java 代码做成 Unity 插件

下载 Android sdk、在 Unity 中配置好路径,保证 Unity 可以正常导出 apk;下载 JDK 、配置好环境变量,保证 Eclipse 可以正常打开。另外你需要知道使用Eclipse的logcat查看调试log。

1.打开 Eclipse,建立一个 Android 空项目,注意 package name 一栏,这里写的名称会添加到项目 manifest 中,仅影响 gen 中自动生成的代码所在的包,由于 Android 项目仅作为插件项目,最好与自己代码包名、应用包名区别开。设置好最低sdk、目标sdk版本,点击Next。

2.取消图标、Activity,标记为 library 项目,创建项目目录,点击 finish。

3.再继续之前,先解释一下Android项目的结构:

src:源代码目录,java代码是按照包名划分目录的,根目录就是src;

gen:自动生成代码的目录,比如 R.java 文件(这个class为每个资源定义一个唯一id);

assets:一个可以存放任何其他资源的目录;

bin:生成的二进制文件目录;

libs:存放引用的其他包文件;

res:项目标准资源目录,图标啦、字符串啦等等;

AndroidManifest.xml:配置清单。

好了只需要了解这些。

4.打开 Unity 安装目录,复制 Editor\Data\PlaybackEngines\androidplayer\release\bin\classes.jar 到 Android 项目的 libs 里面,这个 jar 包仅用于辅助 Eclipse 代码检查和提示,不用于最后导出.

5.开始码起来。右键src,创建 java 类 UnityPluginTest.java。点击finish。

6.写点有用的东西。比如显示一个 Android UI 风格的小提示的功能。

package unityplugin;

import android.widget.Toast;
import com.unity3d.player.UnityPlayer;

public class UnityPluginTest
{
    public static void ShowToast(final String content, final boolean isLong)
    {
        UnityPlayer.currentActivity.runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                Toast.makeText(UnityPlayer.currentActivity, content, isLong ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT).show();
            }
        });
    }
}

注意你的项目不应该含有任何错误,否则请检查 classes.jar 是否成功的被引用了。

关于这段代码,有必要做一下解释。首先这个方法是 static 类型的。接下来我们几乎把所有需要与 Unity 交互的代码都会写成静态的。不为什么,就是任性。然后注意在这个方法里面我们调用了 UnityPlayer.currentActivity.runOnUiThread 方法,参数是一个 Runnable 对象。很多与Android UI 相关的代码都必须写在 UI 线程里,这与 windows 的消息队列类似,事情必须一件一件来做才不会乱掉。最后你还需要了解函数参数的关键字 final,它可以让这个参数穿越时空——哦不,是穿越到 Runnable 的 run 里面(如果你知道C#的 delegate 可以引用外部变量应该会感到熟悉,只是这里需要显示的标记为 final)。

7.打开 Unity,创建一个新的空 Unity 项目,切换目标平台为Android。创建如图所示的目录结构。

8.切换到 Eclipse,右键项目菜单,选择 “Export...”,导出类型选择jar file,点击next,导出内容仅选择bin/classes目录。导出路径选择刚才的unity项目里的libs目录。其他选项看图。然后点击finish。

9.至此Eclipse上的任务完成了。切换到 Unity,在 AndroidScripts 目录添加脚本 AndroidBehaviour.cs, 代码如下:

    public abstract class AndroidBehaviour<T> : MonoBehaviour where T : AndroidBehaviour<T>
    {
        protected abstract string javaClassName { get; }

        private static T _instance;
        protected static T instance { get { return _instance; } }

        protected AndroidBehaviour() { _instance = this as T; }

        protected void CallStatic(string methodName, params object[] args)
        {
            using (AndroidJavaClass ajc = new AndroidJavaClass(javaClassName))
            {
                ajc.CallStatic(methodName, args);
            }
        }

        protected ReturnType CallStatic<ReturnType>(string methodName, params object[] args)
        {
            using (AndroidJavaClass ajc = new AndroidJavaClass(javaClassName))
            {
                return ajc.CallStatic<ReturnType>(methodName, args);
            }
        }

        protected ReturnType GetStatic<ReturnType>(string fieldName)
        {
            using (AndroidJavaClass ajc = new AndroidJavaClass(javaClassName))
            {
                return ajc.GetStatic<ReturnType>(fieldName);
            }
        }
    }

我们以后就使用这个类来与 Java 代码交互了,可以调用 java 类中的静态方法。现在知道为什么 java 类里的方法要写成静态的吗?不为什么,还是任性。注意这个类是抽象的,必须继承它;并且有一个泛型的 instance 保存唯一实例。不要管那么多,继续。
10. AndroidScripts 目录添加脚本 UnityPluginTest.cs, 代码如下:

    public class UnityPluginTest : AndroidBehaviour<UnityPluginTest>
    {
        protected override string javaClassName
        {
            get { return "unityplugin.UnityPluginTest"; }
        }

        public static void ShowToast(string message, bool isLong)
        {
            instance.CallStatic("ShowToast", message, isLong);
        }
    }

这个是继承AndroidBehaviour的,并且需要实现 javaClassName,注意这个返回值是包名+类名,包名是啥?看上面java代码开头写的包。然后我们写个静态方法使用CallStatic调用java代码里的 ShowToast。注意CallStatic的参数,第一个是静态方法的字符串名称,后面的参数与对应的java方法参数个数、类型保持一致。这里的参数类型仅支持int,float,bool,string等简单类型。
11.好了,插件写完了。接下来写个测试代码看看。

    public class Test : MonoBehaviour
    {
        void Update()
        {
            if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
            {
                UnityPluginTest.ShowToast("拿开你的臭手!", false);
            }
        }
    }

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

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

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

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

请确保自己已经完全理解了第一部分的内容再继续。

篇幅太长,先就这样发了。待更。。。

如果你觉得我的文章有价值,点个“推荐”、加个“关注”什么的我也不会介意的......

【白猫,博客园首页:http://www.cnblogs.com/whitecat/

时间: 2024-10-05 10:41:18

在 Unity 中使用 Android SDK的相关文章

3D语音天气球——在Unity中使用Android语音服务

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3D语音天气球(源码分享)--创建可旋转的3D球 二:通过天气服务,从网络获取时实天气信息并动态生成"3D球":3D语音天气球(源码分享)--通过天气服务动态创建3D球 三:Android语音服务和Unity的消息传递 四:Unity3D端和Android端的结合 前两篇文章已经介绍了如何创

Unity中加入Android项目的Build步骤

简介: 有的项目需要在Android中加入Unity功能,例如ANDROID应用中嵌入Unity3D视图(展示3D模型) 有的项目需要在Unity中加入Android功能,例如3D语音天气球(源码分享)——创建可旋转的3D球 由于Android中的功能和代码只能当作一个Unity插件,需要在Unity进行最终的Build后生成apk文件运行. 所以无论上面两种情况都涉及了在Unity中加入Android项目的Build步骤: 步骤: 1.确保Android工程代码正确,然后在Eclipse中bu

针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码。

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本章我们的目标是使用Unity的脚本打开Activity.首先我们创建一个普通的Android

Eclipse中提高Android SDK Manager下载速度方法

在Windows-System32-drivers-ect目录下找到hosts文件 打开hosts文件(用记事本打开就可以),在文件以下填上一下内容: 203.208.46.146 www.google.com 74.125.113.121 developer.android.com 203.208.46.146 dl.google.com 203.208.46.146 dl-ssl.google.com 点击Android SDK Manager的tools菜单,选择Option选项, 将An

Titanium系列--安装Titanium Studio 中的Android SDK,JDK以及环境变量的配置(二)

Ubuntu安装配置JDK 1.先去 Oracle下载Linux下的JDK压缩包,我下载的是jdk-8u25-linux-x64.tar.gz文件,下好后直接解压 Step1:# 将解压好的jdk1.8.0_25文件夹用最高权限复制到/usr/lib/jvm目录里sudo cp -r ~/jdk1.8.0_25/ /usr/lib/jvm/ Step2:# 配置环境变量sudo gedit ~/.profile在末尾加上:export JAVA_HOME=/usr/lib/jvm/jdk1.8.

2018年Unity结合Android SDK下载安装及配置教程

原文:2018年Unity结合Android SDK下载安装及配置教程 首先声明: Unity版本2017.1f3 ? ? ? ?最近试着在Unity中利用网易做AR开发时,发布项目文件需要发布到Android平台,遇到一些问题,看了网上的一些资料,踩了一些坑,现在总结出来,希望有相同的开发者遇到时可以规避. 第一步.安装JDK: 第二步.安装Eclipse: 第三步.下载并安装AndroidSDK: 第四步.在Unity中发布到Android平台. 安装JDK 官网:http://www.Or

unity配置Android SDK,并构建导出apk格式

1.点击 Edit  -->   preferences出现如图界面 2.在Android中SDK选项中放入Android SDK:JDK选项中放入Java JDK.(下载地址:http://tools.android-studio.org/index.php/sdk) 3.点击关闭,unity中的Android就配置好了. 4.编写好程序构建导出apk格式:File -->Build Settings出现如下界面, 5.点击4的红圈处,出现如图属性,将上方名称对应填到下方packageNam

Eclipse中Android SDK Manager无法下载的解决办法

在网上参考了好多在eclipse中下载android sdk相关配置的方法,但基本都不能完全符合,遂将我的配置分享出来: (1)找到以下目录:C:\Windows\System32\drivers\etc\,用记事本打开hosts文件,如下图: 插入红框中的内容,如下, 127.0.0.1       localhost ::1             localhost (2)在Eclipse菜单的Window选项中打开Android SDK Manager,如下图: 可以看到图中左上角菜单中

Unity3d Android SDK接入解析(四)通用的Android SDK接入中间件

一.前言 接入Android SDK正式告一段落,在这段时间里面,依次接入了华为.应用宝.小米.360等等大大小小十来个SDK,也算对Unity接入渠道SDK有了较为全面的理解,对各个渠道的坑也算深有体会....在接入过程中时间比较紧张,没办法抽空来进行总结深思.今天正好有空,便对之前的接入SDK的代码进行了一次重构,写了一个比较通用的Unity接入Android SDK的中间件,前人栽树,后人乘凉. 进入正题 如果有对一些只是有疑问的,可以看看我之前的三篇文章: 传送门: Unity3d An