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調不出來,坑爹啊