在這篇文章中 "Android Studio 匯出 JAR 檔 - 在 Unity 中調用 Android Function" 我們講解了如何呼叫 Android Function 了。
現在這篇要說明的是,如何在 Android 中呼叫 Unity Method。
 
 
語法為:
UnityPlayer.UnitySendMessage( Unity 場景中的 GameObject 名稱, GameObject 中掛載腳本裡的 Method 名稱, 要傳送的文字 );
 
 
詳細如下:
 
步驟一:
 
 
步驟二:
打開 Main 場景,在場景中新增一個 Cube,命名隨意,這邊我命名為 "UnityGameObject"。
image01.jpg
image02.jpg
 
 
步驟三:
新增一個腳本,命名隨意,這邊我命名為 "TestUnitySendMessage"。
完成後將腳本拖曳至剛剛建立的 "UnityGameObject" 物件上。
image03.jpg
image04.jpg
 
 
步驟四:
打開 "TestUnitySendMessage" 腳本,加入以下程式碼。
"UnityMethod1" 會將物件放大 10 倍,"UnityMethod2" 則放大 20 倍。
 
using UnityEngine;

public class TestUnitySendMessage : MonoBehaviour
{
    // 該 Method 是給 Android 呼叫用的, 
    // 該 Method 沒有接收參數
    private void UnityMethod1()
    {
        this.transform.localScale = new Vector3( 10.0f, 10.0f, 10.0f );
    }

    // 該 Method 是給 Android 呼叫用的, 
    // 該 Method 有接收參數
    private void UnityMethod2( string s )
    {
        this.transform.localScale = new Vector3( 20.0f, 20.0f, 20.0f );
    }
}
 
這邊做個簡單的講解,在 Unity 的腳本中,Method 可以是 public、private、protected 都沒關係,只要不是 static 都是可以正常呼叫的。
雖然在 Android 中 UnitySendMessage 的三個參數都不能夠缺少,但是在 Unity 中被呼叫的 Method 是可以不接收參數的。
 
Android 呼叫 Unity Method 時,只能夠傳遞一個字串,可能有人會覺得不夠,但其實這邊你可以先把你要傳遞的資料轉換為 JSON,傳給 Unity 之後再解析就可以了。
甚至說想要傳遞圖檔的話,你也可以先透過 Android 把圖檔暫存到某一個位置,再把該位置的路徑傳遞給 Unity,Unity 再去執行載入的動作,把圖檔載入近來。
 
所以說,不要覺得只能傳遞一個 string,就以為沒什麼用途嘿!
 
 
步驟五:
打開 "MyAndroid" 腳本,將原本的 OnGUI 內容修改如下。
 
private void OnGUI()
{
    Rect rect = new Rect( 0.0f, 0.0f, 200.0f, 100.0f );

    if ( GUI.Button(rect, "呼叫 Android 1") )
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        
        using ( AndroidJavaClass unity = new AndroidJavaClass("com.test.tw.test.MyDialog") )
        {
            unity.CallStatic( "Show", "標題", "測試 UnityMethod1!", "UnityGameObject", "UnityMethod1" );
        }

        #else

        GameObject.Find( "UnityGameObject" ).SendMessage( "UnityMethod1", "要傳送的文字" );

        #endif
    }


    rect = new Rect( 200.0f, 0.0f, 200.0f, 100.0f );
    if ( GUI.Button(rect, "呼叫 Android 2") )
    {
        #if UNITY_ANDROID && !UNITY_EDITOR

        using ( AndroidJavaClass unity = new AndroidJavaClass("com.test.tw.test.MyDialog") )
        {
            unity.CallStatic( "Show", "標題", "測試 UnityMethod2!", "UnityGameObject", "UnityMethod2" );
        }

        #else

        GameObject.Find( "UnityGameObject" ).SendMessage( "UnityMethod2", "要傳送的文字" );

        #endif
    }
}
 
以上程式碼的意思是,我們把希望給 Android 呼叫的 GameObject 名稱以及 Method 名稱丟給我們自己建立的函數裡。
 
在這裡說明一下,在 Android 中所使用的 UnityPlayer.UnitySendMessage 函數,基本上功能就跟 Unity 中的 SendMessage 一樣,
所以以上的程式碼可以解釋為 "尋找場景中名稱為 "UnityGameObject" 的物件,並且執行該物件裡 "所有" 腳本中名稱為 "UnityMethod1" 的方法"
因此,這邊我會建議,你要給 Android 呼叫的 GameObject 物件名稱,盡量不要重複,Method 名稱也不要重複,避免發生非預期的錯誤。
 
在非行動裝置的環境要測試時,也可使用 SendMessage 去測試,基本上,執行結果跟行動裝置上是一樣的。
 
 
步驟六:
打開 Android Studi,開啟 MyDialog 檔案。
app > src > main > java > com.test.tw.test > MyDialog。
image05.jpg
 
 
步驟七:
這邊我們要修改一下 Show 函數,讓他多接收兩個參數。
並且加上回呼 Unity Method 的函數,修改如下。
 
public static void Show(final String title, final String content, final String objectName, final String methodName)
{
    UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
        public void run() {

            AlertDialog.Builder builder = new AlertDialog.Builder(UnityPlayer.currentActivity);

            builder.setTitle(title)
                      .setMessage(content)
                       .setCancelable(false)
                       .setPositiveButton("OK", null);

            builder.show();

            UnityPlayer.UnitySendMessage(objectName, methodName, "回傳的字串");
        }
    });
}
 
 
步驟八:
儲存後將 JAR 打包匯出至 Unity 專案中。
詳細 JAR 匯出步驟請到以下網頁查看
"Android Studio 匯出 JAR 檔" 步驟四、五、六 有說明如何匯出 JAR 以及匯出位置。
"Android Studio 匯出 JAR 檔 - 在 Unity 中調用 Android Function" 步驟二 有說明 JAR 要放到 Unity 的哪個位置。
 
 
 
步驟九:
安裝到手機上進行測試。
點擊 "測試 Android 1"

image06.png

image07.png

 
點擊 "測試 Android 2"

image08.png

image09.png

 
 
 
 
arrow
arrow

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