一个android项目中需要用到3D的游戏元素,所以我们打算把一个untiy3d的项目嵌入到android原生项目中,下一篇接unity3d项目嵌入到ios原生项目。
环境配置:
unity2018 (之前测试的unity5.6.x和unity2017也没问题)
android studio3.2
1.准备你们的游戏,或者一个测试的空场景(略)
添加BackToAndroid的按钮,并绑定点击事件(android打开unity后,还可以返回android)
public class UnityToAndroid : MonoBehaviour
{
public Button backAndroidBtn;
void Start()
{
backAndroidBtn.onClick.AddListener(()=> {
//退出unity工程,返回android原生
Application.Quit();
});
}
}
1.新建android工程,packageName保证和unity工程一致,其他随便
2.导入Unity工程到android原生项目
选择File->New->Import Module…然后选择unity刚刚导出的gradle工程,导入成功后如下图所示
解释:module是什么意思?
module在AndroidStudio中(一下简称as)代表的类似子工程的意思,一个Project项目可以包含多个module工程,可以向Library类库一样去引用,Eclipse和VS中都有这样的概念,只是叫法不一样。我们现在就是以App为主工程,然后把unity工程当成一个依赖的类库一样去引用。
这一步非常重要,因为不做任何处理的话,现在相当于是两个工程在一个项目中。互相之间也没法引用。
1.打开Project Stucture,点击app->Dependencies
2.点击右上角+,然后选择Module Dependencies,添加Unity工程的引用
3.打开并修改unity工程的build.gradle
apply plugin: ‘com.android.application’ 改为 apply plugin: ‘com.android.library’
删除android->defaultConfig->applicationID 'com.xxx.xxx’这一项
如果提示bundle有错误,就删除bundle这一项
如果提示minSdkVersion有问题,根据提示保证主工程和unity工程中的minSdkVersion版本一致,我这里都填写的15。
4.修改unity工程的AndroidManifest.xml文件
删除Intent-filter标签,否则会和主工程冲突
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
5.接下来修改一下App主工程的AndroidManifest.xml文件
application标签中添加tools
tools:replace="android:icon,android:theme,android:allowBackup"
然后再manifest标签添加xmlns:tools的引入
xmlns:tools="http://schemas.android.com/tools"
如下图所示
大功告成!!!
此时Sync一下,就没有错误了,并且会发现unity工程的图标变了,现在它已经是一个Library了
刚才我们新建的android主工程,会有一个MainActivity的类和activity_main的layout,
接下来给MainActicity添加一个按钮,拖拽即可
然后修改MainActivity的代码,添加点击按钮跳转到Unity的操作
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加如下代码
Button button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//弹出提示框,测试用
Toast.makeText(MainActivity.this, "Open Unity", Toast.LENGTH_SHORT).show();
//打开UnityPlayerActivity
Intent intent = new Intent(MainActivity.this,UnityPlayerActivity.class);
startActivity(intent);
}
});
}
}
1.3D人物模型在android项目有肩部衣服穿面,耸肩 的现象。
解决方案:
unity的Edit->Project Setting->Quality设置中,android平台的quality levels选择太低,改为medium或者high,问题解决。
2.3D人物模型在android项目中,有模型错乱的问题,比问题1严重的多,人的脸部,身体等部位,多出顶点错乱,人物面目全非。但是使用unity单独导出工程,人物没有问题,使用as直接导出unity工程也没有问题。唯独,把untiy工程嵌入android原生工程,会出问题。
解决方案:
unity导出工程的gradle工程中默认会有这个配置
aaptOptions {
noCompress '.obj','.xml', '.map', '.target', '.proxy','.skeleton','.yml','.ply','.gob','.bin'
}
这段代码防止untiy模型在android平台压缩过度,在untiy工程build.gradle文件加上这段代码,问题解决。