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~~~~
然后將這個文件復制到Android工程下的libs文件中,復制進去就好了,eclipse會自動添加到buildpath的
就是框框里那個東東,我改了個名字而已
然后將主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,別的教程沒有
像這樣:
現在你可以嘗試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吧~~~