Unity集成华为游戏服务SDK方式:Unity导出为Android工程

Posted 华为开发者论坛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity集成华为游戏服务SDK方式:Unity导出为Android工程相关的知识,希望对你有一定的参考价值。

原理介绍

Unity可以集成android sdk,主要有两种方式,将unity导出为android 工程集成sdk或者封装android接口插件到unity中接入sdk。本文档介绍unity导出为android 工程集成sdk方式。

这种方式顾名思义,将开发好的unity游戏工程导出为android项目,并import到android studio,按照android sdk集成文档集成,然后编译运行并进行测试即可。基于unity处理布局UI,所以在将unity工程导出之前,还需要添加unity与android交互逻辑,比如:unity这边点击按钮后需要调用并触发android sdk某逻辑事件,并在Android处理完成后接收调用结果等场景。


Unity端

一、在unity中布局场景

unity创建Scene,并实现如下场景布局,按钮分别对应游戏初始化,登录,应用自升级,获取玩家信息接口,其中浮标需要伴随应用生命周期调用,这里不设置按钮。

Unity集成华为游戏服务SDK方式(三):Unity导出为Android工程_ide

二、unity和Android交互代码实现

使用unity提供的与android的交互接口。交互的类AndroidJavaObject或者androidSdkClass实现android接口的调用,这里在unity先设置调用android函数的名称,导出后需要在android studio一一实现接口方法。

如:

androidSdkObject = new AndroidJavaObject("com.example.lianyungame.androidlibrary.SdkClass");//“”内对应的是android中与unity交互的类名

Scene中按钮分别绑定如下点击事件:

public void initial()

//调用android接口
Debug.Log("initial");
androidSdkObject.Call("init");// “”中的init表示需要调用的android接口名称,名称可以自定义,以下类同
public void login()

//调用android接口
Debug.Log("login");
androidSdkObject.Call("login");

public void getPlayer()

//调用android接口
Debug.Log("getPlayer");
androidSdkObject.Call("getGamePlayer");

public void checkUpdate()

androidSdkObject.Call("checkUpdate");

浮标接口:

private void OnApplicationPause(bool pause)

if (pause)

Debug.Log("hide floatWindow");
androidSdkObject.Call("hideFloat");

else

Debug.Log("show floatWindow");
if (androidSdkObject == null)

androidSdkObject = new AndroidJavaObject("com.example.lianyungame.androidlibrary.SdkClass");

androidSdkObject.Call("showFloat");

若需要接收android接口回调,unity中需要实现方法供android调用,以传递结果。

以获取玩家信息为例,其他接口雷同:


void getPlayerSuccess()

Debug.Log("getPlayerSuccess");

void getPlayerFailed(string code)

Debug.Log("getPlayerFailed,code:" + code);

到这里,unity的交互代码工作完成。

三、导出unity项目

将unity项目导出。打开File->Build Settings…

Unity集成华为游戏服务SDK方式(三):Unity导出为Android工程_android_02

确定下需要导出的场景是否已添加进来,没有添加需要点击Add Open Scene添加,如图:

Unity集成华为游戏服务SDK方式(三):Unity导出为Android工程_android_03

切换到Android平台,并勾选Export Project,待下面出现Export按钮后,点击Export等待导出结束。

Unity集成华为游戏服务SDK方式(三):Unity导出为Android工程_ide_04  

结束后文件结构列表如下,其中unityLibrary为unity场景和代码文件。

Unity集成华为游戏服务SDK方式(三):Unity导出为Android工程_java_05  

Android端

一、打开AS导入工程并编译

打开Android Studio,并导入工程,会因为gradle版本问题出现如下报错:

Unity集成华为游戏服务SDK方式(三):Unity导出为Android工程_ide_06

根据提示,可将本地环境中正常运行项目的gradle文件夹拷贝过来放入项目根目录下,然后点击File->Sync Project with Gradle Files同步,等待编译完成。

Unity集成华为游戏服务SDK方式(三):Unity导出为Android工程_java_07

二、unity与android代码交互

修改导出后项目的unityLibrary的build.gradle文件:

Unity集成华为游戏服务SDK方式(三):Unity导出为Android工程_java_08

将默认的implementation改为api,使应用级launcher可以依赖unityLibrary libs目录下的jar包,如下:

dependencies 
api fileTree(dir: libs, include: [*.jar])

复制

参考官方文档使用android studio正常集成sdk,并传递接口调用结果返回给unity。文档地址:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/integrate-as-sdk-0000001050435953

然后进行Android代码处理:

先根据文档实现接口,包含Application类的处理,以及各个功能接口接入等。编写class类并继承com.unity3d.player.UnityPlayerActivity,以便于后期通过UnityPlayer的currentActivity获取上下文环境。记得在AndroidManifest.xml文件中注册Application和activity类。

接下来依次实现unity中需要调用的android接口,方法名和参数要一一自行对应,比如获取玩家信息接口:

public void getGamePlayer() 
//调用getPlayersClient方法初始化
PlayersClient client = Games.getPlayersClient(UnityPlayer.currentActivity);
//获取玩家信息
Task<Player> task = client.getGamePlayer();
task.addOnSuccessListener(new OnSuccessListener<Player>()
@Override
public void onSuccess(Player player)
String accessToken = player.getAccessToken();
String displayName = player.getDisplayName();
String unionId = player.getUnionId();
String openId = player.getOpenId();
//获取玩家信息成功,校验accessToken,校验通过后启动游戏
UnityPlayer.UnitySendMessage("Canvas","getPlayerSuccess","");
Toast.makeText(UnityPlayer.currentActivity,"getplayer success",Toast.LENGTH_LONG).show();

).addOnFailureListener(new OnFailureListener()
@Override
public void onFailure(Exception e)
Toast.makeText(UnityPlayer.currentActivity,"getplayer failed",Toast.LENGTH_LONG).show();
if (e instanceof ApiException)
String result = "rtnCode:" + ((ApiException) e).getStatusCode();
UnityPlayer.UnitySendMessage("Canvas","getPlayerFailed","" + ((ApiException) e).getStatusCode());
//获取玩家信息失败,请根据错误码处理
if (7400 == ((ApiException) e).getStatusCode()||7018 == ((ApiException) e).getStatusCode())
// 7400表示用户未签署联运协议,需要继续调用init接口
// 7018表示初始化失败,需要继续调用init接口
init();



);

在接口调用成功或者失败处通过UnityPlayer.UnitySendMessage返回给unity端结果,参数依次对应为“挂载unity方法脚本文件的对象”、“方法名”、“参数”。Unity拿到结果后可自行做处理。其它接口雷同,这里不做描述。

以上就实现了unity与android studio的代码交互工作,可以自行编译测试接口功能啦。

其他接口类似,这里不再赘述。

以上是关于Unity集成华为游戏服务SDK方式:Unity导出为Android工程的主要内容,如果未能解决你的问题,请参考以下文章

Unity集成华为游戏服务SDK方式:Unity导出为Android工程

华为联机对战下载运行华为官方Unity示例代码,提示鉴权失败并返回错误码100114

Unity使用gradle接入sdk和打包

技术盘点:Unity SDK 开发中有哪些大坑?

技术盘点:Unity SDK 开发中有哪些大坑?

Unity 之 发布字节抖音小游戏