我的環境配置: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

image01.jpg

 
 
步驟三、
下載好的範例原本的理念是使用 函數(static function),並且當作工具來做使用。
但我們現在需要接收推播訊息所帶的 Intent,所以我們必須建立自己的 UnityPlayerActivity 來取代預設的 UnityPlayerActivity
 
在 Test > app > src > main > java > com.test.tw.test 上按下滑鼠右鍵,選擇 New > Java Class
image02.jpg
 
建立我們自己的 UnityPlayerActivity,這裡我取名為 "MyActivity"
image03.jpg
 
 
步驟四、
讓 "MyActivity" 繼承 UnityPlayerActivity,並且覆寫 onNewIntentonResume 兩個 方法(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)。
 
 
我們覆寫這兩個 方法(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
 
JAR 將會匯出到 Test\app\release 底下,再將它複製一份,取代掉 Unity Assets\Plugins\Android 底下的 JER 檔
image05.jpg
 
該步驟不了解的話,可以回去參考 Android Studio 匯出 JAR 檔 等一系列文章
 
 
步驟七、
開啟 Unity Assets\Plugins\Android 底下的 AndroidManifest.xml
image06.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
 
 
步驟十、
這邊我分別又新增了 "Scene_100"、"Scene_200",並且新增 按鈕UI(Button) 可以切換回主場景,這邊要記得在每個場景裡放上我們的 "SceneManager" 物件!否則 Android 在這些場景上會無法正確的呼叫到 "LoadScene" 方法(Method)

image08.jpg

image09.jpg

 
 
步驟十一、
接著打開 MyAndroid.cs 這支腳本進行編輯
image10.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
 
 
來測試看看吧!
呼叫推播,可以看見推播訊息
image12.jpg
 
 
點擊推播 "訊息100"
image13.jpg
 
 
App 被啟動,正確切換到對應的 "場景100"
image14.jpg
 
 
直接在 App 開啟狀態中點擊推播 "訊息200"
image15.jpg
 
 
結果正確切換到對應的 "場景200"
image16.jpg
 
 
完成點擊推播後切換至對應場景!
 
範例下載:
 
 
 
arrow
arrow

    岳 發表在 痞客邦 留言(0) 人氣()