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不一样。
