首页 > 其他分享 >Android集成Unity

Android集成Unity

时间:2023-06-19 11:35:54浏览次数:28  
标签:集成 MyUnityPlayer 项目 unityLibrary unity module gradle Unity Android


前期准备材料
1、已经导出成功的unity项目,导出的unity项目内部结构见下图
2、新建一个或者使用已有项目

Android集成Unity_unity

1、第一步,导入unity

打开安卓项目,导入unity的module,找到unity项目中的unityLibrary,选中此module,点击finish后稍等片刻。

Android集成Unity_android studio_02

Android集成Unity_android studio_03

Android集成Unity_unity_04

2、解决导入module过程中出现的问题

a、在项目的gradle.properties中添加如下代码

unityStreamingAssets=.unity3d, google-services-desktop.json, google-services.json, GoogleService-Info.plist

b、在主module中的build.gradle中添加如下代码

configurations.all {
//    重点大问题:一次性解决support库版本不一致,直接改了所有的依赖项目
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '28.0.0'
            }
        }
    }
}
3、将unity项目中的unityLibrary中新建一个MyUnityPlayer类,继承UnityPlayer类,然后将UN体验项目rebuild,生成的aar文件,复制到安卓项目主module的libs中,并在build.gradle中引用。

Android集成Unity_android studio_05

public class MyUnityPlayer extends UnityPlayer {
    public MyUnityPlayer(Context context) {
        super(context);
    }

    protected void kill() {
    }
}

Android集成Unity_android_06

Android集成Unity_android studio_07

在build.gradle中引用aar:

implementation(name: 'unityLibrary-debug', ext: 'aar')
4、将unityLibrary中jniLibs中的so文件复制到安卓项目的主module中。

如下是unityLibrary中so文件的位置:

Android集成Unity_Layout_08

如下是主module中位置,如果没有jniLibs文件夹新建即可。

Android集成Unity_unity_09

5、在主module中新建页面,并运行程序,成功展示unity效果,然后写上跳转到此页面代码,运行即可看到unity效果。

a、在主module中新建UnityActivity,布局文件中只有一个LinearLayout即可:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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=".unity.SecondActivity">

    <LinearLayout
        android:id="@+id/unityLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="8dp"
        android:layout_weight="10"
        android:orientation="horizontal"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="104dp">

    </LinearLayout>

</LinearLayout>

b、UnityActivity中初始化LinearLayout和MyUnityPlayer,并重写unityplayer生命周期方法

private LinearLayout unityLayout;
    private MyUnityPlayer mUnityPlayer;

//  在onCreate中初始化
        unityLayout = findViewById(R.id.unityLayout);
        getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy
        // 创建Unity视图
        mUnityPlayer = new MyUnityPlayer(this);
        // 添加Unity视图
        unityLayout.addView(mUnityPlayer.getView());
        mUnityPlayer.requestFocus();


//  以下是生命周期方法---必须要写,否则黑屏

    @Override protected void onNewIntent(Intent intent) {

// To support deep linking, we need to make sure that the client can get access to

// the last sent intent. The clients access this through a JNI api that allows them

// to get the intent set on launch. To update that after launch we have to manually

// replace the intent with the one caught here.

        super.onNewIntent(intent);
        setIntent(intent);

    }

// Quit Unity

    @Override protected void onDestroy ()

    {

        mUnityPlayer.quit();

        super.onDestroy();

    }

// Pause Unity

    @Override protected void onPause()

    {

        super.onPause();

        mUnityPlayer.pause();

    }

// Resume Unity

    @Override protected void onResume()

    {

        super.onResume();

        mUnityPlayer.resume();

    }

// Low Memory Unity

    @Override public void onLowMemory()

    {

        super.onLowMemory();

        mUnityPlayer.lowMemory();

    }

// Trim Memory Unity

    @Override public void onTrimMemory(int level)

    {

        super.onTrimMemory(level);

        if (level == TRIM_MEMORY_RUNNING_CRITICAL)

        {

            mUnityPlayer.lowMemory();

        }

    }

// This ensures the layout will be correct.

    @Override public void onConfigurationChanged(Configuration newConfig)

    {

        super.onConfigurationChanged(newConfig);

        mUnityPlayer.configurationChanged(newConfig);

    }

// Notify Unity of the focus change.

    @Override public void onWindowFocusChanged(boolean hasFocus)

    {

        super.onWindowFocusChanged(hasFocus);

        mUnityPlayer.windowFocusChanged(hasFocus);

    }

// For some reason the multiple keyevent type is not supported by the ndk.

// Force event injection by overriding dispatchKeyEvent().

    @Override public boolean dispatchKeyEvent(KeyEvent event)

    {

        if (event.getAction() == KeyEvent.ACTION_MULTIPLE)

            return mUnityPlayer.injectEvent(event);

        return super.dispatchKeyEvent(event);

    }

// Pass any events not handled by (unfocused) views straight to UnityPlayer

    @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); }

    @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); }

    @Override public boolean onTouchEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); }

    /*API12*/ public boolean onGenericMotionEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); }

标签:集成,MyUnityPlayer,项目,unityLibrary,unity,module,gradle,Unity,Android
From: https://blog.51cto.com/u_16163453/6512012

相关文章

  • Android自定义View实现渐变色进度条
    在网上看到一个进度条效果图,非常美观,如下:进行效果分解:渐变色,看起来颜色变化并不复杂,使用LinearGradient应该可以实现。圆头,无非是画两个圆,外圆使用渐变色的颜色,内圆固定为白色。灰底,还没有走到的进度部分为灰色。进度值,使用文本来显示;弧形的头部,考虑使用直线进行连接,或者使用曲线,例......
  • Android R音频输出问题处理随笔
    AndroidR音频输出问题处理背景:播放蓝牙音乐时插拔有线耳机,蓝牙音乐无声音播放蓝牙音乐是指机器作为sink端,手机作为source端连接,手机播放的音乐通过蓝牙avrcp协议传输和播放AndroidR上使用的是蓝牙协议栈已经使用了AAudio,系统源码路径是system/bt/btif/src/btif_avrcp_audio_tr......
  • 2023年疫情开放后一个Android的面试历程
    2022.11.24在当前公司待了两年多,被离职了,拿了点赔偿金继续面试。薪资期望13-15,趁着快要过年了整理下面试过程。11月面临了人生第一次比较重大的变化:现在的公司因为融资不利,疫情影响,正式被裁了。这一波很伤…所以在得知消息之后,接下来差不多一个月的时间里,自己开始了的频繁的面......
  • 年后上来面试了13家企业Android岗位,面试题整理
    先卖个关子,如果你是面试官,你希望招一个什么样的人进来?如果这个问题搞明白了,那么可以说测试岗位的面试,就变得非常轻松了。按照一般的惯例,面试官都会让你自我介绍,介绍你的项目经验,询问你的技术能力,这些都是常规的问题。我不去说什么固定的范本什么的,我就以我以前面试别人的情景为例,具......
  • Android ImageView 图片自适应问题记录
    困惑了一周的问题,imageview里的图片是后端返回的,包括返回了图片的宽高,开始利用layoutpararams代码里设置了,不清楚为什么没有生效,后来就忘记优化了。在上线前夕,产品提出了这个优化点,满头雾水。当时想的是有没有可能是后端返回的图片的问题,(产品说ios是好的)。。。。无语(自己技术太菜)......
  • Android屏幕适配的几种方案
    前言由于Android设备存在有不同的屏幕尺寸,屏幕分辨率,像素密度,Android应用在开发的过程必须要考虑到屏幕尺寸适配的问题,以保证在不同尺寸的Android设备上都能够正常运行。我们需要利用适配这一个过程把同一张原型图设计的样式尽可能以同样地视觉效果呈现在不同地屏幕上。适配核心问......
  • android连接本地数据库sqlite,实现增删改查
    前言Android应用数据存储简单来说有这么几种:文件存储、SharedPreference存储、SQLite数据库存储、网络服务器存储、ContentProvider等。如果需要存储的数据量大的时候,那么使用文件存储会有很大的弊端,例如:你想修改其中很微小的项就要先读取整个文件的内容,修改后再全部保存,非常耗时。......
  • 2023-06-19 uniapp云打包报错:app-plus.distribute.icons.android.hdpi 文件不存在
    详细报错:[HBuilder]11:02:51.408Manifest.json文件以下节点配置错误,请检查修复[HBuilder]11:02:51.408app-plus.distribute.icons.android.hdpi 文件不存在[HBuilder]11:02:51.408app-plus.distribute.icons.android.xxhdpi 文件不存在[HBuilder]11:02:51.408ap......
  • 一文带你了解Android IO的底层原理
    前言最近在看《Linux内核设计与实现》的时候,就想着要不把知识串联一下吧。聊什么呢?今天先来聊聊AndroidIO的调用链路。说起IO,这可真是一个很复杂的过程,里面涉及了很多内容,先是软件,最后到硬件,用一张图来表示一下吧:本文打算简单得和大伙讨论一下IO的流程。一、应用层作为应用开......
  • Android 架构之 MVI 完全体 | 重新审视 MVVM 之殇,PartialChange & Reducer 来拯救
    作者:唐子玄MVI架构有三大关键词:“唯一可信数据源”+“单向数据流”+“响应式编程”,以及一些关键概念,比如Intent,State。理解这些概念之后,能更轻松地阅读本文。(强烈建议从第一篇开始阅读)引子在上一篇中,用MVI重构了“新闻流”这个业务场景。本篇在此基础上进一步拓展,引入MVI中......