本教程非常适合萌新,有大量的截图一步一步教下去。
网上有很多接入sdk的教程,但是有些时间过得久了,版本更新了,新手在跟着做的过程中可能会踩到很多坑。废话不多说,下面详细说一下该注意的事情。
目前unity对jdk9的貌似不怎么兼容,这里采用jdk8(我这里用jdk-8u152-windows-x64), Android Studio用3.0.1版本(我这里用android-studio-ide-171.4443003-windows)。Unity使用2017.3.0版本,版本需要申请签名的,2017.3.0版本则不需要。如使用的是之前的版本,请申请下秘钥库用于签名。
Jdk安装:
1. 安装JDK与JRE,目录随意,不是同一个且记住就行。在Unity里设置正确即可
2. 安装完成后,点击计算机,右键,属性,高级系统选项,环境变量,系统变量,新建,JAVA_HOME变量,变量值选择或填写上面的JDK的安装目录。
3. 系统变量,找到Path变量(已经存在的),编辑,这里需要注意一下:原Path变量最后若已经有分号则不用加,否则先加一个分号再输入。在变量值最后输入JDK安装目录下的bin目录(可以直接输入也可以写成%JAVA_HOME%\bin)与JRE安装目录下的bin目录,最后以分号结束。
4. 系统变量,新建,CLASSPATH变量,变量值填写以下内容
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
5. 运行cmd 输入 java -version与javac -version,java或javac和 -version 之间有空格
若显示版本信息 则说明安装和配置成功
SDK安装:
这个随意,记住安装路径即可,这里最好不要安装到C盘,后续项目大的话可能空间不够用。
优化下SDK的配置
1.点击这里的Configure-SDK Manager
2.把Android API27下的√都去掉,勾选下面Android 8.0(Oreo)下的3项(因为我已经配置好了,Android API27下的√这里就没有显示了),这里要等的时间比较久,请耐心等待完成配置。
3.这里的SDK Tools只选26.0.2,然后一路安装下去
配置好后开始创建安卓项目。
Package name 会收到Company domain的影响,下一步
这里API不能低于16,我这里选16,下一步
选Empty Activity,下一步
点Finish,耐心等待加载完成。
上面的步骤完成后我们看到的是这种界面:
接下来创建一个Module,步骤File-New-New Module:
这里选择Android Library,下一步
这里名称无所谓,自己可以随意写。需要注意的是下面的API不能低于16,Finish
完成后是这样的格式:
接下来我们先回到Project
找到unityandroidlibrary(这个名称是自己创建Module是自已定义的)下的libs
把unity安装目录里的class.jar例:我unity2017.3.0的安装目录是
D:\unity2017.3\anzhuang\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
把这个classes.jar复制到上面图里的libs里,点OK
然后右键这个class.jar,选Add As Library,点OK。
成功的话能看到这里是可以展开的。
接下来回到安卓,找到Java下的com.zmf.feiying.unityandroidlibrary(这种名称取决于你之前创建时的名称),右键,New-Activity-Empty Activity
这里把这个Launcher Activity勾选上,一会需要用到的,Finish等待加载完成
在开发过程中,必须将应用程序中出现的组件一一在 AndroidManifest.xml文件中申明,最终这个AndroidManifest.xml文件也会被一起打包到.apk文件中去。
这里我们给unity使用,该怎么写呢?这个时候上面的Empty Activity勾选的Launcher Activity的作用就体验出来了。打开app-manifests下的AndroidManifest.xml文件
把这里的application里的代码复制到自己工程里的AndroidManifest.xml,我们可以看到这里是报错的
这里把报错的全部删掉(也不一定要删,例如icon报错,这里的缺失一些文件导致的,这个是影响打包后的图片,添加上后也不会报错,这里不做这种功能,直接删掉)。还需要在intemt-filter下加上这句代码:<meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
最后得到这样的图
接下来回到我们之前创建的MainActivity里,把setContentView(R.layout.activity_main2);删掉
这里可以写unity需要调用的一些方法,因为需要和unity交互,这里需要继承UnityPlayerActivity(如果之前没有把unity安装目录下的class.jar包导入到libs里,或者导入错误什么的,这里的继承可能就会出错)
我这里只写一个简单的加法运算,到时unity会调用这里的方法
另外res-layout下的这个xml文件也删掉,右键-delect-OK。
接下来把这些配置文件什么的等等弄到Project里去。选择这个Library,上面的Build,Make Module.......
(这里可先不修改AndroidManifest.xml的信息)
Build完成后这些文件什么的到哪里去了呢?回到Project项目里,接下来我们需要对这些文件进行操作
1. 把libs里的classes.jar删掉(5.x以上的版本不把之前的classes删掉会报错的,因为有两个相同的包),然后把外面的classes.jar拉到libs里,到时libs文件夹和res文件夹以及manifests下的full-debug下的AndroidManifest.xml是需要放到unity里的。
这里我为了演示先把他们他们拉到桌面上(我已经把之前存在的classes.jar删掉了再把外面的包拉进libs文件夹里了)
接下来需要对这个AndroidManifest.xml进行处理,我这里用notepad++把打开,得到是这个样子(我这个是build-Make Module.......没有处理的,先前处理的话也是一样的)
里面的package 的名称就是unity打包时的Package Name,这个必须一致的(另外不能写大写),不然会报错。
下面的android:label(默认不修改貌似也会报错)是打包后的程序名,优先级是比unity里的Product Name高级的(也就是说这里你写了名字,Unity里怎么写都是这个),我做了修改后如下
好了,接下来把桌面上的3个文件拖到unity下的Plugins/Android里。
接下来我们来写一下简单的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
private Text text;
private AndroidJavaClass aj;
private AndroidJavaObject ao;
void Start()
{
text = GetComponent<Text>();
aj = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
//获取com.unity3d.player下的这个UnityPlayer类
ao = aj.GetStatic<AndroidJavaObject>("currentActivity");
//取得对象,这两句是固定写法,不理解也无所谓
text.text = ao.Call<int>("add", 10, 20).ToString();
//加法有返回值,AndroidJavaObject.Call可以调用有参数和无参数的方法,静态方法之类的,有返回值后面的是参数的类型
}
}
把这个脚本挂到ugui一个Text组件上,进行打包,注意一下这里的Package Name要和AndroidManifest.xml下的package一致。Unity里的这个Product Name我随意写的,一会用于验证
真机运行测试,得到我们想要的结果(不会真机测试或者没有安卓手机的同学们,可以在Android Studio里选tools-Android-AVD Manager进行创建)
由此可见AndroidManifest.xml的android:label的优先级确实是高于unity里的项目名
这次是第一次发博客,Unity接入sdk就是这么简单,如有错误请提出。谢谢大家!!!