大家好,我叫Jack馮;
本人20年碩士畢業於廣東工業大學,於2020年6月加入37手遊安卓團隊;目前主要負責海外遊戲發行安卓相關開發。
遊戲優化系列一:海外谷歌應用適配相關
遊戲優化系列二:Android Studio製作圖標教程
遊戲優化系列三:Unity遊戲的黑屏問題解決方法
遊戲優化系列一:海外谷歌應用適配相關本文目錄1. 谷歌應用圖標
2. 狀態欄消息推送
3. 系統主題風格
4. 導航鍵
5. 屏幕適配
6. 返回按鈕
遊戲上架谷歌申請推薦時,谷歌會給予一些優化建議。這些建議實際上都是比較不錯的遊戲體驗優化方向。以下根據app上架谷歌應用商店的標準,列舉需要適配的地方並提供了修改樣例。
1. 谷歌應用圖標遊戲icon:
5個不同尺寸的icon,48*48, 72*72, 96*96, 144*144, 192*192
分別放在mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi下面。
推送icon(只能由白色+透明組成):(白底透明字)
5個不同尺寸的icon,24*24, 36*36, 48*48, 72*72, 96*96
分別放在mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi下面。
Android Studio製作icon的教程,詳見《遊戲優化系列二-Android Studio製作圖標教程》
示例:
2. 狀態欄消息推送在遊戲應用中進行版本迭代時,如果遊戲本身有消息推送,且SDK中也有推送的情況下,發送消息的notify方法中,id有可能不同,此時會出現兩條消息(遊戲的和SDK的),有可能會被Google應用商店拒絕推薦。
NotificationManager.notify(int id, Notification notification)出現兩條消息:
需要做到的效果--同一個應用的消息堆疊:
展開後:
修改示例:
private void mergeNotifications(){ int mergeId = 0; String groupKey = "com.android.example.WORK_EMAIL"; String channelId = "1"; Notification notification1 = new NotificationCompat.Builder(MainActivity.this, channelId) .setSmallIcon(R.drawable.ic_launcher_background) .setContentTitle("推送需要堆疊") .setContentText("這是一條SDK的通知") .setGroup(groupKey) .build();
Notification notification2 = new NotificationCompat.Builder(MainActivity.this, channelId) .setSmallIcon(R.drawable.ic_launcher_background) .setContentTitle("推送需要堆疊") .setContentText("這是一條遊戲的通知") .setSmallIcon(R.drawable.ic_stat_name) .setGroup(groupKey) .build();
Notification mergeNotification = new NotificationCompat.Builder(MainActivity.this, channelId) .setContentTitle("推送需要堆疊") .setContentText("2條未讀信息") .setSmallIcon(R.drawable.ic_stat_name) .setStyle(new NotificationCompat.InboxStyle() .addLine("這是一條遊戲的通知") .addLine("這是一條SDK的通知") .setBigContentTitle("2條未讀信息") .setSummaryText("推送測試")) .setGroup(groupKey) .setGroupSummary(true) .build();
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(1, notification1); notificationManager.notify(2, notification2); notificationManager.notify(mergeId, mergeNotification);}3. 系統主題風格
在應用裡面彈出的Dialog、Loading框,需要適配系統風格!
例如在5.0以上的系統,出現這種風格是不行的:
這種風格才是符合要求的:
如果這些Dialog、Loading框不是使用系統風格,而是自行設計,則可以繼續使用,不必進行額外處理;例如:
具體實現方法有兩種:
第一種,在Androidmanifest的application和activity標籤下,不要設定android:theme,即可適配系統風格。
修改示例1:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.game37.themeapplication"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true"> <activity android:name=".MainActivity" android:screenOrientation="sensorLandscape"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity></application></manifest>
示例效果1:
第二種,可保留android:theme,但需要引用Google庫工程appcompat_v7,使用系統自帶主題或者自定義主題。其中,在自定義的style裡面,繼承Theme.AppCompat(還有很多子風格可以選擇,如Theme.AppCompat.Light和Theme.AppCompat.NoActionBar等)。
修改示例2:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.game37.themeapplication"> <application ... android:theme="@style/Theme.AppCompat"> <activity android:name=".MainActivity" android:screenOrientation="sensorLandscape" //使用自定義主題 android:theme="@style/testStyle"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
<activity //使用系統自帶主題 android:name=".MainActivity2" android:theme="@style/Theme.AppCompat.NoActionBar" /> </application></manifest>其中,自定義主題樣式如下:(設置全屏、背景色等)
<style name="testStyle" parent="Theme.AppCompat"> <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item> <item name="android:windowActionBarOverlay">true</item> <item name="android:windowBackground">@null</item></style>
<style name="FullscreenActionBarStyle" parent="Widget.AppCompat.ActionBar"> <item name="android:background">@color/colorAccent</item></style>
示例效果2:
在Androidmanifest的相關android:theme設置上述繼承Theme.AppCompat風格的主題即可。
【常見問題】遊戲工程接入SDK的過程中,如果主Activity繼承的是androidx.appcompat.app.AppCompatActivity,需要使用Theme.AppCompat類主題,因此建議遊戲工程的主題設置不留空,即採用第二種方式設定相關主題!
【注意】如果修改主題後,輸入框等顯示異常(eg:角色的名稱輸入框,背景白色、字體白色,會影響玩家體驗),可使用推薦主題來修復android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
4.導航鍵系統導航鍵不能擋住功能,最好能夠使用IMMERSIVE_STICKY模式(即完全全屏,通知欄和導航鍵都自動隱藏,需要API-19以上支持)。
覆蓋功能情景:
修改示例:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
修改效果:
5. 屏幕適配
(1)屏幕方向
在某些應用程式中偶爾會出現180度左右的倒掛現象。為了獲得更好的用戶體驗,我們建議您保持總體方向與原始方向一致。
由於某些橫屏的遊戲,可以根據重力自動轉換屏幕(轉換後還是橫屏,只是方向不同),所以修改androidmanifest中Activity屬性,android:screenOrientation設置為sensorLandscape即可。
(2)適配多種屏幕
在androidmanifest加入下面配置
<supports-screens android:anyDensity="true" android:largeScreens="true" android:xlargeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" />6.返回按鈕
返回按鈕需具有返回功能,應具有返回上一級內容、取消當前處理中的事務、退出遊戲等作用。
返回鍵功能的官方解釋:
1.具有與屏幕上任何後退或關閉按鈕相同的功能
2.暫停和取消暫停遊戲(如果適用)
3.關閉所有對話框窗口
4.導航到菜單堆棧中的上一個位置(如果適用)
5.第一次登錄時,在主菜單中按下退出應用程式,在伺服器選擇和字符選擇頁面中,Android後退按鈕出現錯誤行為。
具體情境:
(1)在遊戲啟動、資源加載過程,點擊系統返回按鈕要求能夠後退,或者彈框提示用戶是否退出遊戲;(部分應用在這過程屏蔽了系統按鈕,出現被谷歌應用商店拒絕的情況)
(2)活動彈窗顯示時,點擊返回系統按鈕要求能夠關閉彈窗。
示例說明:點擊返回按鈕無法關閉彈窗
遊戲優化系列二:Android Studio製作圖標教程本文目錄
1、 關於Image Asset Studio
背景
2、 自適應和舊版啟動器圖標
3、 操作欄和標籤頁圖標
4、通知圖標谷歌在Android8.0後就推出了圓形圖標,並在AndroidStudio中提供了製作工具。那麼如果不製作圓形工具會怎麼樣?在部分設備上圖標會出現適配問題,UI上不美觀。本文將介紹Image Asset Studio工具的使用,介紹如何製作圓形圖標
1、關於Image Asset StudioAndroid Studio 包含一個名為 Image Asset Studio 的工具,可幫助您根據素材圖標、自定義圖片和文本字符串生成自己的應用圖標。它會針對您的應用支持的每種像素密度以適當的解析度生成一組圖標。Image Asset Studio 會將新生成的圖標放置在項目中 res/ 目錄下的特定於密度的文件夾中。在運行時,Android 將根據運行應用的設備的屏幕密度來使用適當的資源。
Image Asset Studio 可幫助您生成以下圖標類型:
運行 Image Asset Studio如需啟動 Image Asset Studio,請按以下步驟操作:
2、自適應和舊版啟動器圖標
打開 Image Asset Studio 後,您可以按照以下步驟添加自適應和舊版圖標:
(1)在 Icon Type 欄位中,選擇 Launcher Icons (Adaptive & Legacy)。
(2)在 Foreground Layer 標籤頁的 Asset Type 中選擇一種資源類型,然後在下面的欄位中指定資源:
(3)在 Background Layer 標籤的 Asset Type 中選擇一種資源類型,然後在下面的欄位中指定資源。您可以選擇一種顏色或指定一張圖片作為背景圖層。
(4)在 Legacy 標籤頁中,查看默認設置並確認您要生成舊版、圓形和 Google Play 商店中使用的圖標。
(5)(可選)在 Foreground Layer 和 Background Layer 標籤頁中更改每個圖標的名稱和顯示設置:
Name - 如果您不想使用默認名稱,請輸入新名稱。如果項目中已存在該資源名稱(由嚮導底部的錯誤來指示),它將被覆蓋。名稱只能包含小寫字符、下劃線和數字。
Trim - 要調整源資源中圖標圖形與邊框之間的邊距,請選擇 Yes。此操作將移除透明空間,同時讓寬高比保持不變。要讓源資源保持不變,請選擇 No。
Color - 要更改 Clip Art 或 Text 圖標的顏色,請點擊該欄位。在 Select Color 對話框中,指定一種顏色,然後點擊 Choose。該欄位中會顯示新值。
Resize - 使用滑塊指定縮放係數(以百分比表示)以調整 Image、Clip Art 或 Text 圖標的大小。指定 Color 資源類型時,會為背景圖層停用此控制項。
(6)點擊 Next。
(7)(可選)更改資源目錄。選擇想在其中添加圖片資源的資源原始碼集:src/main/res、src/debug/res、src/release/res 或自定義原始碼集。主源集適用於所有構建變體,包括調試和發布。調試和發布原始碼集將替換主原始碼集,並適用於構建的一個版本。調試源集僅用於調試。要定義新源集,請依次選擇 File > Project Structure > app > Build Types。例如,您可以定義一個測試版源集,並創建一個版本的圖標,在其右下角顯示「BETA」文本。如需了解詳情,請參閱配置構建變體。
(8)點擊 Finish。Image Asset Studio 會針對不同的密度將圖片添加到 mipmap 文件夾。
示例1:
最後生成素材:
效果:
3. 操作欄和標籤頁圖標
打開 Image Asset Studio 後,您可以按照以下步驟添加操作欄或標籤頁圖標:
(1)在 Icon Type 欄位中,選擇 Action Bar and Tab Icons。
(2)在 Asset Type 中選擇一種資源類型,然後在下面的欄位中指定資源:
在 Clip Art 欄位中,點擊相應按鈕。
在 Select Icon 對話框中,選擇一個素材圖標,然後點擊 OK。
在 Path 欄位中,指定圖片的路徑和文件名。點擊 ... 以使用對話框。
在 Text 欄位中,輸入文本字符串並選擇字體。圖標會顯示在右側的 Source Asset 區域以及嚮導底部的預覽區域中。
(3)(可選)更改名稱和顯示選項:
Name - 如果您不想使用默認名稱,請輸入新名稱。如果項目中已存在該資源名稱(由嚮導底部的錯誤來指示),它將被覆蓋。名稱只能包含小寫字符、下劃線和數字。
Trim - 要調整源資源中圖標圖形與邊框之間的邊距,請選擇 Yes。此操作將移除透明空間,同時讓寬高比保持不變。要讓源資源保持不變,請選擇 No。
Padding - 如果要調整全部四面的源資源內邊距,請移動滑塊。選擇一個介於 -10% 和 50% 之間的值。如果也選擇了 Trim,則先進行剪裁。
Theme - 選擇 HOLO_LIGHT 或 HOLO_DARK。或者,如需在 Select Color 對話框中指定顏色,請選擇 CUSTOM,然後點擊 Custom color 欄位。Image Asset Studio 會在透明的正方形內創建圖標,所以邊緣上有一些內邊距。內邊距為標準的陰影圖標效果提供了充足的空間。
(4)點擊 Next。
(5)(可選)更改資源目錄:Res Directory - 選擇想在其中添加圖片資源的資源原始碼集:src/main/res、src/debug/res、src/release/res 或用戶定義的原始碼集。主源集適用於所有構建變體,包括調試和發布。調試和發布源集將替換主源集,並應用於構建的一個版本。調試源集僅用於調試。要定義新源集,請依次選擇 File > Project Structure > app > Build Types。例如,您可以定義一個 Beta 版源集,並創建一個版本的圖標,使其右下角包含文本「BETA」。如需了解詳情,請參閱配置構建變體。Output Directories 區域會顯示圖片以及它們將出現在 Project 窗口的「項目文件」視圖中的哪些文件夾中。
(6)點擊 Finish。Image Asset Studio 會針對不同的密度將圖片添加到 drawable 文件夾。
4、通知圖標通知是您可以在應用的正常界面之外向用戶顯示的消息。Image Asset Studio 會將通知圖標放置在 res/drawable-density/ 目錄中的適當位置:
對於 Android 2.2(API 級別 8)及更低版本,會將圖標放置在 res/drawable-density/ 目錄中。
對於 Android 2.3 到 2.3.7(API 級別 9 到 10),會將圖標放置在 res/drawable-density-v9/ 目錄中。
對於 Android 3(API 級別 11)及更高版本,會將圖標放置在 res/drawable-density-v11/ 目錄中。
如果您的應用支持 Android 2.3 到 2.3.7(API 級別 9 到 10),Image Asset Studio 會生成灰色版本的圖標。更高版本的 Android 使用 Image Asset Studio 生成的白色圖標。
5、製作流程打開 Image Asset Studio 後,您可以按照以下步驟添加通知圖標:
(1)在 Icon Type 欄位中,選擇 Notification Icons。(2)在 Asset Type 中選擇一種資源類型,然後在下面的欄位中指定資源:
在 Clip Art 欄位中,點擊相應按鈕。
在 Select Icon 對話框中,選擇一個素材圖標,然後點擊 OK。
在 Path 欄位中,指定圖片的路徑和文件名。點擊 ... 以使用對話框。
在 Text 欄位中,輸入文本字符串並選擇字體。圖標會顯示在右側的 Source Asset 區域以及嚮導底部的預覽區域中。
(3)(可選)更改名稱和顯示選項:
Name - 如果您不想使用默認名稱,請輸入新名稱。如果項目中已存在該資源名稱(由嚮導底部的錯誤來指示),它將被覆蓋。名稱只能包含小寫字符、下劃線和數字。
Trim - 要調整源資源中圖標圖形與邊框之間的邊距,請選擇 Yes。此操作將移除透明空間,同時讓寬高比保持不變。要讓源資源保持不變,請選擇 No。
Padding - 如果要調整全部四面的源資源內邊距,請移動滑塊。選擇一個介於 -10% 和 50% 之間的值。如果也選擇了 Trim,則先進行剪裁。
Image Asset Studio 會在透明的正方形內創建圖標,所以邊緣上有一些內邊距。內邊距為標準的陰影圖標效果提供了充足的空間。
(4)點擊 Next。
(5)(可選)更改資源目錄:
Output Directories 區域會顯示圖片以及它們將出現在 Project 窗口的「項目文件」視圖中的哪些文件夾中。
(6)點擊 Finish。Image Asset Studio 會針對不同的密度和版本將圖片添加到 drawable 文件夾。
示例1:在 Clip Art 欄位中選擇一個圖標
效果1:
示例2:在 Text 欄位中,輸入字符「 37 」
效果2:
示例3:在 Path 欄位中,指定圖片的路徑和文件名
效果3:
遊戲優化系列三:Unity遊戲的黑屏問題解決方法本文目錄
一、背景
一、背景
二、分析及解決
1、生命周期分析
(1)黑屏情況
(2)解決方法
(3)正常顯示
2、涉及方法解析
(1)onWindowFocusChanged (boolean hasFocus)
(2)Android生命周期
(3)對比Android原生工程
(4)unity腳本生命周期
(5)分析腳本生命周期
三、結論在Unity遊戲工程中,經常遇到這樣的問題:打開登錄彈框時,點擊Home鍵先處理其他事宜再返回,發現屏幕黑屏;或者打開了其他接受輸入焦點的對話框或彈出窗口,點擊返回鍵時發生屏幕黑屏,需要觸控螢幕幕(獲得焦點)才能正常顯示。
具體情形見下圖:
1、黑屏情況(UnityDemo):2、 正常顯示(UnityDemo):
二、分析及解決1、生命周期分析(1)黑屏情況(UnityDemo):其中,生命周期順序如下:
- 打開頁面:onCreate--onStart--onResume--onWindowFocusChanged:true
- 點擊登錄:--onWindowFocusChanged:false
- 點擊Home返回:--onPause
- 重新進入:--onRestart--onStart--onNewIntent--onResume--onWindowFocusChanged:false(此時app頁面出現黑屏)
(2)解決方法在遊戲主活動UnityPlayerActivity中,重寫onStart()方法,添加獲取焦點的方法,可避免黑屏。
@Override protected void onStart() { super.onStart(); this.mUnityPlayer.resume(); onWindowFocusChanged(true); }(3)正常顯示(UnityDemo):其中,生命周期順序如下:
- 打開頁面:onCreate--onStart--onWindowFocusChanged:true--onResume--onWindowFocusChanged:true
- 點擊登錄:--onWindowFocusChanged:false
- 點擊Home返回:--onPause
- 重新進入:--onRestart--onStart--onWindowFocusChanged:ture--onNewIntent--onResume(此時app頁面正常顯示)
由上可見,二者生命周期的異同在於,是否在調用onStart後調用一次onWindowFocusChanged:true,來獲取當前窗口的焦點,實現正常交互。
2、涉及方法解析(1)onWindowFocusChanged (boolean hasFocus)當activity的當前窗口獲得或失去焦點時調用,hasFocus == true表示當前窗口獲得焦點,false則表示失去焦點。用法:
onWindowFocusChanged (true);
- eg:打開頁面,當前activity處於活動棧最上層的活動,獲得焦點--onWindowFocusChanged:ture;
- 點擊登錄,彈框覆蓋在原activity的上層,原activity失去焦點 --onWindowFocusChanged:false;(不僅限彈框,還可以是其他獲取焦點的頁面)
- 此後點擊Home鍵、再返回app,原activity仍然是失去焦點的狀態(如果沒有手動重新獲取焦點),當前頁面顯示黑屏。
注意onWindowFocusChanged方法提供了有關全局焦點狀態的信息,該狀態獨立於活動生命周期進行管理。因此,雖然焦點更改通常與生命周期更改有某種關係(停止的活動通常不會獲得窗口焦點),但您不應依賴此處回調與其他生命周期方法(如onResume()中的回調)之間的特定順序。
但是,一般來說,前臺活動具有窗口焦點。除非它顯示了其他接受輸入焦點的對話框或彈出窗口,在這種情況下,當其他窗口有焦點時,活動本身就沒有焦點。同樣,系統可能會顯示系統級窗口(例如狀態欄通知面板或系統警報),這些窗口將暫時獲得窗口輸入焦點,而不會暫停前臺活動。
從Android Q開始,在多窗口模式下,可以同時有多個恢復的活動,因此即使上面沒有覆蓋,恢復狀態也不能保證窗口焦點。如果目的是要知道一個活動何時是最活躍的,即用戶在所有活動中與之交互的最後一個活動,但不包括非活動窗口(如對話框和彈出窗口),則應使用OnTopheMedActivityChanged(Boolean value)。
(2)生命周期方法簡析
- onCreate (Bundle savedInstanceState):活動創建時調用一次,用於初始化當前活動數據和綁定頁面的組件等。參數Bundle:如果活動在關閉後重新初始化,此參數則包含其最近一次調用 onSaveInstanceState(Bundle)存儲的數據。
- onStart ():在活動創建方法onCreate(Bundle)或重新啟動方法onRestart()之後調用,開始繪製視圖、動畫等,呈現給用戶,其後一般調用onResume()。(可視化狀態)
- onResume ():在onRestoreInstanceState()、onRestart()或onPause()之後調用,當前活動位於活動棧的頂部,即將開始與用戶進行交互、準備好接收輸入事件。(還不能響應輸入事件)
- onPause ():活動仍在屏幕上可見,但用戶不再與其交互時進行調用,eg:彈框等頁面覆蓋了當前活動時。
- onStop ():當活動在屏幕上不可見時調用,eg:點擊home鍵返回桌面
- onRestart ():在 onStop ()方法後,重新打開原activity時調用,其後一般調用onStart ()和onResume ()
- onDestroy ():在銷毀活動之前執行任何最後的清理時調用。一般是活動即將結束(調用 finish()),或系統暫時銷毀了此活動實例以節省空間
(3)對比Android原生工程圖為原生工程的AndroidDemo。對比UnityDemo,生命周期方法執行雖一致、焦點丟失情況則不相同。
為了進一步對比,下面引入unity腳本的常見生命周期方法。
(4)unity腳本生命周期unity腳本的常見生命周期方法如下:
-- Awake:始終在任何 Start 函數之前並在實例化組件之後調用此函數。(如果遊戲對象在啟動期間處於非活動狀態,則在激活之後才會調用 Awake。) -- OnEnable:(僅在對象處於激活狀態時調用)在啟用對象後立即調用此函數。在創建 MonoBehaviour 實例時(例如加載關卡或實例化具有腳本組件的遊戲對象時)會執行此調用。-- OnLevelWasLoaded:場景全部加載完成後 -- Start:僅當啟用腳本實例後,才會在第一次幀更新之前調用 Start。
-- FixedUpdate:調用 FixedUpdate 的頻度常常超過 Update。如果幀率很低,可以每幀調用該函數多次;如果幀率很高,可能在幀之間完全不調用該函數。-- Update:每幀調用一次 Update。這是用於幀更新的主要函數。-- LateUpdate:每幀調用一次 LateUpdate(在 Update 完成後)。-- OnGUI:每幀調用多次以響應 GUI 事件。首先處理布局和重新繪製事件,然後為每個輸入事件處理布局和鍵盤/滑鼠事件。
-- OnApplicationPause:一幀最後時調用,調用後會再觸發一幀以刷新圖像和切換暫停狀態 -- OnApplicationQuit:在退出應用程式之前在所有遊戲對象上調用此函數。在編輯器中,用戶停止播放模式時,調用函數。
-- OnDisable:行為被禁用或處於非活動狀態時,調用此函數。-- OnDestroy:對象存在的最後一幀完成所有幀更新之後,調用此函數(可能應 Object.Destroy 要求或在場景關閉時銷毀該對象)。
(5)分析腳本生命周期這裡將生命周期方法在UnityDemo中列印出來,主要對比黑屏情況下的生命周期情況。
具體日誌如下:
//android生命周期E/UnityPlayerActivity: onCreateE/UnityPlayerActivity: onStartE/UnityPlayerActivity: onResumeE/UnityPlayerActivity: onWindowFocusChanged:true
//unity腳本生命周期I/Unity: UnityPlayerActivity Awake...I/Unity: UnityPlayerActivity OnApplicationPause:FalseI/Unity: UnityPlayerActivity OnApplicationFocus:TrueI/Unity: UnityPlayerActivity start
//點擊home鍵E/UnityPlayerActivity: onWindowFocusChanged:falseI/Unity: UnityPlayerActivity OnApplicationFocus:False
E/UnityPlayerActivity: onPauseI/Unity: UnityPlayerActivity OnApplicationPause:True...
//再次返回appE/UnityPlayerActivity: onRestartE/UnityPlayerActivity: onStartE/UnityPlayerActivity: onResume
//***注意***,這裡unity腳本生命周期方法並沒有繼續執行!三、總結綜合分析,從桌面返回遊戲App時,由於unity丟失焦點(I/Unity: UnityPlayerActivity OnApplicationFocus:False ),腳本沒有執行,即無法渲染遊戲畫面對象,致使黑屏。
如果根據第二點添加獲取焦點方法後,由下圖可以看到繼續執行的unity腳本生命周期方法,先獲取到焦點、中止pause狀態並繪製頁面進行正常顯示。即工程重新獲取焦點後才會繪製圖像。
I/Unity: UnityPlayerActivity OnApplicationFocus:True
I/Unity: UnityPlayerActivity OnApplicationPause:False來源:37遊戲 工程師 Jack馮