Unity如何挂接Android程序

首先说Unity如何接Android程序,它是通过外挂的形式接入的。
    这些在Unity的官方文档里介绍得很清楚。Unity针对那些没有足够jni,java和android经验的人提供了一个简单的办法,(其实我也是这一类人)只使用AndroidJavaObject/AndroidJavaClass这两个类来完成和Java程序之间的通信。
    用到的代码仅仅是像下面这样:
    using (JavaClass jc = new JavaClass("com.unity3d.player.UnityPlayer"))
    {
       using( AndroidJavaObject jo = jc.GetStatic("currentActivity"))
       {
            jo.Call("MyFunctioninjava");
       }  
    }
    MyFunctioninjava是在android程序里的一个Activity里的函数,可以是自己定义的,函数可以有参数,jo.Call("MyFunctioninjava","mymsg");把参数也传递过去。这种字符串形式的参数是最简单好用的。call函数的定义说传递的参数是一组参数,所以,可以适用各种函数。也可以调用有返回值的函数,参看Unity文档。
    如果是调用静态函数可以直接用类调用,上面代码写成这样。
    using (JavaClass jc = new JavaClass("com.unity3d.player.UnityPlayer"))
    {
        jc.CallStatic("StaticFun");
    }
    StaticFun函数如果有参数,传递相应参数,也可是有返回值的,具体参看Unity文档。using(){}; 作用是在适当的时候尽快回收里面的程序使用的内存。建议使用,因为这种通信的方法简单,但运行成本很高。所以要尽快清理,并且保证使用频率尽可能少。最好只在像Start()这样一次运行的函数里,或在事件激发时调用,如当按下某个按钮时。
    这样就实现了向Android程序传递信息,从而完成在Unity里调用这个android程序。
    那么,如果程序运行在这个外挂Android程序里,怎样往Unity里传送信息呢?使用com.unity3d.player.UnityPlayer类里的UnitySendMessage静态函数。只要在需要返回信息的地方,加像下面这样的代码(之前java程序要导入UnityPlayer类,方法import com.unity3d.player.UnityPlayer;这个类在Unity的classes.jar文件里,它又在你的Unity游戏引擎的安装目录的Editor\Data\PlaybackEngines\androidplayer\bin文件夹里(windows系统的,Mac的参看Unity文档)):UnityPlayer.UnitySendMessage("Main Camera", "JavaMessage", "msg");意思是调用Unity游戏里名字为"Main Camera"的游戏物体上,所附脚本里的JavaMessage函数,这个JavaMessage函数要个字符串参数,"msg"信息被传进来。可以判断字符串内容然后决定做什么动作。
    这样就实现了两边互相调用。原理就是这个样子的。
    下面讲如何具体实现。
    1、在自己unity工程中的Assets文件夹下建Plugins文件夹,在Plugins文件夹下建Android文件夹,注意这两个文件夹的名字一个字也不能错,Unity在打包的时候会搜索这个路径里的文件及文件夹。Unity里的工作现在只能做到这里。
    2、用Eclipse导入你准备接入Unity的Android程序。有的提供者说是SDK,他们的类和函数都在libs文件夹里主要是.jar文件,也可能有.so文件。
    3、如果你没有自己的android程序,在src文件夹下写java程序。如果你的java代码已经是写好的,或直接拿和SDK一起发布的Demo来用(下面以有Android程序来讲),在src文件夹里可以找到,路径在和java文件里的package定义的路径要相同。
    4、要使Unity可以调用Android程序,前面说了用jo.Call("MyFunctioninjava");的办法。这就要建一个和Unity对接的java程序,即一个Activity。让这个java程序里的类继承Unity的com.unity3d.player.UnityPlayerActivity类。Unity的com.unity3d.player.UnityPlayerActivity类和com.unity3d.player.UnityPlayer类一样都在Unity的classes.jar文件里,前面说了在哪里。将classes.jar添加到你编译activity的classpath中。具体方法是:右键你的项目,在弹出菜单里找到Properties项,点开。选择项目后,在File菜单下,或在Project菜单下都能找到Properties项。打开Properties项后第五个是Java Build Path,点选。然后选中右边的Libraries页。然后看到最右边有个Add External JARs...按钮,从里面的文件目录表里找到Unity的 classes.jar应用确定。就会把添加到项目里。这时候在java程序里添加import com.unity3d.player.UnityPlayer;和import com.unity3d.player.UnityPlayerActivity,编译器就能认识了。有了UnityPlayerActivity类就能写继承它的java类了。比如:
    import android.content.Intent;
    import com.unity3d.player.UnityPlayerActivity; 
    public class MainActivity extends UnityPlayerActivity 
    { 
        protected void onCreate(Bundle savedInstanceState)
        {
             super.onCreate(savedInstanceState); 
        }
        public void MyFunctioninjava()
        {
            Intent intent = new Intent(MainActivity.this,SDKLogin.class);
            this.startActivity(intent);
        }
    }
    其实我们的Android游戏也是一个Activity,叫UnityPlayerActivity,显示的就是我们游戏换面。我们让UnityPlayerActivity多了一个MyFunctioninjava()方法。在这个方法里我们可以调出Android外挂的某个(可以有很过Activity)Activity,即Intent intent = new Intent(MainActivity.this,SDKLogin.class);this.startActivity(intent);SDKLogin这个Activity就会出现在屏幕上了。
    注意在AndroidManifest.xml文件里要对MainActivity这个Activity做一下配置(至少要有一下内容):
    <activity
            android:name="com.company.product.MainActivity"
                                  
           >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    "com.company.product.MainActivity"是MainActivity所在的路径其中com.company.product和它所在java文件里的package声明内容一样。
<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />意思是启动程序并是主程序。就是我们的游戏加载后的Activity。
    注意游戏使用的Android API版本不同,Eclipse对this.startActivity(intent);这一句会提出不同的修改方法,以适合当前使用的版本。比如4.3,要在public void MyFunctioninjava()上面加一句@TargetApi(Build.VERSION_CODES.GINGERBREAD) 才不会有错误。
    5、在需要返回信息的Active的java程序里加import com.unity3d.player.UnityPlayer和类似UnityPlayer.UnitySendMessage("Main Camera", "JavaMessage", "msg")的函数。
    6、如果Eclipse,没有错误提示就可以到项目里的bin文件夹下,把需要的class生成jar文件了。具体做法:
    找到bin文件夹里的classes文件夹,把里面的com文件夹整个复制出去,放到一个空文件夹里。在DOS下用jar程序把它压成jar包。运行->cmd->cd到这个空文件夹,用jar cvf myclasses.jar com\命令把com文件夹及里面的内容压成jar包。myclasses.jar只要后缀是jar可以随便起名。如果你是Windows系统,发现输入jar命令,提示jar不是内部或外部命令出错,又不会配置系统环境。那你到JDK的安装路径里的bin文件夹里找到jar.exe和jli.dll文件,把这个两个文件也复制到那个空文件夹里就可以了。
    7,生成myclasses.jar后,把它复制到Unity游戏项目的前面提到的Plugins文件夹下Android文件夹里,或再建个bin文件夹,放到bin文件夹里(Unity都可以找到),同时把Android外挂项目第一层里的AndroidManifest.xml文件,res文件夹,如果使用了其它lib文件,也把libs文件夹一起复制到Unity游戏项目的Plugins文件夹下Android文件夹里。注意如果之前你是通过复制Unity的classes.jar文件到Android项目的libs文件夹里来用的,请把classes.jar删掉。
    8,在Unity游戏项目里的Main Camera游戏物体上加脚本,脚本里要有JavaMessage函数。当然不一定是Main Camera游戏物体和JavaMessage函数,用什么都行。同时,要有个脚本含前面说的AndroidClass或ObjectAndroidJavaObject调用函数。
    9、用Unity发布吧。注意之前AndroidManifest.xml里的package="com.company.product"  android:versionCode="1"  android:versionName="1.0"这些设定内容要和游戏Playersettings里设置的一样。
    10、如果Unity打包过程出现类似下面这样的错误提示:
     Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details.
     X:\Android SDK\adt-bundle-windows-x86-XXXXXX\sdk\build-tools\X.1.0\aapt.exe package --auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S "res" -I "E:/Android SDK/adt-bundle-windows-x86-XXXXXX/sdk/platforms/android-X\android.jar" -F bin/resources.ap_
表示在Android外挂项目里的res文件夹里有的地方的xml设置文件里的设置内容找不到,比如一条设置指向一个名为bnt的png图片文件,但这个图片的名字不是这个。
    11、如果Unity打包过程出现类似下面这样的错误提示:
    Error building Player: CommandInvokationFailure: Unable to convert classes into dex format. See the Console for details.
    X:\Program Files\Java\jdk1.X.X_XX\bin\java.exe -Xmx1024M -Dcom.android.sdkmanager.toolsdir="X:/Android SDK/adt-bundle-windows-x86-20130729/sdk\tools" -Dfile.encoding=UTF8 -jar "X:/Program Files/Unity/Editor/Data/BuildTargetTools/AndroidPlayer\sdktools.jar" -
表示你的你复制过来的libs文件夹里的东西和Unity的有冲突,通常是含有和Unity的classes.jar相同内容的jar文件。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值