持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
在 Android项目中使用Unity 打开3d世界的大门(一)
在Android项目之中 我们大多时候是进行 平面 2d的项目开发 ,但是 如果我们想进行想在Android端开发3d 或者是奇特的2d动画效果,不是不能完成,我们可以借助自定义view 等 方式 。。。。啊 ,自定义 view ,满屏的数学 ,这也太难顶了把 ,此时Unity来了 ,借助Unity我们可以快速的实现一些3d的效果。
本文是站在Android开发为主,Unity开发为辅的基础上,也就是说,我们的大部分工作都会放在 Android Studio中完成
准备阶段
unity 版本
Android studio版本
在UnityHub中为unity 添加 Android 所需 模块
为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
- 在玩家 设置——> 玩家--->其他设置之中把包名修改为我们自己的 格式为 XXX.XXX.XXX
- 添加已打开的场景
- 勾选导出项目
- 找个合适的文件夹导出
在AndroidStudio 中进行修改
导出后有两个module
Launcher 可要可不要
unityLibrary是我们需要的
可以单独导出到UnityLibaray 供其他Android 项目使用
此处为演示方便就在 launcher 模块中直接演示
- 找到 unityLibrary 模块下的android Manifest 把启动项去掉
- 在 launcher 模块下创建 一个 主activiy 步骤 如下
记得勾选 Launcher Activity
- 在主模块中添加如下依赖
dependencies {
implementation project(':unityLibrary')
implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\libs'), include: ['*.jar'])
}
否则在无法使用unityLibrary 模块
- 从Unity 导入的 一些 依赖 使用的 是 support 库 我们可以方便的转化为 android X 以确保统一
- 在 主模块下指定 application的 主题 (如有可以忽略)
布局 文件
<?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的方法
}
});
}
}
效果如图
