Unity Android交互過坑指南

Unity Android交互過坑指南

介於網上看過不少unity和Android交互的教程,都或多或少的漏掉了一些部分,致使編譯過程當中出現各類問題,特此整理一份教程,僅供參考java

介紹

本次實現的是在遊戲界面下方顯示一個banner廣告,而後控制顯示和隱藏的功能
Android和unity之間的交互從代碼上來看其實很簡單
unity調用安卓的代碼是:android

// 加載unity的交互對象,照着寫就是了,沒有變化
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        // 調用Android中寫好的public函數
        // 能夠傳參數,參數類型是params[],因此~~~
        // 像這樣就能夠了 jo.Call("u3dCallHideBanner",參數1,參數2,參數3);
        jo.Call("u3dCallHideBanner");

Android調用unity的代碼是:app

// 第一個參數是unity中的對象名字,記住是對象名字,不是腳本類名
        // 第二個參數是函數名
        // 第三個參數是傳給函數的參數,目前只看到一個參數,而且是string的,本身傳進去轉吧
        UnityPlayer.UnitySendMessage("UI_ROOT","onMsgFromAndroid",msg);

正式開工

下面的步驟就是機械化的了,就不解釋咯~~~雖然上面也沒啥解釋eclipse

第零步 隨便新建個Android工程

PS:建議選2.3.3以上的Android版本ide

第一步 編譯jar包

先在unity的安裝目錄下找到一個classes.jar文件
個人路徑是"D:\Program Files\Unity\Editor\Data\PlaybackEngines\androidplayer\release\bin"
各位自行類比 ABCDEFG~~~~
classes.jar 文件位置截圖
而後將這個文件複製到Android工程下的libs文件中,複製進去就行了,eclipse會自動添加到buildpath的
複製進eclipse
就是框框裏那個東東,我改了個名字而已
而後將主Activity改爲須要的樣子函數

public class MainActivity extends UnityPlayerActivity {

    private Activity activity = this; // must be an Activity

    WFSUtils wfsUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        wfsUtils = WFSUtils.getInstance(activity);

        // 添加gameview
        FrameLayout gameLayout = (FrameLayout) findViewById(R.id.fl_game);
        gameLayout.addView(this.a);
        // 添加banner
        FrameLayout bannerWrapper = (FrameLayout) findViewById(R.id.fl_ad);
        bannerWrapper.addView(wfsUtils.getBannerView());

        this.a.requestFocus();
    }
    
    public void u3dCallShowBanner() {
        wfsUtils.showBanner();
        sendMessageToUnity("響應了顯示Banner");
    }

    private void sendMessageToUnity(String msg) {
        // 第一個參數是unity中的對象名字,記住是對象名字,不是腳本類名
        // 第二個參數是函數名
        // 第三個參數是傳給函數的參數,目前只看到一個參數,而且是string的,本身傳進去轉吧
        UnityPlayer.UnitySendMessage("UI_ROOT","onMsgFromAndroid",msg);
    }
}

記住,繼承的是UnityPlayerActivity,是UnityPlayerActivity,是UnityPlayerActivity,重要的事說三遍~~~
而後佈局能夠本身改,個人是像這樣的佈局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/base"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
    tools:context="${relativePackage}.${activityClass}" >

    <FrameLayout
        android:id="@+id/fl_game"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFF" >

    </FrameLayout>

    <FrameLayout
        android:id="@+id/fl_ad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >
    </FrameLayout>

</RelativeLayout>

其實很簡單,上面放咱們的GameView,下面放個banner廣告....
而後各類資源文件擺好,下面開始打包
打包
只選src,無論你有不有調用第三方庫,都直選src,其餘教程木有這個
只選src,無論你有不有調用第三方庫,都直選src,其餘教程木有這個
只選src,無論你有不有調用第三方庫,都直選src,其餘教程木有這個
而後就打包出jar包了,繼續下一步ui

第二步 在unity中配置項目

在unity中建立以下幾個目錄
目錄
不要問能不能改。。。不能改!!! unity官方手冊上有說
而後剛纔打包出來的jar包複製到bin目錄下
Android中libs文件夾下全部文件複製到libs文件夾
Android中res文件夾下全部文件複製到res文件夾
而後~~~~
重點來了,刪掉unity本身的classes.jar文件,就是個人這個u3dlibs.jar,別的教程沒有
重點來了,刪掉unity本身的classes.jar文件,就是個人這個u3dlibs.jar,別的教程沒有
重點來了,刪掉unity本身的classes.jar文件,就是個人這個u3dlibs.jar,別的教程沒有
像這樣:
沒有u3dlibs.jar
如今你能夠嘗試build一下項目,看是否報錯,若是報錯,請重複前面幾個步驟,or Google一下this

第三步 在unity中編寫交互代碼

代碼超級簡單,像這樣:debug

public void showBanner()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("u3dCallShowBanner");
    }

    public void hideBanner()
    {
        debugUI.onMsg("[u3d]u3dCallHideBanner");
        // 加載unity的交互對象,照着寫就是了,沒有變化
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        // 調用Android中寫好的public函數
        // 能夠傳參數,參數類型是params[],因此~~~
        // 像這樣就能夠了 jo.Call("u3dCallHideBanner",參數1,參數2,參數3);
        jo.Call("u3dCallHideBanner");
    }

    void onMsgFromAndroid(string str)
    {
        debugUI.onMsg("[Fr:Android]" + str);
    }

而後unity基本事件響應我就不解釋了 若是你看到這裏都還編譯不過,聯繫我QQ 821580467吧~~~

相關文章
相關標籤/搜索