Unity手機遊戲商業化優化系列!

2021-02-15 遊戲蠻牛
作者

大家好,我叫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 Studio

Android 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馮

相關焦點

  • Unity中的一些優化建議
    3)引用一個遊戲對象的邏輯,可以在最開始的地方定義它。6)在遊戲暫停、場景切換時,可以主動進行垃圾回收,從而及時去除遊戲中已經無用的內存佔用。1void Update()2if(Time.frameCount%50==0)3{4  System.Gc.Collection();5}7)優化數學計算。
  • Render- 關於Unity渲染方面的優化(下)
    如果我們的遊戲受到填充率的限制,那麼說明我們的遊戲每一幀輸出到屏幕的像素數量超過了GPU的承載限度。要檢查是否是 填充率 導致的GPU瓶頸方式很簡單,運行遊戲,在Profiler窗口觀察GPU的效率減小Game窗口的尺寸達到降低窗口解析度的效果再運行遊戲,觀察GPU的效率,如果遊戲的表現提升了,那麼很可能就是填充率導致的問題。
  • 淺談Unity中的優化(三)——Unity優化之相機優化
    同時大家有更好的優化方案,或者自己獨立見解的優化想法,也請發相關郵件於我,我將持續更新這篇文章,努力將「淺談」轉變為「深入」! ----原創 程式設計師茶館5.3.1-Occlusion Culling遮擋剔除unity 中的剔除包括兩種,一種是視角剔除,凡是不在攝像機視野內的物體,不進行渲染,第二種就是遮擋剔除,被擋住的物體不被渲染,即使它在相機視野內,兩種方法可以共存
  • 程序丨直播課程:Unity移動遊戲優化利器UPA
    性能優化是移動遊戲開發中一個永恆的話題,Unity和騰訊遊戲旗下的質量開放平臺WeTest在此領域深有積累,在11月的時候,二家團隊發布了針對使用
  • 有史以來最快的Unity編輯器版本,Unity 2020.2 中的性能優化
    在兩年前,我們大膽地組成了一支專門的Optimization Team優化團隊,將性能作為單獨的類別進行優化。Unity 2020.2有幾項全新的優化功能已在beta中開放測試,本文將介紹2020.2中的新進展以及團隊的努力,完整的改進請查看Unity 2020.2 beta發布說明。
  • Unity5.3官方VR教程[系列1]
    本教程主要針對Oculus系列的VR設備,特別是Oculus Rift Development Kit 2(DK2)和消費者版本的Samsung Gear VR(需要配合三星旗艦手機系列使用,如Galaxy S6, S6 Edge
  • 4月18日 第三屆「遊戲蠻牛杯」Unity開發者大賽頒獎盛典
    亞太區技術總監郭振平講解《暢想下一個VR遊戲藍圖》嘉賓頒發大賽三等獎並播放片花現場抽取神秘大獎環節蟻視科技負責人李金龍講解《虛擬眼鏡在VR遊戲中的應用》嘉賓頒發大賽二等獎並播放片花現場抽取神秘大獎環節雲立方信息科技負責人戴鵬講解《裸眼3D手機在遊戲中的未來》頒發大賽一等獎以及最佳創意獎現場抽取神秘大獎環節
  • Unity引擎後處理性能優化方案解析
    本文將介紹一個能通用的後處理性能優化方案。改用PrePost方法後,從60FPS掉到55FPS左右,改善明顯(用中低端手機測試效果明顯些,我們是用的360手機。不同手機改善的程度略有差異,但是還是能看到至少幾幀的提升)。相信這個優化方案,有不少同學之前已經看到過並已經在使用。這個方案略有麻煩的一點是,當我們的Camera開啟MSAA或者HDR的時候,會導致後處理不起效果。
  • 【新教學上架】Unity遊戲特效案例系列教學
    Unity遊戲特效案例系列教學本教學由TAK老師錄製,通過四個有代表性的案例,教授作者行業多年的遊戲特效製作流程和經驗
  • 【VR遊戲開發乾貨】Unity5.3官方VR教程重磅登場-系列1
    本教程主要針對Oculus系列的VR設備,特別是Oculus Rift Development Kit 2(DK2)和消費者版本的Samsung Gear VR(需要配合三星旗艦手機系列使用,如Galaxy S6,
  • 淺談Unity中的優化(二)--初識Unity-Statistics
    同時大家有更好的優化方案,或者自己獨立見解的優化想法,也請發相關郵件於我,我將持續更新這篇文章,努力將「淺談」轉變為「深入」!        如果你是一名U3D開發新手,或者對此功能非常不熟悉,那麼你可能會在遊戲優化過程中遇到很多麻煩
  • 【教程】unity遊戲修改so文件
    2)函數體比較長的不做inline優化,只有比較簡單的才可能inline優化。(有人說IL不足32位元組才做inline),2)編譯成機器碼時,inline展開的代碼比函數調用更短的,一定做inline。(注:如果參數多而代碼少,就符合此情況)這裡為什麼要講內聯函數呢,加入如果遊戲中有一個讀取人物攻擊力的函數,其內部代碼十分簡單,結果被編譯為機器碼的時候變為了內聯函數。
  • Unity實現《使命召喚》破碎系統!
    一些優化方案:1.編輯器裡做預先切割,然後在prefab裡序列號碎片的運動軌跡(可以根據性能測試保存一定時間間隔的數據,然後遊戲內進行插值還原表現)這樣遊戲內就不用開啟真實的物理。4.多線程物理降低bake消耗5.SIMD優化算法性能總結:以上簡單介紹了動態破碎在unity中的實現,可以看到這種方案其實有很多局限性,主要包括:1.物理性能不好解決,雖然可以利用預先烘焙的方式來減少消耗,但同時又失去了遊戲中實時破壞的重要表現。
  • Unity全面優化
    Static Batching 靜態批處理場景中有很多遊戲對象,其中靜態對象(Inspector勾選Static的)可以通過靜態批處理來優化DrawCall。比如,幾乎unity中所有的著色器在前向渲染中都支持多個光源,並為它們有效地開闢多個通道。預設體的實例會自動地使用相同的網格模型和材質。所以動態批處理還是約束蠻多的,儘量使用靜態批處理。
  • Unity UI性能優化技巧
    更多優化技巧,可以觀看下方的視頻,內容是Unity工程師Ian Dundore在Unite Europe 2017的演講《使用Unity性能提升技巧》。問題:UI Canvas上有一個或多個元素變化時,會汙染整個畫布。畫布(Canvas)是Unity UI的基本組件。
  • Unity移動平臺下的烘焙使用及優化
    前言移動平臺下場景製作的規模越來越大,開放視角的3D大世界場景,對地圖大小、可視距離的要求越來越高,隨之帶來了地形尺寸變大、場景物件種類變多、物件的模型面數和數量增長,對美術效果上的要求也趨近於主機和PC端遊戲。
  • 淺談Unity中的優化(三)——Unity優化之UGUI優化
    同時大家有更好的優化方案,或者自己獨立見解的優化想法,也請發相關郵件於我,我將持續更新這篇文章,努力將「淺談」轉變為「深入」!18328685848@163.com ----轉載收集整合 小小Unity章節五點四《5.4-UnityUGUI優化
  • 【VR/AR】Unity索尼VR頭顯優化經驗
    unity支持vr的方式有兩種,首先是以插件的方式加入unity,由第三方硬體廠家提供相應的SDK,這種方式左右眼需要雙倍的CPU
  • 一鍵把Unity遊戲打包上架到Facebook小遊戲平臺
    全屏顯示把unity-container的class改成unity-mobile,這樣Unity遊戲會自動全屏,而且不顯示額外的按鈕和標題欄。可以用代碼修改,示例是用代碼修改的。 container.className = "unity-mobile"; config.devicePixelRatio = 1;也可以直接去修改unity-container的class:<div id="unity-container
  • Unity+模型/動畫的優化方案
    導入網格設置<圖一,預設的網格設置>【選項釋義】[Meshes]ScaleFactor:為了補償unity和其它三維建模軟體間的單位差異,沒有特殊需求的話設為1就可以了。MeshCompression:網格壓縮,親測質量差距比較大,不太建議開啟。