Unity3d和Android之間互相調用
- 2019 年 10 月 7 日
- 筆記
摘抄部落格 Unity3d Android SDK接入解析(一)Unity3d 與 Android之間的互相調用,一共四章,一定要看完
No1:
總體來說Unity3d與Android之間的互相調用,是通過Unity3d提供的classes.jar來實現的
No2:
常見的方法就是
1)在Android層定義好介面
2)在Unity中通過反射調用(反射大法好啊,真是好)
No3:
UnityPlayer是FrameLayout的一個子類,而currentActivity則是UnityPlayer類中的靜態對象。
No3:
我們一般建立了一個新的MyActivity繼承UnityPlayerActivity,並在AndroidManifest中把MyActivity設置為啟動的Activity,然後使用currentActivity這個jo來調用方法。
No4:
新版Unity生成的unity-class.jar中類的繼承關係變簡單了:UnityPlayerActivity->Activity,之前的UnityPlayerNativeActivity被廢棄了
No5:
UnityPlayerActivity中
mUnityPlayer = new UnityPlayer(this);
把上下文傳進去
在UnityPlayer中
public UnityPlayer(Context var1) { super(var1); if (var1 instanceof Activity) { currentActivity = (Activity)var1; }
把上下文傳給currentActivity,所以currentActivity就是當前的上下文
No6:
Android SDK的接入一般分為兩種
1)一種是把Unity的工程導出google project的形式進行接入 2)另一種是通過把Android的工程做成Plugins的形式進行接入
對比

No7:
只有當需要在Activity的生命周期中執行一些操作時,我們才需要一個中間Activity去完成這些與生命周期相關的操作,而其他情況下,一個Class足以
No8:
Unity調用Android方法默認不是在UI主執行緒上執行的,所以如果你想要對UI介面進行操作,那就要使用runOnUiThread才行。
No9:
每個渠道SDK有兩個class,一個管理帳號資訊,一個管理支付資訊,帳號與支付分離
No10:
調用上,C#初始化「包名+類名」的AndroidJavaClass對象,使用這個對象來調用對應功能
No11:
Activity生命周期的處理:(C#處理的方式)
android程式碼
public void lifeCycle(int status) { if (getActivity() == null) { DybGSdkUtil.E("還未Init初始化,不執行生命周期操作 "); return; } switch (status) { case DybGSdkConstants.onStart: break; case DybGSdkConstants.onResume: BuoyOpenSDK.getIntance().showSmallWindow(getActivity()); break; case DybGSdkConstants.onPause: BuoyOpenSDK.getIntance().hideSmallWindow(getActivity()); BuoyOpenSDK.getIntance().hideBigWindow(getActivity()); break; case DybGSdkConstants.onStop: break; case DybGSdkConstants.onDestroy: OpenHwID.releaseResouce(); BuoyOpenSDK.getIntance().destroy(getActivity()); break; default: break; } }
C#調用
void OnApplicationPause(bool isPause) { if (isPause) { string json = "{'status':'3'}"; ajc_SDKCall.CallStatic("uaLifeCycle",json); } } void OnApplicationFocus(bool isFocus) { if (isFocus) { if (ajc_SDKCall != null){ string json = "{'status':'1'}"; ajc_SDKCall.CallStatic("uaLifeCycle",json); json = "{'status':'2'}"; ajc_SDKCall.CallStatic("uaLifeCycle",json); } } } void OnApplicationQuit() { string json = "{'status':'5'}"; ajc_SDKCall.CallStatic("uaLifeCycle",json); }
// Android Activity生命周期 public static final int onStart = 1; public static final int onResume = 2; public static final int onPause = 3; public static final int onStop = 4; public static final int onDestroy = 5; public static final int onRestart = 6;
No12:
如果想從android層傳數據到unity層,使用UnityPlayer.UnitySendMessage(OBJNAME, "andToU3dCallback", "exit");方法
切記:這個API需要大寫S開頭的Send才能調出來,小寫s開頭的send調不出來,坑爹啊