Unity3D與Android間的互相調用
将Unity3D內建到Android項目中有好幾種方式,這裡說的是将Unity3D以module的方式內建到android studio開發的項目中。
Unity3D與Android間的互動基本套路就是在android中調起Unity3D,Unity3D展示出效果後,Unity3D再調用android中協定好的方法,來實作互動。這裡就按照這個套路講一下它們之間的互動以及其中出現的坑。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwADNiFzY5IWNkBjNvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
unity3d_structure.png
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwADNiFzY5IWNkBjNvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
u3d展示.gif
Android調起Unity3D(這是Android工程師的工作)
ShowU3DActivity
private String str = "這裡是需要傳的json";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UnitySplashSDK.getInstance().onCreate(savedInstanceState, mUnityPlayer, 1);
mUnityPlayer.UnitySendMessage("Manager", "Manager", str);
}
mUnityPlayer.UnitySendMessage("Manager", "Manager", str);
這個方法就是調起Unity3D的方法,與Unity工程師協定好傳遞的參數,這裡的str就是一段json,Unity工程師去自己解析json,擷取到資料,接着就調起Unity3D的動畫。注意:與Unity工程師協定好的方法,都必須聲明到對應的Activity中,否則就調不起3D界面,處于一直加載狀态。
UnityPlayer是一個FrameLayout,3D的展示主要是這個類,一些FrameLayout的操作都适用于UnityPlayer,也就為我們下面為它添加過渡界面提供的可行性。
UnitySplashSDK.getInstance().onCreate(savedInstanceState, mUnityPlayer, 1);
加載3D動畫時間較長,為了更好的使用者體驗,自己實作了UnitySplashSDK這個類,主要是用來展示一個過渡界面和加載完成時隐藏過渡界面。
在Unity3D中調用Android(這是Unity工程師的工作)
Unity工程師想要調用Android項目中的方法,首先要有這個方法,是以Android工程師還要做件事情:與Unity工程師一起協定好方法的名稱。
ShowU3DActivity
public void ShowRedPacket() {
Log.e(TAG,"ShowRedPacket所線上程:"+Thread.currentThread().getName());//這裡的線程是Unity main線程,需要轉換到android的主線程中操作自己的業務邏輯
runOnUiThread(new Runnable() {
@Override
public void run() {
showMyDialog();
}
});
}
public void hideSplash() {
UnitySplashSDK.getInstance().onHideSplash();
}
協定好方法名後,就是Unity工程師調用的事情。
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic("currentActivity");
jo.Call("ShowRedPacket");
通過上面的方式,Unity工程就可以調用到我們在Android項目中定義好的方法。
Unity3D調用Android接口的api
方法名
方法類型
說明
Call
執行個體
調用執行個體方法
Get
執行個體
擷取執行個體變量(非靜态)
Set
執行個體
設定執行個體變量(非靜态)
CallStatic
靜态
調用靜态方法
GetStatic
靜态
擷取靜态變量
SetStatic
靜态
設定靜态變量
上面的ShowRedPacket()是不需要參數的,舉一個需要參數的例子
android中定義的方法需要String類型的參數和一個int類型的參數:
public void showMsg(String name,int age){
//android的業務邏輯
}
Unity工程中:
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic("currentActivity");
jo.Call("showMsg","小明",18);
還有一種情況就是Unity調用android的方法,需要android傳回資料,也就是有傳回值
android中定義一個有傳回值的方法:
public String getName(){
return "小明";
}
Unity工程中,name就是android中傳回的資料
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic("currentActivity");
string name = jo.Call("getName");
注意
UnityPlayer.quit()調用的時候會殺死目前程序,是以我們需要為界面建立新的程序
android:process=":showu3d"
/>
android為Unity定義的方法,被調用的線程不是android的主線程,需要轉換到Android的主線中進行操作
public void ShowRedPacket() {
Log.e(TAG,"ShowRedPacket所線上程:"+Thread.currentThread().getName());//這裡的線程是Unity main線程,需要轉換到android的主線程中操作自己的業務邏輯
runOnUiThread(new Runnable() {
@Override
public void run() {
showMyDialog();
}
});
}