关于独立游戏开发者及团队接入TapSDK及实名认证和防沉迷系统的相关学习

准备工作

请配合 Tap 开发者手册 TapTap 开发者文档 阅读本篇文章。

Unity 部分

  首先你的游戏工程文件得是安卓。

  由于 Tap 开发者手册中推荐最低 Android 版本为 10 及以上,也就是 API Level 29。查看 Unity 的 APK 打包中有无此版本的安卓包,如果没有则需要去到相关网站并下载 Android Tool 再下载指定的安卓包版本。流程详见 下载 Android SDK tools 完成 Android SDK 安装、配置环境变量

  由于 Tap 仅支持上架 64 位 APK 包,而在 Unity 中用 Mono 后端打包无法指定生成 64 位,所以我们要选择 IL2CPP 打包,取消勾选 ARMv7,勾选 ARM64

Tap 开发者中心板块

  1. 创建游戏
    进入 游戏服务开启服务,在 应用配置 界面开通 TapTap 登录。

  1. 配置签名证书
    如果没有,则前往 香蕉云编 - App 打包上架工具类平台 制作个人签名,并在 香蕉云编 - 查看 App 的 SHA1 值 查看签名的 MD5 值(去掉符号)。
    下载 Package Names Viewer 软件到手机,查看游戏包名(一般是 com.开发商名.游戏名)。
    进入 TapTap 登录界面,然后在 TapTap 登录界面把自己的账号添加进测试人员名单。

  1. 合规认证
    最后在 合规认证 选择 无版号,然后开通服务。

导包

  前言:如果按照开发者手册中的第二种方法(即手动导包)还要配置一大堆东西,稍微出点错即使没有出错也会导致 packages 无法正常导入或引用的问题,所以我们无论如何也得学会第一种导包方式,这种导包方式对以后的其他导包也有帮助。

配置 Git

  首先下载 Git 并安装:Git 官网

  然后关闭 Unity 和 Unity Hub 后台程序,根据开发者手册指示修改文件。

  上图只是 TapSDK 的包,我们还需要实名认证的包,故按照上述操作顺序修改完整的 manifest.json,如下,添加完整的 4 个包名:

1
2
3
4
5
6
7
{
"com.leancloud.realtime": "https://github.com/leancloud/csharp-sdk-upm.git#realtime-0.10.14",
"com.leancloud.storage": "https://github.com/leancloud/csharp-sdk-upm.git#storage-0.10.14",
"com.taptap.tds.bootstrap": "https://github.com/TapTap/TapBootstrap-Unity.git#3.12.1",
"com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.12.1",
"com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.12.1"
}

  最后经过实测,如果按上述方法导入 Anti 防沉迷包会出现无法引用的问题,所以我们 科学上网 另外在官方提供的 GitHub 网站下载该包 TapAntiAddiction,并直接拖入工程 Assets 文件夹中手动导包。

  然后先 科学上网,再打开 Unity 进入工程,因为 Unity 需要在 GitHub 网站下载相关 Tap 包。如果仍然不行,就再关闭 Unity 及 Unity Hub 后台,再次科学上网。如果仍然无法加载,就在 Package Manager 反复切换 注册表中的包项目中的包,并配合手动刷新,直到出现以下画面:

关于开发者手册中在 Unity 配置安卓的问题

  经实测,勾不勾选 都不影响打包后的 APK 在手机上运行,并且如果勾选且按开发者手册步骤修改 XML 文件,会导致打包出来的 APK 文件安装到手机后打不开软件,提示 app isn't installed 的问题,所以我们选择跳过该步骤,不勾选此项。

  至此,准备工作就绪,正式开始实现功能之前,请先浏览一遍各项功能实现的顺序:

  1. 初始化 TapSDK
  2. 初始化实名认证
  3. 开始 Tap 账号登录
  4. 开始实名认证并启动防沉迷系统
  5. Tap 登录和实名认证板块对接
  6. 实现静默登录
  7. 实现反沉迷一系列功能

项目引用

1
2
3
4
5
6
7
using System;
using TapTap.Bootstrap;
using TapTap.Common;
using TapTap.Login;
using UnityEngine;
using Plugins.AntiAddictionUIKit;
using System.Collections;

初始化 TapSDK

1
2
3
4
5
6
7
8
9
10
11
private void InitTapSdk()
{
var config = new TapConfig.Builder()
.ClientID("xxxxxxx")
.ClientToken("xxxxxxxxxxxxxxxxx")
.ServerURL("https://xxxxxxxxxxxxxx.cloud.tds1.tapapis.cn")
.RegionType(RegionType.CN)
.ConfigBuilder();

TapBootstrap.Init(config);
}

初始化防沉迷模块

  接入反沉迷系统的前言:Tap 官方声明:自 2022 年 8 月起,请确保上架应用需要接入 TapSDK 及防沉迷系统,所以此篇文章默认 TapSDK 和反沉迷板块都得实现。因此,我们将登录模块和防沉迷系统合并实现。

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
29
30
31
32
33
34
35
36
37
38
39
// 游戏的 ClientID
string gameIdentifier = "xxxxxxxxxxx";

// 是否启用时长限制功能
bool useTimeLimit = true;

// 是否启用消费限制功能
bool usePaymentLimit = false;

// 是否显示切换账号按钮
bool showSwitchAccount = false;

public IEnumerator InitAnti() // 用协程来写该函数的原因在对接登录和实名认证模块解释
{
AntiAddictionUIKit.Init(gameIdentifier, useTimeLimit, usePaymentLimit, showSwitchAccount,
(antiAddictionCallbackData) =>
{
int code = antiAddictionCallbackData.code;
MsgExtraParams extras = antiAddictionCallbackData.extras;

// 根据 code 不同提示玩家不同信息,详见开发者手册的回调部分
if (code == 500) // 该回调可忽略
{
// 开始计时
AntiAddictionUIKit.EnterGame();
Debug.Log("玩家登录后判断当前玩家可以进行游戏");
}
},
(exception) =>
{
// 处理异常
}
);

yield return new WaitForSeconds(1); // 后文解释
OnLoginClicked(); // 开始 TapTap 登录
yield return new WaitForSeconds(1); // 后文解释
StartAnti(); // 开始实名认证
}

  完成两部分的初始化函数后,首先我们在 Awake() 函数中进行两部分的初始化。
经实测,两部分的初始化顺序无冲突。

1
2
3
4
5
public void Awake()
{
InitTapSdk();
StartCoroutine(InitAnti());
}

实现 TapTap 登录功能

  该功能会拉起 TapTap 登录界面。
  经实测,第一次登录需要联网,后续如果实现了静默登录后则不需要联网即可登录。

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
bool useTapLogin = false; // 在 Login 后传入 true
string userIdentifier = "玩家的唯一标识"; // 在 Login 后传入该玩家的唯一标识

public async void OnLoginClicked() // 官方 Demo 通过用 Button 来执行登录功能,故函数名为此,各位根据实际需求来修改
{
try
{
var tdsUser = await TDSUser.LoginWithTapTap(null);
userIdentifier = tdsUser.ObjectId;
label = $"login Success:{tdsUser}";
Debug.Log($"login Success:{tdsUser}");
useTapLogin = true;
}
catch (Exception e)
{
if (e is TapException error)
{
label = $"Login Error:{error.code} message:{error.message}";
}
else
{
label = $"Login Error:{e}";
}
throw;
}
}

实现实名认证及防沉迷系统

1
2
3
4
5
6
7
8
9
10
public void StartAnti()
{
AntiAddictionUIKit.Startup(useTapLogin, userIdentifier); // 从登录功能执行后获取到的两变量

int ageRange = AntiAddictionUIKit.CurrentUserAgeLimit(); // 此临时变量是玩家年龄段,详见开发者手册,如果显示 -1 则需要刷新重新显示

AntiAddictionUIKit.EnterGame();

// GameManager.m_game.m_loadingScreen.LoadScene(); 此处即可跳转场景,各位根据需求选择是否实现
}

调试 TapTap 快速登录后与实名认证的对接

  这部分本不应该出现,出现的原因是因为 IL2CPP 打包后需要从函数包中调取该函数名来构成完整函数,及函数抽壳的加密方式。
  详见:关于 Unity 的 IL2CPP 打包后反编译探索的个人学习成果

  此过程需要时间来执行,所以导致我用Mono 打包时能正常执行但是用il2cpp打包后执行出现时间差,导致登录后获取的变量来不及传入实名认证板块时就已经执行了实名认证,最终报错,卡在实名认证页面,不能进入游戏。(首次登录正常,但后续登录报错)作者想到的临时解决办法是,用协程来编写初始化实名认证及防沉迷板块,在登录和实名认证两部分插入 1s 的等待时间,使登录有足够的时间来传入变量。
  代码如下(已在 InitAnti() 函数中实现):

1
2
3
4
5
6
7
8
9
10
public IEnumerator InitAnti()
{
yield return new WaitForSeconds(1); // 此处解释

OnLoginClicked(); // 开始 TapTap 登录

yield return new WaitForSeconds(1); // 此处解释

StartAnti(); // 开始实名认证
}

实现静默登录功能

  静默登录:首次登录后,后续登录从 游戏缓存 中获取上一次的登录信息,即 不需要再手动登录,从而实现自动登录的功能。
  开发者手册中预留了该功能接口 TapLogin.GetAccessToken(),详见文档:检查登录状态和用户信息。
  直接修改最开始的登录函数即可,修改后的登录函数如下:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
public async void OnLoginClicked()
{
try // 此 try-catch 加入静默登录功能
{
var accesstoken = await TapLogin.GetAccessToken();
Debug.Log("已登录");

// 直接进入游戏
var profile = await TapLogin.GetProfile();
userIdentifier = profile.openid;
useTapLogin = true;
}
catch (Exception e)
{
Debug.Log(e);
Debug.Log("当前未登录");

// 开始登录
try
{
var tdsUser = await TDSUser.LoginWithTapTap(null);
userIdentifier = tdsUser.ObjectId;
label = $"login Success:{tdsUser}";
Debug.Log($"login Success:{tdsUser}");
useTapLogin = true;
}
catch (Exception f)
{
if (f is TapException error)
{
label = $"Login Error:{error.code} message:{error.message}";
}
else
{
label = $"Login Error:{f}";
}

throw;
}
}
}

实现防沉迷系统的相关功能

  根据 Tap 开发者团队的解释,我们只需要 开始和停止记录游戏时长 即可,该模块会 自动轮番上报游戏时长,且自动弹出 未成年人超时界面

  我们主要在 实名认证函数 内执行 开始记录游戏时长 的接口(上文已添加,此处不做修改)。
  需要读者 在退出游戏的函数内 自行添加执行 停止计时 的接口。

1
2
3
4
public void StopAnti()
{
AntiAddictionUIKit.LeaveGame(); // 停止计时
}

  至此,所有工作完成。
  - 把该脚本挂载到 进入游戏后的登录 Scene 的 GameObject 上,并将其丢进 DontDestroyOnLoad
  - 推荐挂载到 GameManager,方便调用,且该对象会一直保留到退出游戏进程。

  最后,祝愿各位独立游戏开发者及团队的游戏能成功上架 TapTap,希望所有用心开发的国产游戏都能获得游戏版号!