Android内嵌Unity (Activity)

news2024/11/19 5:46:17

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

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

 2、创建安卓项目

  

选择NoActivity->Next

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

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

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

 在应用级build.gradle中加入so库和dependencies相应的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文中

 

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

选择 NativeAndroidApp 的 strings.xml 添加

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

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

 

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就不会奔溃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WSL2 ubuntu ip 自动同步 、静态ip(解决wsl2 ip 每次开机ip会变化的问题)

​ 利用python脚本解决wsl2 ip不固定的问题 环境信息 ​ wsl2 中linux版本&#xff1a;ubuntu ​ windows版本&#xff1a; win10/win11 问题描述 最近装了wsl2&#xff0c;使用vscode远程连接wsl2时遇到了如下问题&#xff1a; 1、wsl2的ip无法固定 2、wsl2的ssh服务不能…

vue项目使用element-ui

最近新建一个vue项目&#xff0c;配置了element-ui&#xff0c;较之前使用时发生了些许变化&#xff0c;对新的配置方式进行记录 node版本 v14.21.3 npm版本 v6.14.18 vue版本 v2.6.14 element-ui版本 v2.15.13 创建项目vue项目&#xff0c;使用…

设计原则之【迪米特法则】

文章目录 一、什么是迪米特法则1、理解迪米特法则2、如何理解“高内聚、松耦合”&#xff1f; 二、实例1、实例12、实例2 一、什么是迪米特法则 迪米特原则&#xff08;Law of Demeter LoD&#xff09;是指一个对象应该对其他对象保持最少的了解&#xff0c;又叫最少知道原则&…

Navicat自动提交的开和关

使用Navicat时&#xff0c;若是自动提交是打开状态&#xff0c;就相当于是自动执行了commit操作&#xff0c;就无法进行回滚操作。 一.相关指令 1.查询Navicat的自动提交开关状态&#xff1a; -- 查询自动提交 ON:是自动提交&#xff0c;即commit ;OFF:不是自动提交&#xf…

Java-注解

文章目录 前言一、概述二、元注解TargetRetentionDocumentedInherited 三、自定义注解四、常用内置注解OverrideDeprecatedSuppressWarnings 前言 注解用于修饰包、类、方法、属性、构造器、局部变量等数据信息&#xff0c;它可以用于创建文档&#xff0c;跟踪代码的依赖性&am…

怎么在VMware ESXi添加NAS存储?

案例&#xff1a;需要将NAS添加到VMware ESXi “我的本地空间不是很多&#xff0c;虚拟机占了我很多空间&#xff0c;但是我有一个NAS&#xff0c;所以我想问一下有没有办法可以让VMware ESXi添加NAS存储来扩展空间&#xff1f;” 网络附加存储&#xff08;NAS&#xff09;设…

2023年6月CDGP数据治理专家认证考试,5月报名及学习

目前6月DAMA-CDGP数据治理专家认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。 目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算参加6月考试的朋友们可以抓紧时间报名啦&#xff01;&#xff01;&#xff01; DAMA认证为数据…

为什么每个有影响力的内容创作者都需要一个Kadence WordPress网站

创作者经济正在蓬勃发展&#xff0c;内容创作者正在以前所未有的方式建立受众和收入来源。无论您是在 YouTube、Instagram、TikTok 还是任何其他平台上增加受众&#xff0c;充分利用这些受众变得越来越重要。 Adobe 于 2022 年 8 月发布的一项研究表明&#xff0c;过去 2 年全…

关于加强珠宝玉石类小程序把控的公告

各位小程序开发者为进一步加强小程序的规范管理&#xff0c;保障用户合法权益&#xff0c;平台将对珠宝玉石类小程序加强把控&#xff0c;具体内容如下&#xff1a; 一、 【商家自营-珠宝玉石】类目资质调整 备注&#xff1a;若小程序涉及经营随形加工的原石或摆件相关服务&…

Vue入门简介【第一篇】

大纲 一、Vue介绍 &#x1f334; 1.1 什么是Vue vue是一个构建用户界面UI的渐进式javascript框架&#xff0c;渐进式的框架是指可以一步一步的由浅入深的去使用该框架。 vue官网&#xff1a; https://cn.vuejs.org/ &#x1f334; 1.2 Vue的优点 ⭐️ 1、体积小 压缩后33…

大数据分析就业班课程大纲

大数据分析就业班课程大纲列举&#xff1a; 第一阶段 Mysql从入门到精通/Python从入门到精通课程模块课程内容 MySQL 数据库 数据库概念及其功能介绍、数据库的安装与配置、数据库表的创建及注意事项、数据库的增、删、改、查等操作、多表的关系及查询、多表的…

OSI七层模型中的MAC和PHY

最近做服务器项目在学习MAC和PHY&#xff0c;总结了一些知识点&#xff0c;拿来分享一下 说到MAC和PHY首先要提到OSI七层模型 OSI七层模型 TCP/IP四层模型 对应网络协议 应用层&#xff08;Application&#xff09; 应用层 HTTP、TFTP, FTP, NFS, WAIS、SMTP 表示层&…

【Python入门知识】NumPy 数组排序/过滤,案例+理论讲解

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 数组排序 排序是指将元素按有序顺序排列。 有序序列是拥有与元素相对应的顺序的任何序列&#xff0c;例如数字或字母、升序或降序。 NumPy ndarray 对象有一个名为 sort() 的函数&#xff0c;该函数将对指定的数组进行排…

功率放大器在Lamb波信号波包模型验证研究中的应用

实验名称&#xff1a;窄带激励条件下的兰姆波时域信号参数估计研究 研究方向&#xff1a;Lamb波 测试目的&#xff1a; 基于Lamb波的二阶频散理论&#xff0c;提出了时域信号的波包模型&#xff0c;为全文奠定理论基础。模型考虑两种情况&#xff1a;初始激励以单模态传播和…

【面试】说说什么是 Java 内存模型(JMM)?

文章目录 一、 为什么要有内存模型&#xff1f;1.1. 硬件内存架构1.2. 缓存一致性问题1.3. 处理器优化和指令重排序 二、并发编程的问题三、Java 内存模型3.1. Java 运行时内存区域与硬件内存的关系3.2. Java 线程与主内存的关系3.3. 线程间通信 四、总结 一、 为什么要有内存模…

Java阶段二Day16

Java阶段二Day16 文章目录 Java阶段二Day16SSMSpringBoot简述核心特性创建SpringBoot工程创建工程失败排查 MyBatis框架-注解管理概述MyBatis环境初始化整合MyBatisPojo对象设计Dao接口设计 SSM Spring&#xff1a;Spring是一个轻量级的容器和框架&#xff0c;为开发者提供了一…

沃通“SSL证书+代码签名证书”,防范高仿“钓鱼网站+钓鱼软件”攻击

近日&#xff0c;360发布威胁预警&#xff0c;因监测发现多起利用钓鱼网站对特定用户进行攻击的安全事件&#xff0c;呼吁警惕“高仿”软件安装程序暗藏钓鱼木马。“钓鱼网站钓鱼软件”是非常典型的钓鱼攻击组合&#xff0c;而沃通“SSL证书代码签名证书”能够帮助企业建立安全…

一文带你直观感受,BPM管理系统如何在低代码平台实现搭建

BPM系统&#xff08;英文全称&#xff1a;Business Process Management&#xff0c;翻译后简称BPM&#xff09;即业务流程管理系统&#xff0c;是指对端到端业务流程进行建模、分析和优化&#xff0c;用以实现战略业务目标&#xff0c;其特点是注重流程驱动为核心&#xff0c;实…

通过修改根证书绕过rustls的证书固定机制,抓包解密ssl流量

例子&#xff0c;cloudflare的warp-svc.exe。抓包获取密钥。 用proxifier尝试了一下强行代理&#xff0c;无效&#xff0c;因为proxifier是通过Hook Socket函数方式实现的&#xff0c;但这个程序可能没有用Socket函数进行通信。 之后发现通过nekoray基于gvisor的VPN白名单模式全…

《计算机网络——自顶向下方法》精炼——3.1-3.4.1

“生命在于运动&#xff0c;学习在于不断尝试。”——亚里士多德 文章目录 运输层概述与服务运输层功能运输层概述IP协议UDP和TCP协议 多路复用与多路分解UDPUDP相较于TCP的优点UDP报文段结构检验和可靠数据传输构造可靠数据传输协议 运输层概述与服务 运输层为应用层提供了逻…