当前位置:首页 » 安卓系统 » unityandroid文件

unityandroid文件

发布时间: 2024-10-08 11:01:43

‘壹’ unity项目如何导入android项目中成为安卓项目中的一部分

1.Android端代码可以在Eclipse中开发(AndroidStudio没有试,应该也可以)

2.Unity3D端代码要在Unity中开发

3.Android和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文件夹下有一个classes.jar的jar文件,它就是我们想要的。

而在bin同目录下有一个src文件,点击到最后有3个类,分别是UnityPlayerActivity.java,UnityPlayerProxyActivity.java,UnityPlayerNativeActivity.java。前两个打开个后只有一行代码,说的是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(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
// 设置显示窗口参数
getWindow().takeSurface(null);
setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
getWindow().setFormat(PixelFormat.RGB_565);

// 创建一个UnityPlayer对象,并赋值给全局的引用变量
mUnityPlayer = new UnityPlayer(this);
//为UnityPlayer设置一些参数
if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
boolean trueColor8888 = false;
// UnityPlayer.init()方法需要在将view附加到layout之前调用。它将会调用native code
mUnityPlayer.init(glesMode, trueColor8888);

// 从UnityPlayer中获取到Unity的View视图
View playerView = mUnityPlayer.getView();
// 将Unity视图加载到根视图上
setContentView(playerView);
// 使Unity视图获取焦点
playerView.requestFocus();
}
protected void onDestroy ()
{
// 当Activity结束的时候调用UnityPlayer.quit()方法,它会卸载之前调用的native code
mUnityPlayer.quit();
super.onDestroy();
}

// 下面几个方法都是ANDROID相关回调方法,确保在ANDROID执行相应方法时UnityPlayer也需调用相应方法
protected void onPause()
{
super.onPause();
mUnityPlayer.pause();
}
protected void onResume()
{
super.onResume();
mUnityPlayer.resume();
}

public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
mUnityPlayer.configurationChanged(newConfig);
}
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
mUnityPlayer.windowFocusChanged(hasFocus);
}
public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);
return super.dispatchKeyEvent(event);
}
}
看完这个类后就知道了为什么在自定义的Activity中继承了UnityPlayerActivity等类以后,只要重写了onCreate并调用super.onCreate()方法后不需要任何其他的代码就会自动的显示出Unity3D的视图。因为初始化Unity视图的代码都在UnityPlayerNativeActivity父类中实现了。

ANDROID端代码:

在写ANDROID代码的时候,一定要导入Unity3D提供给我们的jar包,jar包的位置我在上面说了。引入jar包加入到buildpath中这些最基本的我就不多说了。

要想和Unity交互,我们就不能继承ANDROID提供给我们的Activity,我们需要继承刚才jar包中引入的Unity提供的Activity类,一共有这么3个:

UnityPlayerActivity,UnityPlayerProxyActivity,UnityPlayerNativeActivity。具体区别不知道,因为没有文档,没有API,没有源码(这里再次鄙视一下)。刚才我们看过UnityPlayerNativeActivity的代码(虽然很短,但我觉得这个就是源码),知道UnityPlayerActivity,UnityPlayerProxyActivity都是它的子类,而且最终父类为NativeActivity。所以我们继承Unity提供的最外层的子类是最好的选择,我这里选择的是UnityPlayerActivity,因为名字最简单,觉得该封装的都应该封装好了。

public class MainActivity extends UnityPlayerActivity {

private Button topButton;
private Button bottomButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 设置test为我们的根布局
setContentView(R.layout.test);

// 通过刚才的源码分析,知道mUnityPlayer为一个全局的引用变量,而且已经在父类中设置好了,所以直接拿来用就可以了
View playerView = mUnityPlayer.getView();
// 将Unity的视图添加到我们为其准备的父容器中
LinearLayout ll = (LinearLayout) findViewById(R.id.unityViewLyaout);
ll.addView(playerView);

// 上面的button设置监听器
topButton = (Button) findViewById(R.id.topButton);
topButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//发送消息给Unity端,该函数第一个参数为接受消息的类对象,第二个该类对象用接受消息的方法,第三个参数为传递的消息
//所以下面的意思就为:调用Main Camera下面的Previous方法,传送的消息为空
UnityPlayer.UnitySendMessage("Main Camera","Previous","");
}
});

// 为下面的button设置监听器
bottomButton = (Button) findViewById(R.id.bottomBtn);
bottomButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//调用Main Camera下面的Next方法,传送的消息为空
UnityPlayer.UnitySendMessage("Main Camera","Next","");
}
});
}
}
最后看一下Android端的布局文件,布局很简单,上下各有一个button按钮,两个按钮中间是Unity的视图。

‘贰’ unity发布安卓怎么读取本地文件

如果是读Android系统的文件,比如sd卡的,需要另外接入Android层代码,用java去调用Android层的东西,类似做个sdk接入unity,一般就一个jar包就行。
如果你是做热更新,读取自己的东西,可以放在StreamingAssets文件夹下,这样发布完直接可以读,用www类读Application.streamingAssetsPath目录即可,目录前面不需要加file://,要是热更新,读完这些文件放在Application.persistentDataPath,就可以读写了

‘叁’ 修改unity导出到安卓的activity

1、首先将Unity创建一个Android工程,例如我的工程名是:01_Unity_Message,如下是Project视图下的目录。
2、新建库模块——Android工程是由模块组成的,每一个模块可以创建一个应用,切换到Android视图下可以看到每一个模块。因为Unity与Android通信主要是调用了各自的方法,因此在Android工程中我们可以单独新建一个模块作为库模块,来负责与Unity的交互内容。
新建模块操作:
点击Finish按钮,然后稍等片刻,就会创建出新的模块,我们作为一个库模块来使用,如下图:
3、将Unity的jar包(class.jar)导入到新建的库模块中,首先说明:
首先找到class.jar文件,它的路径在Unity的安装路径下,例如我的是在:D:\Program Files (x86)\Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes,然后会发现只有一个class.jar文件。
这里注意两点:
(1)、这个路径是新版的Unity下的路径,以前版本的jar文件是在\Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Release\下;
(2)、Unity路径下有两个class.jar文件的不同路径,一个是在Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes下,另一个是在D:\Program Files (x86)\Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes下。Unity中我们使用的是C#脚本,最终运行在Android上是由于Mono进行转换的,所以我们选用的jar文件是第一个路径下的。如果使用的是il2cpp,就要选择第二个路径下的jar文件。
将jar包导入库模块的操作如下:
4、因为新建的库模块中没有MainActivity.java,我们可以理解为启动这个模块的java类,例如在初始的app模块中就有一个MainActivity.java。因此需要新建一个MainActivity.java的文件,并且调用Unity包中的基类,具体操作如下:
点击Finish后,会在库模块的中创建出一个MainActivity的类
注意:生成MainActivity类后,会在res/layout下生成一个xml文件:main_layout.xml。这个文件是一个布局文件,
因为我们的库模块是为了跟Unity交互的,不需要界面布局,所以为了防止后面发生错误,这里删除掉这个文件
注意:要修改AndroidMainfest.xml文件,
然后仿照初始的app模块中的AndroidMainfest.xml文件,将里面的<activity></activity>部分复制到库模块的AndroidMainfest.xml的相同位置。
然后需要修改一下MainActivity这个脚本
5、下面就是在Android中编写Unity要调用的方法了,例如我这里只写一个简单的两数求和的方法:
6、Build库模块,然后将生成的配置文件导入到Unity工程中,操作如下:
然后稍等片刻,编译中....
然后在Project视图下,找到编译生成文件的所在目录unity_exchange/build/intermediates/bundles/debug,右键后打开所在文件夹
然后把debug文件夹下的classes.jar文件移动到libs文件夹中,并且把libs文件夹中的class.jar文件替换掉。然后将debug文件夹下的libs文件夹、res文件夹、AndroidManifest.xml文件导入到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交互,需要修改部分配置。build.gradle文件中,将applicationId删除,然后将apply plugin后面的内容修改为"com.android.library"。
不建议大家使用初始的app模块,而是新建一个专门作为交互的Library模块。

热点内容
一个顶俩脚本 发布:2024-10-08 14:30:59 浏览:720
javarequest获取 发布:2024-10-08 14:30:05 浏览:218
java服务端socket 发布:2024-10-08 14:19:33 浏览:358
java证书有哪些 发布:2024-10-08 14:13:05 浏览:488
孩子核桃学编程 发布:2024-10-08 14:00:50 浏览:38
备忘录怎么加密码 发布:2024-10-08 13:54:10 浏览:954
安卓开机自启动如何关闭 发布:2024-10-08 13:49:35 浏览:881
想做安卓游戏学什么语言 发布:2024-10-08 13:46:59 浏览:863
rar解压软件免费下载 发布:2024-10-08 13:41:55 浏览:855
我的世界服务器复制物品bug2020 发布:2024-10-08 13:35:28 浏览:391