UE和Android互相调用

ue和android互调

这两种方式都是在UE打包的Android工程之上进行的。

一、首先是UE打包Android,勾选下面这项

如果有多个场景需要添加场景

工程文件在这个路径下

然后可以通过Android Studio打开,选择gradle打开

先运行一下,看看是否可以发布到Android设备上,然后再进行下一步。

二、新建一个MainActivity启动UE

MainActivity注意要继承Activity,test.android包名是UE发布android时候的包名

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this, GameActivity.class);startActivity(intent);}});}
}

然后就是Manifest中启动这个Activity,把自动生成的GameActivity作为启动的Activity取消了。

        <activity android:name="com.test.android.MainActivity"
><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

这个页面上就一个按钮,用来跳转UE用的。

<?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout 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.test.android.MainActivity"><Buttonandroid:id="@+id/button"android:layout_width="177dp"android:layout_height="155dp"android:text="Button"tools:layout_editor_absoluteX="172dp"tools:layout_editor_absoluteY="351dp" />
</android.widget.RelativeLayout>

然后就可以测试一下,启动项目应该是启动自己新的这个Activity,点击按钮就可以跳转到UE的界面。

三、UE中自定义widget点击按钮,打开Android页面,右边两个没有用不用管。

1、这个是我们新建的c++类

头文件

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "Components/Button.h"
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "DemoUserWidget.generated.h"/*** */
UCLASS()
class DEMOANDROID_API UDemoUserWidget : public UUserWidget
{GENERATED_BODY()protected:virtual void NativeConstruct() override;
public:UPROPERTY(meta = (BindWidget))class UButton* ButtonUEJump;UPROPERTY(meta = (BindWidget))class UButton* ButtonHaerbin;UPROPERTY(meta =  (BindWidget))class UButton* ButtonBeijing;UFUNCTION()void ButtonUEJumpClick();UFUNCTION()void ButtonHaerbinClick();UFUNCTION()void ButtonBeijingClick();
};

 cpp文件,ButtonHaerbinClick是我们点击widget按钮时,回调的方法。toAndroidActivity是定义在GameActivity中的一个java方法,(Ljava/lang/String;)V这个要注意的是参数后面要加分号,V表示无返回值的意思。CallVoidMethod就是调用java中无返回值的方法,str是要传递的参数。

void UDemoUserWidget::ButtonHaerbinClick()
{GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("haerbin")));#if PLATFORM_ANDROIDif (JNIEnv* Env = FAndroidApplication::GetJavaEnv()){bool bIsOptional = false;static jmethodID toAndroidActivity = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "toAndroidActivity", "(Ljava/lang/String;)V", bIsOptional);char tt[30] = {"--------a--"};jstring str = Env->NewStringUTF((const char*)tt);FJavaWrapper::CallVoidMethod(Env, FJavaWrapper::GameActivityThis, toAndroidActivity, str);UE_LOG(LogTemp, Warning, TEXT("jmethodID is vaild :AndroidThunkJava_GetMessage "));}
#endif//PALTFORM_ANDROOT
}

2、UE中创建一个Widget要继承我们之前写的c++的代码

按钮的名字要与c++头文件的名称一致,因为我们使用的是绑定的方式。

 

3、在Android的GameActivty中新建的2个方法,以对话框的方式打开Android的界面。 

public void toAndroidActivity(String placeName) {runOnUiThread(new Runnable() {@Overridepublic void run() {showLimit(GameActivity.this);}});}
public  void showLimit(Context context) {final Dialog baseDialog = new Dialog(context);View view = LayoutInflater.from(context).inflate(R.layout.view_pop_custom, null);TextView tv_next = view.findViewById(R.id.tv_next);baseDialog.show();baseDialog.setCanceledOnTouchOutside(false);Window window = baseDialog.getWindow();WindowManager.LayoutParams attributes = window.getAttributes();attributes.width = 600;window.setAttributes(attributes);tv_next.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.debug("tv_next.setOnClickListener");baseDialog.dismiss();toNewUEPlace();}});window.setContentView(view);}

四、点击弹出的Android界面上的按钮,切换ue中的场景

1、在GameActivity类中定义一个方法public native void toNewUEPlace();

2、在UE中DemoUserWidget.cpp中

#include "Kismet/GameplayStatics.h"#if PLATFORM_ANDROID
#include "Runtime/Launch/Public/Android/AndroidJNI.h"
#include "Runtime/ApplicationCore/Public/Android/AndroidApplication.h"
#include "Android/AndroidJavaEnv.h"
#endif//PLATFORM_ANDROID#if PLATFORM_ANDROID
JNI_METHOD void Java_com_epicgames_unreal_GameActivity_toNewUEPlace(JNIEnv* jenv, jobject thiz)
{UE_LOG(LogTemp, Warning, TEXT("toNewUEPlace"));UGameplayStatics::OpenLevel(GWorld, FName("/Game/Maps/abc"), true);
}#endif//PLATFORM_ANDROID

abc是自己创建的map

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

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

相关文章

032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

032 - STM32学习笔记 - TIM定时器&#xff08;一&#xff09; - 基本定时器知识 这节开始学习一下TIM定时器功能&#xff0c;从字面意思上理解&#xff0c;定时器的基本功能就是用来定时&#xff0c;与定时器相结合&#xff0c;可以实现一些周期性的数据发送、采集等功能&#…

DMR与DPMR以及DMR的分层

数字移动无线电 (DMR) 和数字专用移动无线电 (dPMR) 是数字对讲机中使用的流行通信技术。 与传统模拟无线电相比&#xff0c;这两种技术都提供了改进的音频质量、增强的安全功能和增加的网络容量。 但是&#xff0c;DMR 和 dPMR 无线电之间使用的技术存在重大差异&#xff…

2023年12月GESP Python五级编程题真题解析

【五级编程题1】 【试题名称】&#xff1a;小杨的幸运数 【问题描述】 小杨认为&#xff0c;所有大于等于a的完全平方数都是他的超级幸运数。 小杨还认为&#xff0c;所有超级幸运数的倍数都是他的幸运数。自然地&#xff0c;小杨的所有超级幸运数也都是幸运数。 对于一个…

MongoDB安装部署

二、安装部署 2.1 下载 下载地址&#xff1a;MongoDB Enterprise Server Download | MongoDB 当前最新版本6.0.9&#xff0c;5.0.9对Mac m1需要centos 8.2版本。选择docker安装。 2.2 docker-ce安装 # 安装docker # 默认repo源没有docker-ce安装包&#xff0c;需要新的rep…

Android 13 - Media框架(26)- OMXNodeInstance(三)

上一节我们了解了OMXNodeInstance中的端口定义&#xff0c;这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的&#xff0c;以及如何关联起来的。&#xff08;我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创…

免费更新UltraNews v2.8.0 已注册 – Laravel报纸,博客多语言系统,支持AI作家,内容生成器脚本

UltraNews v2.8.0 已注册 – Laravel报纸&#xff0c;博客多语言系统&#xff0c;支持AI作家&#xff0c;内容生成器脚本 一、概述 在网络内容创作与管理领域&#xff0c;UltraNews v2.8.0以其高度现代化和多功能性而独树一帜。这是一个基于Laravel框架构建的报纸、博客多语言…

实习课知识整理4:点击某个商品如何跳转到并展示出商品详情页

项目情景&#xff1a;当我们点击某个商品时&#xff0c;我们需要查看商品的具体的信息并进行购买的操作 简单理解以下就是&#xff0c;当我们点击一个url链接时&#xff0c;该链接需要携带一个参数到后端&#xff0c;一般设为商品的Id&#xff0c;然后后端通过Id从数据库中查找…

怎么卸载macOS上的爱思助手如何卸载macOS上的logitech g hub,如何卸载顽固macOS应用

1.在App Store里下载Cleaner One Pro &#xff08;注意&#xff0c;不需要订阅付费&#xff01;&#xff01;&#xff01;白嫖基础功能就完全够了&#xff01;&#xff01;&#xff01;&#xff09; 2.运行软件&#xff0c;在左侧目录中选择“应用程序管理”&#xff0c;然后点…

C++初阶——类和对象

呀哈喽&#xff0c;我是结衣 C入门之后&#xff0c;我们就进入了C的初阶的学习了&#xff0c;在了解类和对象之前&#xff0c;我们还是先了解&#xff0c;面向过程和面向对象的初步认识。 在本篇博客中&#xff0c;我们要讲的内容有 1.面向过程和面向对象初步认识 2.类的引入 3…

RasaGPT对话系统的工作原理

RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目&#xff0c;当超出 Rasa 现有意图(out_of_scope)的时候&#xff0c;就会执行 ActionGPTFallback&#xff0c;本质上就是利用 Langchain 做了一个 RAG&#xff0c;调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂&#xff0c…

面试官:看你简历了解过并发,我们简单聊一聊

前言&#xff1a; 今天和大家探讨最近的面试题&#xff0c;好久没有面试了&#xff0c;所以在此记录一下。本篇文章主要讲解CyclicBarrier和CountDownLatch的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xf…

羊了个羊抓包速通,让第二关变成和第一关一样难度

目录 一.前言 二.前期准备 2.1抓包环境 2.2安装电脑版微信环境 2.3配置bp与浏览器VPN 2.4配置proxifier 三.开始抓包 3.1前期准备 3.2抓包ing 一.前言 羊了个羊是一款经典微信小程序游戏&#xff0c;号称“第一关谁都能过&#xff0c;第二关谁能过&#xff1f;“。那…

Python使用多线程解析超大日志文件

目录 一、引言 二、多线程基本概念 三、Python中的多线程实现 四、使用多线程解析超大日志文件 五、性能优化和注意事项 总结 一、引言 在处理大量数据时&#xff0c;单线程处理方式往往效率低下&#xff0c;而多线程技术可以有效地提高处理速度。Python提供了多种多线程…

详解Vue3中的内置组件(transition)

本文主要介绍Vue3中的内置组件&#xff08;transition&#xff09;的普通写法和setup写法。 目录 一、在普通写法中使用内置组件&#xff08;transition&#xff09;二、在setup写法中使用内置组件&#xff08;transition&#xff09;三、使用注意项 在Vue3中&#xff0c;内置了…

3 个适用于 Mac 电脑操作的 Android 数据恢复最佳工具 [附步骤]

在当今的数字时代&#xff0c;无论是由于意外删除、系统故障还是其他原因&#xff0c;从 Android 设备中丢失数据不仅会带来不便&#xff0c;而且会造成非常严重的后果。特别是对于Mac用户来说&#xff0c;从Android手机恢复数据是一个很大的麻烦。幸运的是&#xff0c;随着许多…

九:爬虫-MongoDB基础

MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它支持的数据结构非常松散&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大&#xff0c;其…

【MySQL】数据库的SQL语句详解

目录 一、操作系统了解 二、关系型数据库与非关系型数据库的区别 三、关系型数据库的四种语言 四、DDL语言&#xff08;数据库定义语言&#xff0c;管理创建对象如库、表、字段、索引等&#xff09; 1、库的增删改查&#xff1b; 2、表的增删改查&#xff1b; 3、字段的增…

机场数据治理系列介绍(2):六图法开展数据治理的步骤与要点

目录 一、机场数据治理的六图法 1、何为六图法 二、应用数据治理六图法的相关工作步骤 1、制定战略目标 2、梳理业务情况 3、收集需求 4、构建数智应用地图 5、选择合适的算法 6、建立数据地图 7、持续改进和优化 三、相关要点 1、明确数据治理三张清单 2、持续构…

Chainlink 开发者故事:Krypton 从构思到产品的 Chainlink BUILD之旅

识别问题&#xff0c;构思解决方案&#xff0c;建立它&#xff0c;推出它&#xff0c;然后扩展它。这就是科技初创企业的操作手册。 现在&#xff0c;前Chainlink黑客马拉松获奖者&#xff0c;当前的Chainlink BUILD成员Krypton已经进行到了第四步&#xff1a;推出。Krypton团…

敏捷开发 - 知识普及

敏捷开发- Scrum 前言 知乎有一篇文章描写Scrum,我觉得比较好:https://zhuanlan.zhihu.com/p/631459977 简单科普下PM和PMO 原文来源:https://zhuanlan.zhihu.com/p/546820914 PM - 项目经理(Project Manager) ​ 需要具备以下能力 ​ 1.号召力 2.影响力 3.交流能力 4.应…