Unity Android交互過坑指南


Unity Android交互過坑指南

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

介紹

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

        // 加載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的代碼是:

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

正式開工

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

第零步 隨便新建個Android工程

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

第一步 編譯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包了,繼續下一步

第二步 在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一下

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

代碼超級簡單,像這樣:

    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吧~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM