在這篇文章中 "Android Studio 匯出 JAR 檔 - 在 Unity 中調用 Android Function" 我們講解了如何呼叫 Android Function 了。
現在這篇要說明的是,如何在 Android 中呼叫 Unity Method。
語法為:
UnityPlayer.UnitySendMessage( Unity 場景中的 GameObject 名稱, GameObject 中掛載腳本裡的 Method 名稱, 要傳送的文字 );
詳細如下:
步驟一:
下載 "Android Studio 匯出 JAR 檔 - 在 Unity 中調用 Android Function" 該篇文章的範例。
步驟二:
打開 Main 場景,在場景中新增一個 Cube,命名隨意,這邊我命名為 "UnityGameObject"。
步驟三:
新增一個腳本,命名隨意,這邊我命名為 "TestUnitySendMessage"。
完成後將腳本拖曳至剛剛建立的 "UnityGameObject" 物件上。
步驟四:
打開 "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。
步驟七:
這邊我們要修改一下 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"
點擊 "測試 Android 2"
該教學的一系列文章:
Android Studio 匯出 JAR 檔
Android Studio 匯出 JAR 檔 - 加入 Unity classes.jar
Android Studio 匯出 JAR 檔 - 在 Unity 中調用 Android Function
Android Studio 匯出 JAR 檔 - 在 Android 中呼叫 Unity Method
可能會遇到的問題:
Android Studio 匯出 JAR 檔 - 呼叫 Function 無反應
Android Studio 匯出 JAR 檔 - broken class file
文章標籤
全站熱搜

嗨,可以請問一下如何在unity 去呼叫 一個android activity這問題我弄好久喔.
你好,這篇文章有說明唷! http://gn02214231.pixnet.net/blog/post/179524201-android-studio-%E5%8C%AF%E5%87%BA-jar-%E6%AA%94---%E5%9C%A8-unity-%E4%B8%AD%E8%AA%BF%E7%94%A8-android-
可是我照著做,每次呼叫完後會出現程序已停止然後就關掉了,我可以發我的專案給你看看嗎?,還是你可以告訴我大概可能會錯誤的方向謝謝!!
你可以發專案給我看看,不過你的錯誤可能是因為 Android 那邊的程式是錯的,所以 APP 執行失敗,或者你是不是忘記加入權限呢?
*****
*****
我直接在這邊回覆囉,因為留言為私有的,所以會看不到。 它會發生錯誤的原因,是因為你的 TestActivity0.java 裡面的 setContentView(); 這行錯誤了。 你改成以下的程式碼,就可以正常囉! int id = UnityPlayer.currentActivity.getResources().getIdentifier( "activity_main2", "layout", UnityPlayer.currentActivity.getPackageName()); setContentView(id); 原因是 JAR 檔案不會把你的資源包進去,所以原做法會因為抓不到資源而錯誤,原理跟 http://gn02214231.pixnet.net/blog/post/182257555-%E5%9C%A8-unity-%E8%A3%A1%E5%8A%A0%E5%85%A5-android-%E7%9A%84%E6%9C%AC%E5%9C%B0%E7%AB%AF%E6%8E%A8%E6%92%AD-%28localnotific 裡面抓圖片方式一樣。
sorry沒看到你之前的文章,麻煩妳了哈哈,一次就解決囉,這關係到專題很重要部分,謝囉!
不客氣~
我現在正在嘗試製作 用Unity 在Android上 以Google帳號 登入APP的會員 但是很慘的是 facebook有提供SDK可以直接套用 但Google卻只有一海票的技術文件... 大部分都是java... 到後來聽說jar可以作為Plugin包Java進Unity中使用... 依照您的這幾篇文章 終於可以包出包含有Class的jar檔案 以及呼叫方式 但CatLog總是顯示 AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/samples/quickstart/signin/ChooserActivity; AndroidJavaException: java.lang.NoClassDefFoundError: com.google.samples.quickstart.signin.UnityCall
你好: 你可以試著讓 ChooserActivity 這支 Class 繼承 UnityPlayerActivity 看看。 而你要登入 Google 時,應該會需要用到一些 Google 相關的 jar,將這些 jar 一起放入 Unity 的 Plugins/Android/ 裡面後,再試試看吧! 因為線索不是很多,所以只能大概給個方向,希望有幫到你。
感謝關注QQ 實際上這些錯誤訊息是我嘗試在繼承UnityPlayerActivity的Class中 加入Google Signin API時遭遇的問題。 目前我使用的是Android Studio 2.1.1 並且因為google的說明文件最近不斷更新, 因此我也不斷的更新SDK所以SDK也是最新的 目前還在找方向,再次感謝。
你好: 不知道你是不是繼承了 GoogleApiClient 的 ConnectionCallbacks 與 OnConnectionFailedListener 要實作 Google+ 的登入? 或是有使用到 GoogleApiClient 的相關功能?如果有的話,請到以下位置 "你的 Android Studio 專案目錄 > app > build > intermediates > exploded-aar > com.google.android.gms > play-services-basement > 你使用的版號 > jars > classes.jar"。 把 classes.jar 這支 JAR 檔複製一份到你的 Unity 專案底下的 "Assets > Plugins > Android" 裡面。 再試試看應該就可以了。 不過這 JAR 好像會跟 Google Play 的 google-play-services.jar 衝突的樣子......
感謝 感覺好像終於有人可以討論學習了QДQ 抱歉因為我連java也是最近才開始學 本來就只會用Unity 最近有需求要Google登入 剛好那時候還趕上了Google正在API大改版... 呃...這邊討論適合嗎? (不知道你是不是繼承了 GoogleApiClient 的 ConnectionCallbacks 與 OnConnectionFailedListener 要實作 Google+ 的登入?) = 沒錯QQ; "app > build > intermediates > exploded-aar > com.google.android.gms > play-services-basement > 9.0.0 > jars > classes.jar" 這個檔案我放進去了 沒有改善 或者還有其他步驟我不知道要加的0.0 目前我是從頭重新寫code 一隻是UnityCall extends UnityPlayerActivity 一隻是GoogleSignin extends UnityPlayerActivity implements ConnectionCallbacks, OnConnectionFailedListener 然後是會先出現: I/art(6704): Rejecting re-init on previously-failed class java.lang.Class
AndroidJavaException: java.lang.ClassNotFoundException: com.google.samples.quickstart.signin.GoogleSignin
UnityCall 裡面啥都沒有 只有幾個測試Unity跟Java之間的訊息傳遞 所以很順利的成功了
但是GoogleSignin感覺真是多災多難...
你可以先看這篇文章:http://anson-programming.blogspot.tw/2015/08/android-google-plus-api.html 這是教學如何使用 Google+ Login。 目前我也是遇到一些問題,因為我想將 Login 功能包成一個靜態的函數,再整合進 Unity 裡面。 不過這似乎非常有難度...... 如果行不通的話,可能要考慮不使用靜態函數的方法了。 2016/07/29 補充: 哈囉~我已經建立 Unity 使用 Google+ Login 教學囉! http://gn02214231.pixnet.net/blog/post/205868620-%E5%9C%A8%20Unity%20%E4%B8%AD%E8%AA%BF%E7%94%A8%20Android%20%E7%9A%84%20Google+%20%E7%99%BB%E5%85%A5%20-%20Unity%20%E8%88%87%20Android%20%E7%9A%84%E9%83%A8%E5%88%86 去看看吧!