游戏发行之鸿蒙SDK
大家好,我是村长,本篇文章向大家分享下游戏发行的鸿蒙SDK实现方案。
需求背景
随着纯血鸿蒙(不再兼容android包)的发布,对于游戏发行来说,相当于要重新开发一款鸿蒙游戏SDK。这时候就面临以下几个问题。
问题
鸿蒙是否有类似Android aar一样的文件,提供给研发接入?
答:鸿蒙可以将代码和资源封装成Har,类似于Android的aar文件。研发可将Har文件放入工程,并进行依赖。
鸿蒙SDK如何实现界面开发?
答:目前鸿蒙SDK实现界面开发有两种思路,一种是使用自定义Dialog来完成界面开发。一种则是封装好一个对外View,让研发嵌套进游戏主页面中(本文详细讲解这种开发方案)。
鸿蒙是否支持二次重打包?
答:鸿蒙截止目前,不支持对App包进行二次重签名,从而无法实现二次重打包。如果SDK有变更,只能重新出Har给研发重新接入,并由研发出游戏包。
界面开发
开发语言
开发界面前,首先要搞明白鸿蒙可以用什么语言进行开发。 目前鸿蒙支持ArkTS语言和TypeScript语言进行混合开发。但需要注意以下几个问题
1、调用关系
他们之间并不是可以相互调用的关系。
2、语言的使用场景
UI的编写,必须使用ArkTs编写。工具类则可以使用ArkTs/TypeScript
注意事项
我们对外提供给研发调用的方法文件(除了View),必须使用TypeScript编写。避免因为使用了ArkTs,而研发的类为TypeScript无法调用。
SDK页面如何嵌套进游戏主页面?
我们首先需要先了解一下鸿蒙的层叠布局(Stack),才能够理解如何将SDK页面嵌套进游戏主页面中。
层叠布局(Stack)介绍
鸿蒙的层叠布局类似于Android的FrameLayout布局。后放入的View,会覆盖在之前的View上面。
研发添加SDK View
由于鸿蒙是声明式UI,所以需要让研发在游戏主界面中,使用层叠布局(Stack)将我们的SDK View添加在最下面。这样 SDKContainerView 的内容可以展示在游戏内容之上。
struct Index {
build() {
Stack() {
......
//游戏主界面View
......
//SDK的View
SDKContainerView()
}
.width('100%')
.height('100%')
}
}
SDKContainerView代码实现
上面已经实现了SDK View的占位,接下来就讲解一下SDKContainerView的实现。 众所周知,一款游戏SDK包含了非常多的页面,比如登录页,注册页,社区活动页等。
问题
细心的小伙伴不禁会发出疑问,上面只是放了一个View。如何能够实现多界面的展示和切换呢?
实现逻辑
上面的SDK view实际上只是一个提供展示其他页面的容器。可以在其中设置状态变量来动态切换需要展示的页面。
@State装饰器
@State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。
代码实现逻辑
@Preview
@Component
export struct SDKContainerView {
//初始状态为空页面,不展示任何内容
@State viewType: ViewType = new BlankViewType();
build() {
//如果当前状态为登录页面,则展示登录页
if (this.viewType && this.viewType instanceof LoginViewType) {
LoginView()
}
//如果当前状态为注册页面,则展示注册页
if (this.viewType && this.viewType instanceof RegisterViewType) {
RegisterView()
}
}
//在执行其build()函数之前执行,设置viewType的监听
aboutToAppear() {
//其他SDK类可以通过ViewStateManager来修改viewType值
//从而显示相对应的页面
ViewStateManager.observe({
change: (type: ViewType) => {
this.viewType = type
}
})
}
}
总结
到此就已经介绍完鸿蒙SDK 界面开发,以及如何让研发嵌套SDK的流程。该方案的优点相对于用自定义Dialog,可操作空间更大。界面改动时,更加方便灵活。 当然它也存在一些缺点,研发需要修改游戏主界面,才能够让SDK显示界面(对研发的代码存在一定的侵入性)
欢迎讨论
由于篇幅有限,上述主要分享了鸿蒙SDK的界面开发实现逻辑,希望对一些小伙伴有帮助。如果有任何问题或更好的方案,欢迎大家评论区一起讨论~