Unity與Android Studio?之間那些不清不楚的小秘密?(互相呼叫)
文章目錄
- Unity與Android Studio?之間那些不清不楚的小秘密?(互相呼叫)
- 前言
- 一、Unity與安卓互動的引數整理
- 1.(整理中)
- 二、Unity與安卓互動的幾種方法
- Unity呼叫安卓
- 1.unity呼叫Android的非靜態方法,繼承UnityPlayerActivity
- 2.unity呼叫Android的靜態方法
- 3.unity呼叫Android的非靜態方法,自己的類寫一個靜態構造方法
- 安卓呼叫Unity
- 1.通過發訊息UnitySendMessage的方式呼叫Unity
- 2.通過代理AndroidJavaProxy 的方式
- Unity呼叫安卓中的幾種常用事件(Toast等)
- Unity簡單實作安卓中Toast(吐司)
- 1.Unity端C#直接寫代碼呼叫(無需再AS中操作)
- 2.Unity端呼叫AS端寫的Toast
- 總結
前言
前言:因為最近在學習Unity與安卓之間的互動,所以在網上搜尋了很多關于這方面的東西,因為自己在網上搜的時候,感覺大家的東西都有些零碎,該有的差不多都有了,但是都不夠全面,所以自己寫篇文章用來整理這些精華 Unity與Android Studio互相呼叫的知識給大家分享一下一、Unity與安卓互動的引數整理
1.(整理中)
代碼如下(示例):
先介紹一下u3d中呼叫android的一些API
UnityPlayer是unity3d自身的一個jar包,兩端通信的關鍵,
currentActivity是android需要的背景關系,這兩個東西你可以當作是呼叫某些android方法需要的引數,記下就行
AndroidJavaClass jc=new AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
AndroidJavaObject jo=jc.GetStatic(“currentActivity”);
jo.Call(method ,parameter );//呼叫實體方法
jo.Get(method ,parameter );//獲取實體變數(非靜態)
jo.Set(method ,parameter );//設定實體 變數(非靜態)
jo.CallStatic(method ,parameter );//呼叫靜態變數(非靜態)
jo.GetStatic (method ,parameter );//獲取靜態變數
jo.SetStatic (method ,parameter );//設定靜態變數
該處使用的url網路請求的資料,
二、Unity與安卓互動的幾種方法
Unity呼叫安卓
1.unity呼叫Android的非靜態方法,繼承UnityPlayerActivity
注意:使用這種方法的時候,你在Android Studio 中寫的類要繼承UnityPlayerActivity才能調到,但是只能有一個類繼承它,寫多個類都繼承的時候,其他類也是調不到的
unity代碼:
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
jo.Call ("login","");
Android代碼:
public void login( String str ) {
// 寫上自己的操作
}
2.unity呼叫Android的靜態方法
注意:這里的AndroidJavaClass()里面的是自己的包名+類名
這樣寫的可以不用繼承UnityPlayerActivity也可以用
unity代碼:
AndroidJavaClass jc = new AndroidJavaClass ("com.hasee.librarydemo.Test");
jc.GetStatic<AndroidJavaObject> ("login","");
Android代碼:
public static void login( String str ) {
// 寫上自己的操作
}
3.unity呼叫Android的非靜態方法,自己的類寫一個靜態構造方法
注意:這里的AndroidJavaClass()里面的是自己的包名+類名
這樣寫的可以不用繼承UnityPlayerActivity也可以用
我這里是寫了一個靜態構造方法,先通過Unity拿到這個方法,然后通過這個方法來呼叫這個類里面寫的非靜態方法
說到底還是先用了靜態方法獲取的第一步
unity代碼:
AndroidJavaClass jc = new AndroidJavaClass("com.hasee.librarydemo.Test"); //包名加類名
AndroidJavaObject jo = jc.CallStatic<AndroidJavaObject>("getInstance");
jo.Call("login","");
Android代碼:
public class Test{
public static Test_instance;
public static Test getInstance(){
if(_instance==null){
_instance=new Test();
}
return _instance;
}
public static void login( String str ) {
// 寫上自己的操作
}
安卓呼叫Unity
1.通過發訊息UnitySendMessage的方式呼叫Unity
//把訊息發送給Unity場景中iFlytekASRController物體上的OnResult方法
UnityPlayer.UnitySendMessage("iFlytekASRController", "OnResultWake", resultString);
2.通過代理AndroidJavaProxy 的方式
安卓給Unity通訊可以通過這個AndroidJavaProxy 的方式,使用起來比通過發訊息要麻煩些,但是能干的事多了,而且使用這個代理相當于給Unity 的回呼,比發訊息要靠譜點,發訊息使用的反射的機制,字串也容易寫錯,可能會有發送失敗、延遲等可能,但是用這個回呼自然就更穩定啦
下面我寫一個Demo做通訊測驗
AS端:
1.首先要在AS端寫一個介面,介面中可以寫一些需要給Unity呼叫的方法或引數等,等于用于傳過去給Unity的回呼
package com.example.test;
public interface UnityasrEventCallback {
public void Speechcontent(int a);
public void Test1(String msg);
}
2.寫一個Activity用于與unity通訊,Unity端就呼叫這個方法(setCallback(UnityasrEventCallback callback))將代理傳過來,然后通過傳過來的代理,將AS介面中定義的方法和引數回呼傳給Unity端
private UnityasrEventCallback mCallback;
//獲取介面內容
public void setCallback(UnityasrEventCallback callback){
Log.d("@@@", "UnityBatteryEventCallback setCallback start ");
mCallback = callback;
Log.d("@@@", "UnityBatteryEventCallback setCallback end ");
mCallback.Test1("連通成功了");
mCallback.Speechcontent(666);
}
Unity端:
1.在一個cs腳本中寫一個內部類,然后繼承AndroidJavaProxy,然后寫一個構造方法繼承AS的 包名+介面名
然后實作這個介面,方法名一定要與AS中寫的一樣,再定義一個數值用于接收AS中傳過來的資料即可
public class AsrEventCallback : AndroidJavaProxy
{
public AsrEventCallback() : base("com.example.test.UnityasrEventCallback") { }
public void Speechcontent(int content){int a = content;}
public void Test1(string msg){string b = msg;}
}
base()里的是AS中介面的,包名+介面名,看好不要寫錯

2.然后在這個cs腳本的Start中new一個代理,然后通過 jo.Call(“setCallback”, asrEventCallback);將這個代理傳到AS中,然后AS就可以呼叫這個代理給Unity回傳資料了
void Start()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
AsrEventCallback asrEventCallback = new AsrEventCallback();
// 設定語音識別回呼函式介面
jo.Call("setCallback", asrEventCallback);
}
Unity呼叫安卓中的幾種常用事件(Toast等)
Unity簡單實作安卓中Toast(吐司)
1.Unity端C#直接寫代碼呼叫(無需再AS中操作)
在需要使用Toast的地方,直接用這套代碼,更改漢字為想要的使用即可
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass toast = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject context = jo.Call<AndroidJavaObject>("getApplicationContext");
jo.Call("runOnUiThread", new AndroidJavaRunnable(() =>
{
toast.CallStatic<AndroidJavaObject>("makeText", context, "開始代理測驗", toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
}));
2.Unity端呼叫AS端寫的Toast
Unity端:
public void OnClickAndroid()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call<int>("testToast", "吐司!");
}
AS端:
package com.test;
import android.os.Bundle;
import android.widget.Toast;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void testToast(final String msg)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,msg,Toast.LENGTH_LONG).show();
}
});
}
}
總結
以上簡單整理了Unity與Android Studio互動的幾種方式,當然還不夠全面,目前就這幾種了解的差不多,后邊學到新的這方面知識還是會繼續整理的,如果覺得有點用的話,點個贊再走呀<_> >轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266333.html
標籤:其他
上一篇:《Effective C++》條款01、02(以const,enume,inline,替換#define)
下一篇:OS的系統需求---需求分析
