zoukankan      html  css  js  c++  java
  • 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吧~~~

  • 相关阅读:
    函数的对称性及其图像变换
    KMP 字符串匹配
    15 保护模式中的特权级(上)
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    2-26安卓自学
  • 原文地址:https://www.cnblogs.com/coldcode/p/4763359.html
Copyright © 2011-2022 走看看