Unity项目嵌入原生Android项目教程

目的

一个android项目中需要用到3D的游戏元素,所以我们打算把一个untiy3d的项目嵌入到android原生项目中,下一篇接unity3d项目嵌入到ios原生项目。
环境配置:
unity2018 (之前测试的unity5.6.x和unity2017也没问题)
android studio3.2

1.unity导出gradle工程

1.准备你们的游戏,或者一个测试的空场景(略)
Unity项目嵌入原生Android项目教程_第1张图片
添加BackToAndroid的按钮,并绑定点击事件(android打开unity后,还可以返回android)

public class UnityToAndroid : MonoBehaviour
{
    public Button backAndroidBtn;
    void Start()
    {
        backAndroidBtn.onClick.AddListener(()=> {
            //退出unity工程,返回android原生
            Application.Quit();
        });
    }
}

2.导出android工程
Unity项目嵌入原生Android项目教程_第2张图片
3.得到安卓项目,大概目录结构
Unity项目嵌入原生Android项目教程_第3张图片

2.创建Android原生项目

1.新建android工程,packageName保证和unity工程一致,其他随便
Unity项目嵌入原生Android项目教程_第4张图片
2.导入Unity工程到android原生项目
选择File->New->Import Module…然后选择unity刚刚导出的gradle工程,导入成功后如下图所示
解释:module是什么意思?
module在AndroidStudio中(一下简称as)代表的类似子工程的意思,一个Project项目可以包含多个module工程,可以向Library类库一样去引用,Eclipse和VS中都有这样的概念,只是叫法不一样。我们现在就是以App为主工程,然后把unity工程当成一个依赖的类库一样去引用。
Unity项目嵌入原生Android项目教程_第5张图片

3.配置android工程

这一步非常重要,因为不做任何处理的话,现在相当于是两个工程在一个项目中。互相之间也没法引用。
1.打开Project Stucture,点击app->Dependencies
2.点击右上角+,然后选择Module Dependencies,添加Unity工程的引用
Unity项目嵌入原生Android项目教程_第6张图片
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。
Unity项目嵌入原生Android项目教程_第7张图片
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"

如下图所示
Unity项目嵌入原生Android项目教程_第8张图片
大功告成!!!
此时Sync一下,就没有错误了,并且会发现unity工程的图标变了,现在它已经是一个Library了
Unity项目嵌入原生Android项目教程_第9张图片

4.android中吊起unity的Activity

刚才我们新建的android主工程,会有一个MainActivity的类和activity_main的layout,
接下来给MainActicity添加一个按钮,拖拽即可
Unity项目嵌入原生Android项目教程_第10张图片

然后修改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);
            }
        });
    }
}

5.最后运行

真机运行,效果如下
Unity项目嵌入原生Android项目教程_第11张图片
希望这篇文章能够对你有所帮助。

补充

1.3D人物模型在android项目有肩部衣服穿面,耸肩 的现象。
解决方案:
unity的Edit->Project Setting->Quality设置中,android平台的quality levels选择太低,改为medium或者high,问题解决。
Unity项目嵌入原生Android项目教程_第12张图片
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文件加上这段代码,问题解决。

你可能感兴趣的:(Unity)