close
我的環境配置:Windows 10、Unity 5.5.2f1、Java JDK 1.8.0_121、Android Studio 2.2.3。
在上個章節 在 Unity 裡加入 Android 的本地端推播 (LocalNotification) 我們已經說明了如何加入 本地端推播(LocalNotification)。
其中內容包含了推播的時間、內容、圖示,以及新增移除等方法。
最後點擊推播訊息後,手機會自動開啟對應的 App,或者回到 App 中。
現在我們要來講解,如何在進入 App 之後,可以直接導向我們指定的場景!
例如:
點擊體力恢復完成的推播訊息可以回到 App 的戰鬥場景,繼續戰鬥。
點擊每日登入獎勵的推播訊息可以回到 App 的獎勵領取場景。
在文章最下方有範例可以下載,歡迎直接下載測試或者直接使用裡面的程式碼。
重頭建立流程如下:
步驟一、
先建立一個可正常 本地端推播(LocalNotification) 的 App。
步驟二、
PS : 以下是我個人習慣。
打開專案後,將目錄顯示方式更換為 Project
步驟三、
下載好的範例原本的理念是使用 函數(static function),並且當作工具來做使用。
但我們現在需要接收推播訊息所帶的 Intent,所以我們必須建立自己的 UnityPlayerActivity 來取代預設的 UnityPlayerActivity。
在 Test > app > src > main > java > com.test.tw.test 上按下滑鼠右鍵,選擇 New > Java Class
![image02.jpg image02.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664105-2176726092_n.jpg)
建立我們自己的 UnityPlayerActivity,這裡我取名為 "MyActivity"
![image03.jpg image03.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664105-3011711662.jpg)
步驟四、
讓 "MyActivity" 繼承 UnityPlayerActivity,並且覆寫 onNewIntent 與 onResume 兩個 方法(Method)
package com.test.tw.test; import android.content.Intent; import android.os.Bundle; import android.util.Log; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; public class MyActivity extends UnityPlayerActivity { @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); } @Override protected void onResume() { super.onResume(); } }
onNewIntent : 每當有新的 Intent 被 App 所接收時,都會回呼該 方法(Method)。
onResume : 每當 App 要重新啟動後,都會回呼該 方法(Method)。
onResume : 每當 App 要重新啟動後,都會回呼該 方法(Method)。
我們覆寫這兩個 方法(Method) 目的是為了刷新推播傳遞的 Intent,所以我們必須建立自己的 UnityPlayerActivity,好讓透過推播開啟 App 的使用者,都可以導向對應的場景。
步驟五、
現在我們來補上 onNewIntent 與 onResume 的程式碼
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 將 Intent 設定為推播訊息所傳遞的 Intent setIntent(intent); } @Override protected void onResume() { super.onResume(); // 取得推播訊息的 Intent Intent intent = getIntent(); String sceneID = "0"; // 這邊需要檢查推播所夾帶的 Intent 以及裡面的參數是否為我們設定的切換場景推播訊息, // 畢竟 Intent 這麼多, 到處傳來傳去的, 如果每個 Intent 都硬要解析, 可能會導致程式崩潰. if (intent != null) { Bundle b = intent.getExtras(); if (b != null) sceneID = String.valueOf(b.getInt("scene", 0)); // 呼叫 Unity 方法 if (sceneID != "0") { UnityPlayer.UnitySendMessage("SceneManager", "LoadScene", sceneID); // 重新將編號歸 0, 因為每次 App 被重新啟動,回到 onResume 時, // 都會抓到上次推播訊息的 Intent, 這會導致 Unity 場景被重新載入. intent.putExtra("scene", 0); } } }
onNewIntent 裡面我們必須去刷新推播傳遞進來的 Intent,否則你的 Intent 會一直是上一次的 Intent。
onResume 這裡我們去解析 Intent,並且檢查這個 Intent 是不是我們要用來切換場景用的?
UnityPlayer.UnitySendMessage 是 Android 調用 Unity 的方法,詳細可參考 Android Studio 匯出 JAR 檔 - 在 Android 中呼叫 Unity Method
步驟六、
都完成後,就可以匯出 JAR 了。
開啟 Gradle,刷新後,點擊 Test > Test > Tasks > other > exportJar 來匯出 JAR 檔案
![image04.jpg image04.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664105-293118851_n.jpg)
JAR 將會匯出到 Test\app\release 底下,再將它複製一份,取代掉 Unity Assets\Plugins\Android 底下的 JER 檔
![image05.jpg image05.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664105-684721792_n.jpg)
該步驟不了解的話,可以回去參考 Android Studio 匯出 JAR 檔 等一系列文章。
步驟七、
開啟 Unity Assets\Plugins\Android 底下的 AndroidManifest.xml
![image06.jpg image06.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664105-2766118615.jpg)
步驟八、
這裡我們要將原本的 UnityPlayerActivity 改為我們自己的 MyActivity。
修改前...
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name">
修改後...
<activity android:name="com.test.tw.test.MyActivity" android:label="@string/app_name">
這裡的 com.test.tw.test 是我專案的 package 名稱,大家要記得替換成自己的 package 名稱。
步驟九、
這邊我將原本 Main 場景上的物件 "MyAndroid" 改名為 "SceneManager" 方便辨識。
並且使用 UGUI 新增一個 文字UI(Text),用來告知目前處於哪個場景
![image07.jpg image07.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664106-639353230_n.jpg)
步驟十、
這邊我分別又新增了 "Scene_100"、"Scene_200",並且新增 按鈕UI(Button) 可以切換回主場景,這邊要記得在每個場景裡放上我們的 "SceneManager" 物件!否則 Android 在這些場景上會無法正確的呼叫到 "LoadScene" 方法(Method)
步驟十一、
接著打開 MyAndroid.cs 這支腳本進行編輯
![image10.jpg image10.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664107-532358313_n.jpg)
步驟十二、
因為我們要使用 SceneManager.LoadScene 來切換場景,但 Unity 新版的 SceneManager 被移到別的 namespace 了,所以這邊我們必須要額外 using
using UnityEngine.SceneManagement;
在 Android 裡面,我們是設定為呼叫 "SceneManager" 物件裡的 "LoadScene" 方法(Method),所以這邊我們必須建立 "LoadScene" 方法(Method) 來給 Android 呼叫
private void LoadScene( string sceneID ) { // 解析 ID int id = int.Parse( sceneID ); // 查詢是否有對應的場景, 並且執行切換 switch ( id ) { case 100: SceneManager.LoadScene( "Scene_100" ); break; case 200: SceneManager.LoadScene( "Scene_200" ); break; } }
步驟十三、
最後一步,記得將 Scene 拖曳到 Build Settings 上設定好啊!不然可是會切換失敗的......
![image11.jpg image11.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664107-145456354_n.jpg)
來測試看看吧!
呼叫推播,可以看見推播訊息
![image12.jpg image12.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664107-90047695_n.jpg)
點擊推播 "訊息100"
![image13.jpg image13.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664107-2033262282_n.jpg)
App 被啟動,正確切換到對應的 "場景100"
![image14.jpg image14.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664107-1959051570_n.jpg)
直接在 App 開啟狀態中點擊推播 "訊息200"
![image15.jpg image15.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664107-4197877567_n.jpg)
結果正確切換到對應的 "場景200"
![image16.jpg image16.jpg](https://imageproxy.pixnet.cc/imgproxy?url=https://pic.pimg.tw/gn02214231/1506664107-162737781_n.jpg)
完成點擊推播後切換至對應場景!
範例下載:
該教學的一系列文章:
文章標籤
全站熱搜