Android内嵌Unity (Activity)

这篇具有很好参考价值的文章主要介绍了Android内嵌Unity (Activity)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity2019.4.4

AndropidStudio4.2.1

参考文档:

Android内嵌Unity并实现互相跳转的实例代码_Android_脚本之家

Android Fragment中加载,嵌套Unity视图_unity 导入并作为fragment_周灬浩的博客-CSDN博客

本文只实现了Activity整个切换过去,而Fragment,这种像h5似的与app共存,目前还未实现,可参考的第二个链接

1、在空场景中创建一个空节点名字为unityObject(这个名字安卓调用unity用到)

然后在节点上添加一个脚本

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
/// <summary>
/// 安卓 unity交互
/// </summary>
public class AndoridAndUnity : MonoBehaviour
{
    public static AndoridAndUnity instance;
    AndroidJavaObject jo;
    private void Awake()
    {
        Debug.Log("AndoridAndUnity Awake");
        instance = this;
        //RunGameScene("Test");
        DontDestroyOnLoad(this);
    }

    private void Start()
    {
        Debug.Log("AndoridAndUnity Start");
        //Debug.Log("AndoridAndUnity 包名:"+ Application.identifier);
        //Debug.Log("AndoridAndUnity 版本号:" + Application.version);

    }

    //安卓回掉unity
    void fromAndroid(string str)
    {
        Debug.Log("安卓传来信息 : " + str);
    }

    //安卓回掉unity
    void RunGameScene(string str)
    {
        Debug.Log("切换场景 : " + str);
        SceneManager.LoadScene(str);
    }

    //返回app
    public void GoBack()
    {
        PlayerPrefs.Save();

        Debug.Log("AndoridAndUnity GoBack");
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("goBack");//调用Android中函数

        //Application.Quit();
    }    

    string str;
    private void OnGUI()
    {
        GUI.color = Color.white;
        //GUI.Label(new Rect(10, 100, 200, 40), str);
        if (GUI.Button(new Rect(10, 20, 200, 80), "返回"))
        {
            //str = "点击成功";
            GoBack();
        }

    }    


}

然后在Build Settings中将平台切换到Android

fragment 嵌套unity,unity Android,unity3d,android,unity

Unity项目目录与(下面新建的)安卓项目目录之间的关系:

fragment 嵌套unity,unity Android,unity3d,android,unity

 2、创建安卓项目

fragment 嵌套unity,unity Android,unity3d,android,unity  

选择NoActivity->Next

fragment 嵌套unity,unity Android,unity3d,android,unity

 尽量保持一致,不一致也是以安卓的为准

fragment 嵌套unity,unity Android,unity3d,android,unity

 NativeAndroidApp 中settings.gradle文件添加代码,将导出的unity库导入到安卓项目中(unityLibrary 的路径就是导出放置的路径有关)

fragment 嵌套unity,unity Android,unity3d,android,unity

include ':unityLibrary'
project(':unityLibrary').projectDir = new File('..\\androidBuild\\unityLibrary')

 在应用级build.gradle中加入so库和dependencies相应的unity依赖fragment 嵌套unity,unity Android,unity3d,android,unity 在应用级build.gradle中加入so库和dependencies相应的unity依赖

android {
    defaultConfig {
        ***
        ndk {
            // 设置支持的SO库架构,第三方给的so库哪几种架构,就配置这几种架构
            abiFilters 'armeabi', 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
        }
    }
}

dependencies {
    implementation project(':unityLibrary')
    implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])

***
}

在根级build.gradle(Module:NativeAndroidApp)中 加入

allprojects {
    repositories {
        google()
        jcenter()

        // Add Code
        flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
        // End
    }
}

引用完成就能在项目中看到unityLibrary,并修改unityLibrary下面的AndroidManifest.xml文中

fragment 嵌套unity,unity Android,unity3d,android,unity

 fragment 嵌套unity,unity Android,unity3d,android,unity

3、构建安卓布局和加入调用代码

选择 NativeAndroidApp 的 strings.xml 添加

<string name="game_view_content_description">Game view</string>

构建一个ui布局,并加入button按钮

fragment 嵌套unity,unity Android,unity3d,android,unity

 fragment 嵌套unity,unity Android,unity3d,android,unity

fragment 嵌套unity,unity Android,unity3d,android,unity

MainActivity.java

package com.fancy.rush;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_unity);

        Button btn=(Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Log.d("/Unity", "UnityActivity");

                Intent intent = new Intent(MainActivity.this, UnityActivity.class);
                intent.putExtra("sceneLevel","MatchAndMerge");//传递参数,利用传递的参数可以切换场景,或者数据之类的
                startActivity(intent);
            }
        });
    }
}

 UnityActivity.java

import android.os.Bundle;
import android.util.Log;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
import com.unity3d.player.UnityPlayer;


public class UnityActivity extends UnityPlayerActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent=getIntent();
        String sceneLevel=intent.getStringExtra("sceneLevel");
        testSendMessage(sceneLevel);
    }

    //当unity场景设置为常驻activity时,就需要运用到,常驻场景goBack切换出去后,再次打开时不会再周OnCreate,而是走onNewIntent
    @Override protected void onNewIntent(Intent intent)
    {
        super.onNewIntent(intent);

        String sceneLevel=intent.getStringExtra("sceneLevel");
        testSendMessage(sceneLevel);
    }

    // 向unity发送信息
    public void testSendMessage(String sceneLevel)
    {
        //获取意图对象
        Log.d("/Unity", "testSendMessage sceneLevel:"+sceneLevel);

        UnityPlayer.UnitySendMessage("unityObject", "fromAndroid", "UnityActivity");

        //利用传递的参数切换场景
        //第一个参数是Unity中一个节点对象的名字,第二个参数是节点对象上挂的脚本中一个函数的名字,第三个参数是函数中的参数值
        //UnityPlayer.UnitySendMessage("unityObject", "RunGameScene", sceneLevel);
    }

    public void goBack()
    {
        // unity点击按钮跳转回安卓界面
        Intent intent = new Intent(this, MainActivity.class);
        this.startActivity(intent);
    }
}

 再unity和app间相互切换会出现奔溃现象,只要把UnityActivity设置为 singleTask,常驻就不会被清除掉,再次调用打开unity就不会奔溃

fragment 嵌套unity,unity Android,unity3d,android,unity文章来源地址https://www.toymoban.com/news/detail-801984.html

到了这里,关于Android内嵌Unity (Activity)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android adb命令获取当前Activity或者Fragment

    用adb命令查看下面Demo处于 NO.3 Fragment 时的 Activity 和 Fragment 信息。 输出结果如下: 上面的 com.example.who/com.example.who.ui.activity.SecondActivity} 可以分成两部分看: / 前的部分是包名, / 后的部分是当前 Activity 的类全名。 该命令会输出堆栈中全部的窗口信息。 输出结果如下, Se

    2024年02月15日
    浏览(58)
  • Flutter 和 Android原生(Activity、Fragment)相互跳转、传参

    本文主要讲解 Flutter 和 Android原生之间,页面相互跳转、传参, 但其中用到了 两端相互通信 的知识, 非常建议 先看完这篇 讲解通信的文章 : Flutter 与 Android原生 相互通信:BasicMessageChannel、MethodChannel、EventChannel_flutter eventchannel methodchannel basemessagechan-CSDN博客 当前案例 Flu

    2024年02月22日
    浏览(46)
  • 【Android】怎么使用一个ViewModel用在多个Activity或者Fragment中

    项目需求 在多个Activity或者Fragment中使用同一个ViewModel 需求实现 1.使用ActivityScope或FragmentScope 想在一个Activity或Fragment中共享ViewModel实例,可以使用ActivityScope或FragmentScope。这两种范围会根据它们所绑定的Activity或Fragment自动管理ViewModel实例的生命周期。 例如,创建一个继承自

    2024年02月15日
    浏览(41)
  • 【Unity3D】Unity与Android交互

            本文主要介绍 Unity 打包发布 Android apk 流程、基于 AndroidJavaObject(或 AndroidJavaClass)实现 Unity 调用 Java 代码、基于 UnityPlayer 实现 Java 调用 Unity 代码,官方介绍见→Android。         Unity 项目 C# 中获取平台的代码如下,需要引入 UnityEngine 命名空间。         Ru

    2024年02月07日
    浏览(47)
  • 【Unity3D】Android 打包 ④ ( Android 工程打包 | Unity 中导出安卓工程 | Android Studio 打开 Unity 导出的 Android 工程 )

    Android 工程打包 就是将 Unity 项目导出为 Android Studio 项目 , 在 Unity 编辑器中选择 \\\" 菜单栏 | File | Build Settings… \\\" 选项 , 在弹出的 \\\" Build Settings \\\" 对话框中 , 勾选上 \\\" Export Project \\\" 选框 , 然后点击右下角的 \\\" Export \\\" 导出按钮 ; 选择一个导出目录 ; 等待 Android 工程导出 ; 最终导出的

    2023年04月19日
    浏览(54)
  • Unity3d发布android项目,打包apk包流程(unity2021.3.10)

    1、如下图,在安装版本设置里,点击添加模块。如果没有添加模块,证明你安装路径不是目前版本的安装路径,先去设置回来。 2、框选Android Build Support,点击继续,如下图, 3、同意,安装,如下图, 4、等待安装完成即可,如下图。 1、点击菜单栏File→Build Settings,进行编辑

    2023年04月23日
    浏览(63)
  • 在Android中Unity3D透明背景的实现

    在Unity中,可以通过Window-Rendering-lighting-在属性面板中选择Environment,修改 Skybox Material 为 None 来去掉天空盒。 但去掉天空盒的效果是这样的: 这样的效果明显不是预期的效果。 去掉天空盒并不代表背景被透明,还需要设置Camera的背景。 需要设置黑色透明度0,即ARGB为(0,

    2023年04月08日
    浏览(92)
  • Unity3D PC、Android、iOS平台打包流程

    在Unity窗口中,按下Ctrl+Shift+B快捷键,或者在菜单栏选择File-BuildSettings...,打开设置窗口。“Platform”下的选择项默认选择“Windows,Mac,Linux”。单击左下方的“Player Settings...”继续后续设置(应用名、应用分辨率、图标等),如图1-1所示。 图1-1 PC平台选择 接着,点击Add Op

    2023年04月20日
    浏览(61)
  • Unity3D2020+导出Android工程中使用并交互

    , 目录 1,版本信息 2,前期准备 Unity方面: Android方面: 3,Android与Unity3D交互 unity2020+ android studio 2021 *不要用android studio 2020系列,存在不能导入Library的bug 1,先配置打包的一些必要要素,包括包名之类 2,修改打包选项,将其打包为Android工程  3,打包出来的工程如下,其中

    2023年04月08日
    浏览(64)
  • Unity3d使用Netcode实现Hololens、Android和Pc端通信

    在Unity3d中使用现有的Netcode/Mirror组件实现Hololens、Android和Pc端的三方通信,可以指定一平台为服务器端,其他的两平台多为客户端,不过通常是进行两个平台的通信即可。在这片文章中,可以实现平移、缩放以及旋转的同步 具体步骤如下: 版本:unity2020.3LTS、VS2019 一、配置

    2024年02月09日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包