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.hqwc.cn/news/299002.html

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

相关文章

第八部分 函数

定义 8.1 设 F 为二元关系 , 若 ∀ x ∈ dom F 都存在唯一的 y ∈ ran F 使 xFy 成立 , 则称 F 为 函数 对于函数 F , 如果有 xFy , 则记作 y F ( x ), 并称 y 为 F 在 x 的 值 . 例 F 1 {< x 1 , y 1 >,< x 2 , y 2 >,< x 3 , y 2 >…

Python实验:关灯游戏

文章目录 前言一、设计表二、关键代码三、运行结果小地图&#xff0c;容易难度&#xff1a;中地图&#xff0c;中等难度&#xff1a;大地图&#xff0c;困难难度&#xff1a; 四、完整代码链接总结 前言 这是一个Python实验作业&#xff0c;内容如下&#xff1a; 题目要求&am…

多维时序 | MATLAB实CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测预测效果基本介…

NUAA-云计算-考试

19级期末 问题 答案: md格式 自己想办法看 # 随堂测验#### 一、请简述GFS 的系统架构和特点。**1. 系统架构**- GFS将整个系统节点分为三类角色&#xff1a;- Client&#xff08;客户端&#xff09;&#xff1a;Client是GFS提供给应用程序的访问接口&#xff0c;以库文件的…

SpringBoot2.x+mybatis plus3.x集成Activit7版本

文/朱季谦 在Activiti6版本当中&#xff0c;若要集成到Springboot里&#xff0c;需要写一些额外的配置类&#xff0c;我曾经在Activiti工作流框架学习笔记&#xff08;二&#xff09;之springboot2.0整合工作流Activiti6.0一文当中总结过相关配置过程&#xff0c;感兴趣的同学…

ssh工具 向指定的ssh服务器配置公钥

此文分享一个python脚本,用于向指定的ssh服务器配置公钥,以达到免密登录ssh服务器的目的。 效果演示 🔥完整演示效果 👇第一步,显然,我们需要选择功能 👇第二步,确认 or 选择ssh服务器 👇第三步,输入ssh登录密码,以完成公钥配置 👇验证,我们通过ssh登录…

AI时代下,如何看待“算法利维坦”?程序员客栈程序员客栈​

ChatGPT的浪潮从2022年袭来后&#xff0c;至今热度不减&#xff0c;呈现出蓬勃发展的趋势。AI家居、医疗、教育、金融、公益、农业、艺术......AI真的已经走进了生活的方方面面&#xff0c;我们仿佛已经进入了AI时代&#xff0c;势不可挡。人工智能水平如此之高&#xff0c;不禁…

学习在UE中通过Omniverse实现对USD文件的Live-Sync(实时同步编辑)

目标 前一篇 学习了Omniverse的一些基础概念。本篇在了解这些概念的基础上&#xff0c;我想体验下Omniverse的一些具体的能力&#xff0c;特别是 Live-Sync (实时同步) 相关的能力。 本篇实践了使用Omniverse的力量在UE中建立USD文件的 Live-Sync 编辑。由于相关的知识我是从…

AI进化太快了!Stability AI开源视频生成大模型Stable Video Diffusion

对于 Stable Diffusion&#xff0c;想必读者朋友们对此都不陌生。 自 Stability AI 公司发布 SD&#xff08;全称&#xff1a;Stable Diffusion) 以来&#xff0c;受到了很多人的喜爱。 SDXL 效果 随后技术升级&#xff0c;又发布了 SDXL&#xff0c;名字很有喜感&#xff0c…

青岛农业大学 百度网盘,青岛农业大学参考书目

大家好&#xff0c;本文将围绕青岛农业大学c语言程序设计展开说明&#xff0c;javase青岛农业大学教材答案是一个很多人都想弄明白的事情&#xff0c;想搞清楚青岛农业大学 百度网盘需要先了解以下几个事情。 文章目录 前言一、需要安装什么软件&#xff1f;二、代码准备 1.fid…

【期末复习】微信小程序复习大纲( 1- 5 章)

前言&#xff1a; 这周开始进入期末复习周&#xff0c;没时间看C/C、linux等知识了&#xff0c;先把期末考试必考的知识捋一遍。 目录 第一章 微信小程序入门 一、填空题 二、判断题 三、选择题 四、简答题 第二章 微信小程序页面制作 一、填空题 二、判…

Java学习时间和日期

1 常用类 1.1 Date 表示日期 具体类 设置时间 1.2 Calendar 表示日历 抽象类 设置日历的设定日期 void set(int year,int month,int date); void set(int year,int month, int date, int hour, int minute,int second); void setTime(Date d); int get(int field)&#…