1, 在unity的菜单栏中,Edit->preferences->External Tools->Android SDK Location中设置sdk的路径(类似adt-bundle-windows-x86的路径)
第二步
1, 在unity的菜单栏中,File->Build Settings中,Add Current添加要打包发布的unity关卡
2, 在Platform中点击Switch Platform选取Android那一栏
3, 点击Player Settings,点击anroid图标的那一列,修改Other Settings中的Minimum API Level为你手机的安卓版本(不能高于手机的安卓版本)1可能你的虚拟机是低版本安卓系统的,但你生成的是高版本的 2用户设置里一定要把产品名(product name)改成其他默认的就出错 3安卓设置android setting里mininum api level 选最低api吧(android 201),这样任何虚拟机都可以用 我用过android 22的虚拟机在u3d 35没问题确保你的Unity是用官方的下载器安装的,就是 DownloadAssistant 那个exe文件,否则就得自己装安卓的build support。
确保在Unity首选项里设置了安卓的SDK地址,当然,配置安卓SDK需要X墙,毕竟谷歌家的。
build setting里选安卓,点build就完事。1Android端代码可以在Eclipse中开发(AndroidStudio没有试,应该也可以)
2Unity3D端代码要在Unity中开发
3Android和Unity3D端,两边都需要加入一些代码从而可以使之关联交互。
4将Android端代码编译成jar文件以插件形式放入到Unity端中
5在Unity中将整个项目Build成apk文件,然后安装到手机或模拟器里运行
本文主要讲解1,2,3。对于4,5建议大家去看雨松MOMO的Unity博客的第17篇和第18篇。
UnityPlay:
在编写Android端和Unity3d端代码前,有必要先了解一下可以使两部分交互的类UnityPlay。
个人理解UnityPlay是个Unity提供给外部交互的一个接口类。
为什么是“个人理解”?这我不得不爆粗口了,TMD官网根本就没有相关的API和文档(如果大家有谁找到一定给我来一份,就当我骂自己了)。
在关联Android时,想拿到UnityPlay以及相关类的jar包可以从下面的地址找到:Unity安装路径\Editor\Data\PlaybackEngines\androidplayer\bin在bin文件夹下有一个classesjar的jar文件,它就是我们想要的。
而在bin同目录下有一个src文件,点击到最后有3个类,分别是UnityPlayerActivityjava,UnityPlayerProxyActivityjava,UnityPlayerNativeActivityjava。前两个打开个后只有一行代码,说的是UnityPlayerActivity和UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity。而打开UnityPlayerNativeActivity中居然有代码,而且我估计这应该是UnityPlayerNativeActivity的源码。
由于关于UnityPlay的资料我只找到这么一个,所以我把UnityPlayerNativeActivity中的代码都贴出来,如果我注解有不对的地方希望大家指正。
/
UnityPlayerActivity,UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity
而UnityPlayerNativeActivity继承自NativeActivity
在该类里定义了一些和ANDROID生命周期相同的回调方法,留给自定义的Activity子类重写。
/
public class UnityPlayerNativeActivity extends NativeActivity
{
//UnityPlayer的引用,并且我们不能改变这个引用变量的名字,它被native code所引用
protected UnityPlayer mUnityPlayer;
protected void onCreate (Bundle savedInstanceState)
{
requestWindowFeature(WindowFEATURE_NO_TITLE);
superonCreate(savedInstanceState);
// 设置显示窗口参数
getWindow()takeSurface(null);
setTheme(androidRstyleTheme_NoTitleBar_Fullscreen);
getWindow()setFormat(PixelFormatRGB_565);
// 创建一个UnityPlayer对象,并赋值给全局的引用变量
mUnityPlayer = new UnityPlayer(this);
//为UnityPlayer设置一些参数
if (mUnityPlayergetSettings ()getBoolean ("hide_status_bar", true))
getWindow ()setFlags (WindowManagerLayoutParamsFLAG_FULLSCREEN,
WindowManagerLayoutParamsFLAG_FULLSCREEN);
int glesMode = mUnityPlayergetSettings()getInt("gles_mode", 1);
boolean trueColor8888 = false;
// UnityPlayerinit()方法需要在将view附加到layout之前调用。它将会调用native code
mUnityPlayerinit(glesMode, trueColor8888);
// 从UnityPlayer中获取到Unity的View视图
View playerView = mUnityPlayergetView();
// 将Unity视图加载到根视图上
setContentView(playerView);
// 使Unity视图获取焦点
playerViewrequestFocus();
}
protected void onDestroy ()
{
// 当Activity结束的时候调用UnityPlayerquit()方法,它会卸载之前调用的native code
mUnityPlayerquit();
superonDestroy();
}
// 下面几个方法都是ANDROID相关回调方法,确保在ANDROID执行相应方法时UnityPlayer也需调用相应方法
protected void onPause()
{
superonPause();
mUnityPlayerpause();
}
protected void onResume()
{
superonResume();
mUnityPlayerresume();
}
public void onConfigurationChanged(Configuration newConfig)
{
superonConfigurationChanged(newConfig);
mUnityPlayerconfigurationChanged(newConfig);
}
public void onWindowFocusChanged(boolean hasFocus)
{
superonWindowFocusChanged(hasFocus);
mUnityPlayerwindowFocusChanged(hasFocus);
}
public boolean dispatchKeyEvent(KeyEvent event)
{
if (eventgetAction() == KeyEventACTION_MULTIPLE)
return mUnityPlayeronKeyMultiple(eventgetKeyCode(), eventgetRepeatCount(), event);
return superdispatchKeyEvent(event);
}
}1首先呢。就是必要的一些软件工具了。 不用说unity3d这个是必要的(觉得这是不是废话)。然后就是。我们的一些运行的环境了。 Java(jdk) Android模拟器(sdk)[当然你有真机也可以]。这些你可以从网上下载。
在这里我给大家提供一个 Android模拟器(sdk)的下载地址 Java(jdk)就不提供了吧。度娘一下就出来了。Unity3d
就更不用说了吧(诶。还是有点废话)。呵呵。
2 安装
一.Java的安装。
这个非常简单。打开你下载好的选择个路径安装就可以了。
在个就是环境配置。右击我的电脑-属性-高级-环境变量-新建三个路径(变量名有的话直接在上面 *** 作就可以了)。
1变量名JAVA_HOME
变量值C:\Program Files\Java\jdk170_03 (这个可能没有你必须新建。
注意:C:\Program Files\Java\jdk170_03这是我的。你的可能是D:\,,E:\)
这是我的java路径
2变量名CLASSPATH
变量值
;%JAVA_HOME%\lib\toolsjar;%JAVA_HOME%\lib\dtjar;%JAVA_HOME%\bin;C:\Program
Files\Java\jdk170_03\jre\lib\ext\QTJavazip
3变量名Path 变量值C:\Program Files\Java\jdk170_03\bin( 这个可能先前已经有了。这段路径你放在前后都无所谓。如果你放在后面C:\前面要有个分号隔开。如果有了就不用了。)
注意。这上面都是我个人的。你要清楚你的java安装路径。
二.Android模拟器(sdk)的安装。
这个非常简单。你下载下来后。直接解压就可以了。解压以后就是这样的。
别忘了。这个也需要 环境设置。将你的模拟器platform-tools文件夹路径添加到上面讲的Path
变量值下。我的是G:\adt-bundle-windows-x86\platform-tools
可以点击sdk Managerexe
里面已经有我下载安装好的Android版本,233 30 31(所以你下载的才那么大600多M)。
如果你需要更高的版本。可以运行更新你想要的更多版本。
好。这个就先放这。让后点击AVD Managerexe
运行以后。出现这个界面。
划红线的是我已经新建好的不同的Android版本。别担心。一会你的也会有的。
你要做的是。点击右边的new按钮。
出现下面的界面。
填写好你的AVDname 这个可以任意。
再选择Device。这是设置屏幕大小的。你可以选择一个都可以。
在个就是。Target 点击下拉箭头。看到没有。;里面的内容就是你安装的各个Android版本。你可以选择自己需要的。
最后别忘了。SD Card选择大小。好了。点击OK。再ok
看到没有。你的AVD界面。是不是已经有了一个Android版本了?你可以多建几个版本。
选择一个Android版本。点击右下角的Start接着继续点击Launch。等一会。
真机(虚拟机)就出来了。大功告成。哈哈哈哈。
好吧。现在环境已经配置完成了
3发布apk
打开你的unity3d 至于你要发布什么。做的是什么。我们在这里就不说了吧。我们现在只讨论发布过程。
假如你应经做好了东西。准备发布。那就开始吧。
首先。设置一下你的模拟器路径。点击菜单栏中的Edit-Preferences
看Android SDK Location这个选项 浏览你的模拟器路径。
我的是
这个设置完成后。我们继续。
点击 File-Build Settings
然后再 点击Add Current 添加你的场景。再 点击Switch platform 确保你的那个unity小图标在Android一行, 再点击Play Settings
要注意的是划红线的部分。如果你原先没设置。第一个红线出你的应该是comCompanyProductname 记住要把Company改成别的。只要不是Company就可以了。不让发布不了。
另外就是第二个划红线处。这是选择你要发布的apk文件的运行环境。也是最低环境。这里我们选择23 每一个unity版本都有一个发布最低版本的限制。我这个已经是最低限制了。
更高的unity版本发布的最低Android系统版本限制也就会越高。
特别要注意的是。你发布的Android版本如果你的模拟器里面没有这个版本的。那就会出现发布错误。还有就是假如说你发布了一个30的版本。你的模拟器里只有一个很高的40的版本。那也是会发布错误的。所以这一点要特别的注意。我原来就只在这里碰壁的。
好了。这个设置完就可以真的发布了。点击Build按钮。就可以发布出apk文件了。
最后教大家一下发布的apk文件怎么安装。
这个就简单了。
把你的apk文件放在D盘的根目录下(你也可以放在别的盘根目录下。因为我的除了C盘只有D盘了。郁闷啊)。
为什么要放在盘的根目录下呢?。这是为了安装方便。下面你就知道了。
然后打开:“命令提示符”
你也可以点击 开始-运行 输入cmd 也可以打开命令提示符。
你打开命令提示附后。 在上面输入 D:回车(这样就是在d根目录下找到你的apk文件。如果你放在更深的文件里。那就很麻烦了。)
然后在输入
adb install xxxapk 回车(xxx是你apk文件的文件名)
你就会看到。 他正在安装。
注意的是。安装以前你的Android虚拟机要运行这。1、首先将Unity创建一个Android工程,例如我的工程名是:01_Unity_Message,如下是Project视图下的目录。
2、新建库模块——Android工程是由模块组成的,每一个模块可以创建一个应用,切换到Android视图下可以看到每一个模块。因为Unity与Android通信主要是调用了各自的方法,因此在Android工程中我们可以单独新建一个模块作为库模块,来负责与Unity的交互内容。
新建模块 *** 作:
点击Finish按钮,然后稍等片刻,就会创建出新的模块,我们作为一个库模块来使用,如下图:
3、将Unity的jar包(classjar)导入到新建的库模块中,首先说明:
首先找到classjar文件,它的路径在Unity的安装路径下,例如我的是在:D:\Program Files (x86)\Unity536\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes,然后会发现只有一个classjar文件。
这里注意两点:
(1)、这个路径是新版的Unity下的路径,以前版本的jar文件是在\Unity536\Editor\Data\PlaybackEngines\AndroidPlayer\Release\下;
(2)、Unity路径下有两个classjar文件的不同路径,一个是在Unity536\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes下,另一个是在D:\Program Files (x86)\Unity536\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes下。Unity中我们使用的是C#脚本,最终运行在Android上是由于Mono进行转换的,所以我们选用的jar文件是第一个路径下的。如果使用的是il2cpp,就要选择第二个路径下的jar文件。
将jar包导入库模块的 *** 作如下:
4、因为新建的库模块中没有MainActivityjava,我们可以理解为启动这个模块的java类,例如在初始的app模块中就有一个MainActivityjava。因此需要新建一个MainActivityjava的文件,并且调用Unity包中的基类,具体 *** 作如下:
点击Finish后,会在库模块的中创建出一个MainActivity的类
注意:生成MainActivity类后,会在res/layout下生成一个xml文件:main_layoutxml。这个文件是一个布局文件,
因为我们的库模块是为了跟Unity交互的,不需要界面布局,所以为了防止后面发生错误,这里删除掉这个文件
注意:要修改AndroidMainfestxml文件,
然后仿照初始的app模块中的AndroidMainfestxml文件,将里面的<activity></activity>部分复制到库模块的AndroidMainfestxml的相同位置。
然后需要修改一下MainActivity这个脚本
5、下面就是在Android中编写Unity要调用的方法了,例如我这里只写一个简单的两数求和的方法:
6、Build库模块,然后将生成的配置文件导入到Unity工程中, *** 作如下:
然后稍等片刻,编译中
然后在Project视图下,找到编译生成文件的所在目录unity_exchange/build/intermediates/bundles/debug,右键后打开所在文件夹
然后把debug文件夹下的classesjar文件移动到libs文件夹中,并且把libs文件夹中的classjar文件替换掉。然后将debug文件夹下的libs文件夹、res文件夹、AndroidManifestxml文件导入到Unity的Assets/Plugins/Android文件夹下(没有这个文件夹需先创建)。
然后将三个文件移动到Unity的plugins/Android文件夹下。
7、创建Unity的C#脚本,并挂载到MainCanera上。为了在真机测试时能够看到求和的结果,这里我使用的是UGUI的Text来显示结果,同时通过Button的按钮来触发求和方法。如下图。
以下是主要的脚本代码。调用Android中的方法,并将求和结果显示在(Text)界面上
将脚本挂载到MainCamera上
8、Unity编辑器不能运行与Android相关的 *** 作,所以需要导出apk文件到真机上测试。
注意:导出前要修改PlayerSettings相关配置。因为从Android工程中导入了一个AndroidManifest文件,这个文件中有Android工程的相关配置,例如工程名称、工程的包名、最低SDK版本、执行的Activity等等。因此我们要在Unity导出apk前修改一些相关配置,主要修改的是包名
最后是导出apk包到手机上或虚拟机上测试即可。
特别提醒:如果使用Android工程中初始的app模块来与Unity交互,需要修改部分配置。buildgradle文件中,将applicationId删除,然后将apply plugin后面的内容修改为"comandroidlibrary"。
不建议大家使用初始的app模块,而是新建一个专门作为交互的Library模块。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)