【UE】UMG安卓相关问题

1.获取控件的运行时实际大小

使用控件的缓存几何体,获取绝对大小就能得到运行时控件大小。

实际的输出会将视口的缩放计算进去,即显示的多大就是多大。

如果想得到控件你自己设置的大小,可以从缓存几何体中获取本地大小,或者转换插槽依靠属性直接获取。

注:

GetDesiredSize()中文显示为获取所需大小,但实际上并不能获取到运行时大小。获取到的是预期的大小。

链接: UMG Widget GetDesiredSize()

2.打包安卓点击位置和UMG实际生效位置不符

造成这个问题可能有多种原因,注意原来自己设置了什么。像什么DPI缩放规则什么的。

我遇到的原因是UE5.6版本开启了Use disaply cutout region?该选项默认是关的。

这是用于适配安卓各种刘海,水滴屏,开启这个才可以全屏显示,没有黑边。

将该选项关闭,就不会出现错位了。

正常Use disaply cutout region?该选项应该是可以开启的,造成位置不符的问题应该是全屏开启了,但是UI没有全屏显示,还是有黑边的状态,所以错位了。

下文有怎么解决黑边。

3.打包Android全屏显示,抹除黑边

正常勾选Use disaply cutout region?即可全屏显示

但我的工程不行,我去找了各种文章,用于解决黑邊問題都于事无补。

参考如下:

链接: 【UE4】Android无法全屏(如何找到打包时GameActivity来源)-全屏代码如何实现

链接: Need advice on making Android game fullscreen

链接: Unreal Engine 5.6 Blueprint Android "Display cutout region" error problem

链接: Unreal发布Android在刘海屏手机上不能全屏显示问题

核心问题是UE生成的java代码中有关于机型的判断,大部分文章都说要注释了

UseDisplayCutout部分。

但我测试后仍然无效。

测试了5.7版本就好的

想想不清楚是不是我没有指定安卓sdk,ndk那些东西的关系。。。但是我用5.7也没有指定哪些玩意,他就是好的,而且5.7没有修改引擎的相关东西。

又测试了5.4。将引擎的SplashActivity.java中的UseDisplayCutout=false注释,然后将工程的中间文件删除重新打包生成也是可以的

最后5.6将工程所有额外插件关闭,修改引擎的SplashActivity.java文件,中间文件删除,重新打包可以了,说明还是工程插件问题!中间还需要的需要授权的问题,下文有写。

有些时候好像UE有缓存还是怎样,最好在修改完源码重启?具体不清楚。

记得注意下Show launch image是否勾选,没有勾也不会全屏。

结果:

4.UE5.6打包安卓出现permission required you must approve this premission in app settings: storage弹窗

链接: UE5 打包安卓后出现permission required you must approve this premission in app settings: storageg弹单窗

解决办法还是改源码

其实通过源码可以看出来,只有打的包不是发布包或者没有开启用拓展文件夹的情况下,才会申请权限,才会出弹窗。

所以要么打发布包,要么勾选Use ExternalFilesDir for UnrealGame files?,要么注释了那句代码。

4.1 UE5.6打shipping发布包

配置UE的发布配置,然后勾选用于分发,配置好key,勾选Use ExternalFilesDir for UnrealGame files?,应该就不会出弹窗

参考链接: 【UE5】打包的apk为什么总是在启动时申请存储权限?即使是Shipping包


4.2 UE5.6打Development开发包

UE5.6引擎的发布版本去注释那串源代码无效,如果就是想打包测试一下效果,临时打开发包,可以使用adb直接给app权限

c 复制代码
adb shell pm grant <your.package.name> android.permission.WRITE_EXTERNAL_STORAGE

或者创建UPL

参考链接: 虚幻5.6 UPL解决打包安卓卡启动权限请求

视频中的UPL方法我没有测通,放在Build/Android/Java下,最后会运行那个UPL但是语法内容好像不对还是咋这,最后没效果。

我自己寻找到了一个方法,也是写UPL

1--在build.cs中添加如下代码

csharp 复制代码
if (Target.Platform == UnrealTargetPlatform.Android)
		{
			string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath);
			AdditionalPropertiesForReceipt.Add("AndroidPlugin", System.IO.Path.Combine(PluginPath, "ClearStartupPermissions_UPL.xml"));
		}

2--在build.cs同级文件夹下创建ClearStartupPermissions_UPL.xml文件,这个名字对应代码中的名字。

3--ClearStartupPermissions_UPL.xml文件内容为UPL语法代码,如果仅仅是添加元素会报错。所以需要先删除,然后再添加空值(添加这一步可选,不添加也没啥事)。

参考文章链接:
UE----UPL使用文档
虚幻插件语言
UPL for Android

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:android="http://schemas.android.com/apk/res/android">
    <trace enable="true" />
    <androidManifestUpdates>
        <loopElements tag="meta-data">
            <setStringFromAttribute result="ApplicationSectionName" tag="$" name="android:name"/>
            <setBoolIsEqual result="bUseExternalFilesDir" arg1="$S(ApplicationSectionName)" arg2="com.epicgames.unreal.GameActivity.StartupPermissions"/>
            <if condition="bUseExternalFilesDir">
                <true>
                    <removeElement tag="$"/>
                    <log text="移除了com.epicgames.unreal.GameActivity.StartupPermissions"/>
                </true>
            </if>
        </loopElements>
        <addElements tag="application">
            <meta-data android:name="com.epicgames.unreal.GameActivity.StartupPermissions" android:value=""/>
            <log text="添加了com.epicgames.unreal.GameActivity.StartupPermissions"/>
        </addElements>
    </androidManifestUpdates>
    <trace enable="false" />
</root>


最后结果,虽然有点错位

UPL代码中的log一行在第一次打出包的时候会出错,我将中间文件啥都删了,重新打包,就报错,注释完能打包出来,再加回去就好可以显示日志了,我真服了。。。

5.Could not open settings generic class cache for settings file 'C:\Users\xxx...\android\settings.gradle' BUG!

一开始我使用5.6的UE自动工具打包安卓,自动下载sdk,ndk那些。可以打包

转到UE5.4就提示Could not open settings generic class cache for settings file 'C:\Users\xxx...\android\settings.gradle' BUG!

这个是jdk和那些玩意不匹配

5.4自己下载jdk17,然后在UE中指定一下AndroidSDK里的Location of JAVA

我上传的CSDN的下载链接: link

官网下载链接链接: Java Downloads

6.ld.lld: error: undefined symbol: std::__ndk1::__libcpp_verbose_abort(char const*, ...)

打开AndroidStudio重新下载ndk,或者将所有的ndk都卸了,然后用UE的自动化工具下载,防止版本不对。

5.4以上的版本都不用指定AndroidSDK了,如下图。

但是切UE版本打包还是会有问题,因为每个版本需要的sdk不一样。

相关推荐
sugarzhangnotes2 小时前
MySQL 8.0升级中的字符集陷阱与解决方案
android·数据库·mysql
3***g2052 小时前
C盘清理技巧分享了解C盘空间占用情况
android
摘星编程2 小时前
Flutter for OpenHarmony 实战:CustomScrollView 自定义滚动视图详解
android·javascript·flutter
BuHuaX3 小时前
Unity项目怎么接入抖音小游戏?
unity·c#·游戏引擎·wasm·游戏策划
lynn8570_blog3 小时前
关于compose的remember
android·kotlin
毕设源码-邱学长3 小时前
【开题答辩全过程】以 基于安卓的外卖点餐APP的设计与实现为例,包含答辩的问题和答案
android
csj504 小时前
安卓基础之《(16)—内容提供者(2)使用内容组件获取通讯信息》
android
·云扬·4 小时前
ClickHouse常用管理语句汇总:会话、磁盘、性能与复制管理
android·clickhouse