在 Android项目中使用Unity 打开3d世界的大门(一)

556 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

在 Android项目中使用Unity 打开3d世界的大门(一)

在Android项目之中 我们大多时候是进行 平面 2d的项目开发 ,但是 如果我们想进行想在Android端开发3d 或者是奇特的2d动画效果,不是不能完成,我们可以借助自定义view 等 方式 。。。。啊 ,自定义 view ,满屏的数学 ,这也太难顶了把 ,此时Unity来了 ,借助Unity我们可以快速的实现一些3d的效果。

本文是站在Android开发为主,Unity开发为辅的基础上,也就是说,我们的大部分工作都会放在 Android Studio中完成

准备阶段

unity 版本 image-20221011160153413

Android studio版本

image-20221011160228008

在UnityHub中为unity 添加 Android 所需 模块

image-20221011160326356

为Unity编写一个简单的场景

创建 一个 Cube 放在 (0,0,0 )的位置 为之创建一个C#脚本Test

供之后测试使用

public class Test : MonoBehaviour
{
   
    void RotateCapsule(string angle)
    {
        transform.Rotate(Vector3.back, float.Parse(angle));
    }
}

导出Android 包

找到Build Setting

image-20221011165756751

  • 在玩家 设置——> 玩家--->其他设置之中把包名修改为我们自己的 格式为 XXX.XXX.XXX
  • 添加已打开的场景
  • 勾选导出项目
  • 找个合适的文件夹导出

在AndroidStudio 中进行修改

导出后有两个module

Launcher 可要可不要

unityLibrary是我们需要的

可以单独导出到UnityLibaray 供其他Android 项目使用

image-20221011170336881

此处为演示方便就在 launcher 模块中直接演示

  • 找到 unityLibrary 模块下的android Manifest 把启动项去掉

image-20221011171244491

  • 在 launcher 模块下创建 一个 主activiy 步骤 如下

image-20221011171352012

image-20221011171442272

记得勾选 Launcher Activity

  • 在主模块中添加如下依赖
dependencies {
 
    implementation project(':unityLibrary')
    implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\libs'), include: ['*.jar'])
}
​
​

否则在无法使用unityLibrary 模块

  • 从Unity 导入的 一些 依赖 使用的 是 support 库 我们可以方便的转化为 android X 以确保统一

image-20221011171748253

  • 在 主模块下指定 application的 主题 (如有可以忽略)

image-20221011171839491

布局 文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.yxl.unitytest2.MainActivity">
​
    <FrameLayout
​
        android:id="@+id/frameLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginBottom="83dp"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
​
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="100dp"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/frameLayout" />
​
​
</androidx.constraintlayout.widget.ConstraintLayout>
  • 使用主activity 继承自 unityPlayerActivity
public class MainActivity extends UnityPlayerActivity {
​
    FrameLayout frameLayout;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        frameLayout=findViewById(R.id.frameLayout);
        button=findViewById(R.id.button);
        View scene=mUnityPlayer.getView();//获取到unity的Scene
        frameLayout.addView(scene);
​
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UnityPlayer.UnitySendMessage("Capsule","RotateCapsule","60");//android 调用unity的方法
            }
        });
​
    }
}

效果如图 image-20221011174334478