unity与android交互(2)

上一篇做好了准备工作,这部分来具体说明怎么才能交互,就拿怎么在unity里面打开其他应用举例

在网上大部分人都介绍的是固定方法在unity方法中写成这样:

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic("currentActivity");

猜测应该是取的unity自带的类名,然后获取自带的单例currentActivity,然后再调用相关的方法。

为了弄清楚交互的具体流程,我没有使用这种固定的写法,而是做了一下探索

package com.tielubao.mylibrary01;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;

import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

    public static MainActivity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.out.println("调用了mActivity===============");
        mActivity=this;
    }

    public static MainActivity getActivity()
    {
       //mActivity=new MainActivity();可行,但因为直接实例化,在调用startActivity时报错,所以放弃
        return  mActivity;
    }

    public void openApp()
    {
        System.out.println("调用了此方法===============");
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("bazaar://details?id=" + "自己的包名"));
        intent.setPackage("想要开启的应用包名");
        startActivity(intent);
    }
}

声明mActivity代表MainActivity, mActivity=this是写在onCreate里面的,小皮了一下试试可不可以不这样写,因为写在onCreate里面就代表着unity的xml配置文件里这个类得做主函数,目前观察下来只有主函数才会被调用onCreate,其实是可以这么直接new的,不过这样写的话MainActivity并不会被Activity初始化,这涉及到和Android机制的关系,导致原生的一些操作发生错误·····等有时间再仔细研究一下。

以上就是Android需要写的相关代码,其实很简单,说白了就是让MainActivity继承UnityPlayerActivity ,然后在这个类里面写方法,然后到时候直接在unity调用就行了,因为已经具备了和unity交互的所需条件。

接下来点选mylibrary01文件,选择Build-->Make Moudule'mylibrary01'点击它,等待编译

unity与android交互(2)_第1张图片

 

接下来切换到project选项根据如下路径找到我们的aar

unity与android交互(2)_第2张图片

到这里之后还需要操作一下才行·····打开文件目录,找到这个.aar文件,本质上是一个压缩文件,所以用压缩工具打开

删除libs目录下的classes.jar,注意是libs目录下的,这个.jar文件其实就是我们上面操作的那个unity里面的classes.jar,不删除的话会报重复应用的错误的。

unity与android交互(2)_第3张图片

然后在这里其实就已经结束aar的修改了····是的,没有其他地方说的要改什么xml,改包名什么的·····就只是删除掉libs里面的classes.jar就可以了,然后看看他的xml文件

unity与android交互(2)_第4张图片

打开是这样

unity与android交互(2)_第5张图片

很干净,没有什么别的东西,然后记录一下这个名称,后面要用到com.tielubao.mylibrary01.MainActivity

把这个arr就可以丢进unity里面去了,目录为Plugins/Android文件夹里面,这样操作有一个前提,就是在unity项目中Plugins/Android里是已经存在xml配置文件的,才能这样操作,因为这个aar里面的配置文件什么都没有,所以不会报错,如果unity项目里没有已经存在的xml配置文件那这么干净的aar反而会报错···怕写太多反而乱,就不做unity项目里面的xml配置文件怎么操作了,这个其实超级简单。

话题再回过来,添加了aar之后,因为例子是用unity打开别的应用程序,需要用到住函数调用,所以把unity里面的xml打开,

 
      
        
        
        
        
        
        
      
      
      
    

主函数就是有这样一段话的activity

android:name="填写自己的类名"就是写上之前记录的com.tielubao.mylibrary01.MainActivity

然后现在就可以写C#代码了

 AndroidJavaClass aj = new AndroidJavaClass("com.tielubao.mylibrary01.MainActivity");
 AndroidJavaObject jo = aj.CallStatic("getActivity");
 jo.Call("openApp");

第一个语句就是调用我们的主函数类,接着调用静态方法得到MainActivity,最后就是调用方法了

以上就是unity调用java的方式。写的东西不多,就是需要操作几下。

如果想在Android里面调用unity里面的方法,这就很简单一句就搞定了,在MainActivity使用的方法里面添加

UnityPlayer.UnitySendMessage("游戏挂载体","方法名","");

 

第一个参数举例就是:”Main Camera“之类的游戏物体

第二个方法名需要唯一

最后一个参数需要传参数才写,不然就”“为空

一般如果想把游戏发行到海外,能检测googleplay是否有安装,再变态一点应该版本是不是最新的都可以检测,能让游戏体验加分不少,因为如果玩家手机版本不达标,游戏又是依赖于Google play存在这些那些的sdk那很容易造成游戏闪退,提前检测预警才能让玩家不至于突然的闪退觉得是游戏的原因而流失,Googleplay如何检测很轻松就能搜索到java的相关代码,放在自己的MainActivity里面然后通过aar打包来让unity使用,其实有点恶心的是这个aar涉及到import的关联操作了,检测googleplay需要google自己的jar文件,就类似于通过引用unity的classes.jar来让可以继承UnityPlayerActivity一样,目前的做法是因为本身unity项目有使用google登陆,相关的jar文件本身就引用在了unity里面,这也算侥幸,有时间再研究一下怎么aar打包连同引用的文件也可以一起打包进来

你可能感兴趣的:(unity学习)