Gvr Unity SDK (六) —— Unity调用Android接口

上一篇讲了《Gvr Unity SDK (五) —— 添加全景SkyBox》,在Unity的工作空间中如何为自定义添加全景SkyBox,本节学习如何使用Unity3d调用Android代码接口

Unity 调用Android的代码接口,需要将Android逻辑代码写好,然后打包成架包放到Unity3d中,提供给Unity3d调用,本节以一个简单的示例来说明。

Android 端

创建Android项目

首先打开Android Studio ,新建一个Android项目GvrSample

gvr6-1.png

然后,找到Unity安装目录,在如下路径找到classes.jar文件

gvr6-2.png

classes.jar文件复制粘贴到Android Studio工程里app/libs下面

gvr6-3.png

之后选中该classes,jar 文件,右键==> Add as Library,弹出的Module选择app ,点击ok,等待系统添加完成

编写功能逻辑代码

MainActivity下面,更改默认的AppCompatActivityUnityPlayerActivity,去掉OnCreate方法里面的布局调用代码。

这里,以Unity端4个Button点击,调用该类的4个方法,输出指定的信息为例

gvr6-4.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//无参数无返回值的方法
public void Method_A() {
Log.d(TAG, "Method_A: 调用=>[无参数、无返回值]A方法");
Log.d(TAG, "Method_A: 没有传递参数给我,不需要返回参数给Unity3d");
}

//无参数有返回值的方法
public String Method_B() {
Log.d(TAG, "Method_B: 调用=>[无参数、有返回值的B方法");
Log.d(TAG, "Method_B: 没有传递参数给我,需要返回特定的数据给Unity3d");
return "方法B中某特定返回值";
}

//有参数无返回值的方法
public void Method_C(int a) {
Log.d(TAG, "Method_C: 调用=>[有参数、无返回值]的C方法");
Log.d(TAG, "Method_C: 有传递参数"+a+"给我,不需要返回特定的数据给Unity3d");
}

//有参数有返回值的方法
public String Method_D(int a,int b) {
Log.d(TAG, "Method_D: 调用=>[有参数、有返回值]的D方法");
Log.d(TAG, "Method_D: 有传递参数"+a+","+b+"给我,需要返回特定的数据给Unity3d");
if (a>b){
return "方法D中,返回最大值:"+a;
}
return "方法D中,返回最大值:"+b;
}

打开app下面的builde.gradle文件,更改apply com.android.applicationcom.android.library,之后,删除或者注释下面的 applicationId,点击右上角的Sync Now,最后,选择菜单栏Build==>Build Apk

gvr6-5.png

然后会在app/build/output/aar下面生成app-debug.aar文件

gvr6-6.png

获得Android接口

将生成好的app-debug.aar文件拷贝出来,然后该后缀并解压到文件夹下,其中的classes.jar文件就是后面需要用到的了

Unity3d 端

新建Unity3d项目,3D 类型

创建 UI

在工作空间左侧的Hierarchy下新建一个Button,结构为Canvas/Button/Text,选中Canvas,再右侧的Inspector下面的Canvas属性,更改Render ModeWorld Space

gvr6-7.png

然后设置它的WidthHight都为200dp

gvr6-8.png

就是这样的效果

gvr6-9.png

现在,选中Button,按Ctrl+D,在Button下面克隆出Button (1)、Button (2)、Button (3)

gvr6-10.png

选中这4个Button,沿着Y轴拖拽按钮,使它的位置在Canvas矩形框范围内的顶部

gvr6-11.png

选中左侧Button (1) ,沿着Y轴向下,调整好Button (1)的位置

gvr6-12.png

选中Button (2) ,沿着Y轴向下,调整好Button (2)的位置

gvr6-13.png

选中Button (2) ,沿着Y轴向下,调整好Button (3)的位置

gvr6-14.png

接下来就是修改按钮上面文字了

展开Cavans/Button,选中里面的Text控件,在右边的Text (Script)下修改Text无参数无返回值

gvr6-15.png

同理,展开Cavans/Button (1),选中里面的Text控件,在右边的Text (Script)下修改Text无参数有返回值

gvr6-16.png

展开Cavans/Button (2),选中里面的Text控件,在右边的Text (Script)下修改Text有参数无返回值

gvr6-17.png

展开Cavans/Button (3),选中里面的Text控件,在右边的Text (Script)下修改Text有参数有返回值

gvr6-18.png

再次选中Canvas,在右侧的Inspector里面设置Pos xPos YPos Z都为0,同时,修改下面的Scale 对应的 XYZ值为0.25,

gvr6-19.png

点击Main Camera可以看到当前的UI视图,但是还需要调整

gvr6-20.png

再次选中Canvas,右侧设置Pos Z 值为40,可以合适的看到场景中的UI了

gvr6-21.png

添加GVR SDK

现在需要参照之前的做法,导入gvr-unity-sdk下面的packge,将GvrViewerMainGvrReticle拖到Hierarchy指定的地方,点击播放按钮进行播放,查看效果

gvr6-22.png

gvr6-23.png

创建响应脚本

Assets下新建一个Script文件夹,创建一个Button1 C# 脚本

gvr6-24.png

同理,在下面依次创建Button2Button3Button4

gvr6-25.png

编写脚本内容

分别用VS或者Mono打开 Button1、Button2、Button3、Button4这四个脚本文件

  • Button1,创建调用无参数无返回值的A方法
1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
using System.Collections;

public class Button1 : MonoBehaviour {

public void CallAndroidMethod_A(){

AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
jo.Call ("Method_A");
}
}
  • Button2,创建调用无参数有返回值的B方法
1
2
3
4
5
6
7
8
9
10
11
12
13
using UnityEngine;
using System.Collections;

public class Button2 : MonoBehaviour {

public void CallAndroidMethod_B(){

AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
string getMethod_B=jo.Call<string> ("Method_B");
Debug.Log ("getMethod_B:==>" + getMethod_B);
}
}
  • Button3,创建调用有参数无返回值的C方法
1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
using System.Collections;

public class Button3 : MonoBehaviour {

public void CallAndroidMethod_C(){

AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
jo.Call("Method_C",1);
}
}
  • Button4,创建调用有参数有返回值的D方法
1
2
3
4
5
6
7
8
9
10
11
12
13
using UnityEngine;
using System.Collections;

public class Button4 : MonoBehaviour {

public void CallAndroidMethod_D(){

AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
string getMethod_D=jo.Call<string> ("Method_D",1,2);
Debug.Log ("getMethod_D:==>" + getMethod_D);
}
}

添加物理响应和事件触发

Main Camera添加Physics Raycaster

gvr6-26.png

Event System添加Gaze Input Module并移到standalone Input Module上面

gvr6-27.png

为Button绑定脚本事件

选中Button在右边Add Component添加Button1脚本,并添加Event Trigger响应事件,在Event Trigger里添加Pointer Click事件,绑定到控件Button,调用脚本Button1里面的CallAndroidMethod_A()方法

gvr6-28.png

同理,选中Button (1)在右边Add Component添加Button2脚本,并添加Event Trigger响应事件,在Event Trigger里添加Pointer Click事件,绑定到控件Button (1),调用脚本Button2里面的CallAndroidMethod_B()方法

gvr6-29.png

选中Button (2)在右边Add Component添加Button3脚本,并添加Event Trigger响应事件,在Event Trigger里添加Pointer Click事件,绑定到控件Button (2),调用脚本Button3里面的CallAndroidMethod_C()方法

gvr6-30.png

选中Button (3)在右边Add Component添加Button4脚本,并添加Event Trigger响应事件,在Event Trigger里添加Pointer Click事件,绑定到控件Button(3),调用脚本Button4里面的CallAndroidMethod_D()方法

gvr6-31.png

添加Android 接口到Unity

将上面打包解压后的classes.jarAndroid功能架包添加到Plugins/Android/libs

gvr6-32.png

修改合并Plugins/Android下的AndroidManifest.xml

gvr6-33.png

运行并响应事件

按照前面讲的,打包时填写的公司名和产品名,要和下面对应一致,并且同时也要和android端的包名一致。

当点击第一个按钮: 无参数无返回值

gvr6-34.png

输出:

gvr6-35.png

当点击第二个按钮: 无参数有返回值

gvr6-36.png

输出:

gvr6-37.png

当点击第三个按钮: 有参数无返回值

gvr6-38.png

输出:

gvr6-39.png

当点击第四个按钮: 有参数有返回值

gvr6-40.png

输出:

gvr6-41.png

本节gvr-unity-sdk之Unity调用Android接口相关内容到此结束,更多功能需要自行扩展,下一节继续《Gvr Unity SDK (七) —— Unity 添加图片》

0%