【UE4】新買(mǎi)的紅米K50和一加Ace Pro安裝UE4打包的程序,居然沒(méi)法全屏
問(wèn)題描述:
最近新買(mǎi)了RedMi K50和一加Ace Pro兩臺(tái)機(jī)器,一臺(tái)是Android13,一臺(tái)是Android12。以前UE4.26打包的程序,不論是劉海屏還是挖孔屏,都是可以全屏的。但安裝到這兩臺(tái)機(jī)器上竟然不能全屏。正好是劉海和挖孔的位置被留了出來(lái)。
UE中如何全屏Android應(yīng)用
在UE4/UE5中,Android應(yīng)用的全屏需要設(shè)置兩個(gè)位置,如下圖中紅框部分。
第一, 最大寬高比默認(rèn)是2.1,隨著市場(chǎng)上屏幕越來(lái)越多,該值可能要放大,例如我就設(shè)置為了2.3.
第二,勾選是否使用cutout。通俗點(diǎn)講,就是你的APP是否要使用劉?;蛘咄诳椎牟糠帧?/p>
設(shè)置完成之后在A(yíng)ndroid的Manifest文件中會(huì)生成下面兩項(xiàng):
不出意外的話(huà),你的App可以全屏了。
出現(xiàn)問(wèn)題的原因
通過(guò)測(cè)試發(fā)現(xiàn),相同的手機(jī),用UE4.26和UE5打包結(jié)果完全不同。UE5不會(huì)有任何問(wèn)題。但UE4.26在文中提到的兩部手機(jī)就不會(huì)全屏顯示了。
既然通過(guò)ProjectSetting修改的是上面提到的兩項(xiàng)Manifest配置。那我們就打開(kāi)Android Studio工程看看。差異是什么。
通過(guò)查看Android Studio工程代碼,可以看到,是否使用劉海就在于下面這幾行代碼
所以,只要UseDisplayCutout為true,應(yīng)該不會(huì)出問(wèn)題吧?那就去找找該值在哪里設(shè)置的。
通過(guò)翻查代碼,該值有兩個(gè)地方設(shè)置
如果有閃屏界面,是通過(guò)閃屏界面?zhèn)鬟f給GameActivity
如果沒(méi)有閃屏界面,該值是直接從Manifest獲取的
那閃屏界面又是從哪里獲取的呢?截取部分閃屏界面代碼,可以看到同樣是從Manifest獲取的。并且還加了一些手機(jī)型號(hào)的判斷,進(jìn)而最終確認(rèn)。
這段代碼UE4和UE5是有區(qū)別的。UE5默認(rèn)值是通過(guò)boolean BlockDisplayCutout = android.os.Build.VERSION.SDK_INT < 30;判斷,但UE4是默認(rèn)為true,后面再通過(guò)手機(jī)型號(hào)判斷是否需要忽略Cutout的配置。
從代碼中可以看到,閃屏同樣會(huì)設(shè)置是否使用劉海后者挖孔。
兩種解決方法
如果你的項(xiàng)目就是UE4開(kāi)發(fā)的,并且不想升級(jí)到UE5。畢竟升級(jí)是有代價(jià)和風(fēng)險(xiǎn)的。那么可以嘗試這兩種方法。
通過(guò)UPL修改為全屏
通過(guò)修改閃屏界面代碼
1. 通過(guò)UPL修改
這種方式需要你對(duì)UPL了解,前面提到一個(gè)教程會(huì)告訴你如何在UE4、UE5中進(jìn)行Android開(kāi)發(fā)。
前面提到了全屏關(guān)鍵的幾行代碼,我們只需要在UPL里將那幾行代碼插入即可。但只能修改GameActivity,閃屏界面還是不能全屏,所以在項(xiàng)目設(shè)置里取消顯示閃屏界面。自己開(kāi)發(fā)一個(gè)閃屏界面。
然后在UPL文件中插入以下代碼,將java代碼插入到GameActivity的OnCreate中。這樣游戲界面就可以全屏了。
這種方法有個(gè)缺陷,就是前面提到的閃屏界面需要特殊處理。(如果你會(huì)接入SDK,那這也不是個(gè)事)
2. 通過(guò)修改閃屏代碼
這種方法比較直接和粗暴,但效果甚好。UE4、UE5打包Android生成了這么多代碼,總有地方去修改這些代碼吧。找到他們不就好了。

不論是GameApplication也好,GameActivity也好。還是SplashActivity。他們都是在UBT的時(shí)候生成。在UBT里有一份Android打包的代碼UEBuildAndroid.cs、UEDeployAndroid.cs有興趣可以去翻翻。
這里直接說(shuō)結(jié)果,Engine\Build\Android\Java\src\com\epicgames\ue4到這里取找SplashActivity可以看到,就是完整的代碼,并不是模板。那我們將該代碼中關(guān)于是否忽略UseDisplayCutout的代碼修改成與UE5一樣就可以了。boolean BlockDisplayCutout = android.os.Build.VERSION.SDK_INT < 30;

這種方法修改了引擎原本的內(nèi)容,一定要記好。不然更新或升級(jí)的時(shí)候出Bug就不好了。
重新打包試試,問(wèn)題完美解決。