天天看點

unity3d字型大小轉android,android與Unity3d互動

Unity3D與Android間的互相調用

将Unity3D內建到Android項目中有好幾種方式,這裡說的是将Unity3D以module的方式內建到android studio開發的項目中。

Unity3D與Android間的互動基本套路就是在android中調起Unity3D,Unity3D展示出效果後,Unity3D再調用android中協定好的方法,來實作互動。這裡就按照這個套路講一下它們之間的互動以及其中出現的坑。

unity3d字型大小轉android,android與Unity3d互動

unity3d_structure.png

unity3d字型大小轉android,android與Unity3d互動

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();

}

});

}