当前位置: 首页 > news >正文

Unity 之 发布字节抖音小游戏

Unity 之 发布字节抖音小游戏

  • 一,准备工作
    • 1.1 注册字节开发者后台
    • 1.2 Unity版本说明
    • 1.3 检查AppID是否有效
  • 二,开始集成
    • 2.1 创建项目
    • 2.2 接入SDK
  • 三,发布游戏
    • 3.1 发布安卓Apk
    • 3.2 发布双端WebGL
    • 3.3 IOS15.4版本问题

字节抖音小游戏是一种基于字节跳动产品生态开发且无需下载安装即可使用的全新游戏应用,实现了客户端“点开即玩”的优质用户体验。小游戏拥有开发轻便快捷,发布流程简单的特点,同时依托字节跳动生态优势,让小游戏天然具备较强的内容分发能力,支持小游戏开发者快速推广与变现。

一,准备工作

1.1 注册字节开发者后台

进入字节小程序开发者后台,在开发者平台中点击右上角的「快捷登录」进行帐号注册。在登录后需要通过【申请创建】提示完成申请流程即可。

然后等着字节小游戏通过注册时的手机号或邮箱给予的答复。工作日提交的话一般在几个小时之内就有答复,最长时间为两个工作日之内。

注册后按照要求填写资质信息:公司就写企业全称,个人开发者填写个人姓名,然后其他内容根据要求填写。


其中需要注意的是小游戏体验路径:一般是一个可用的测试链接或者是一个网盘地址里面放一个可以玩的apk。(我们写过苹果商店地址审核失败了,应该是IOS的不行)


1.2 Unity版本说明

如果使用 natvie 方案:确认游戏工程运行在 Unity 2019.4.8f1 或者 Unity 2019.4.35f1

如果使用 wasm 方案:建议使用 unity 最新版,比如 2021.2 之后的版本,在 wasm 方面做了很多优化

可以用 2019.4.8 构建 native 版本,用 2021.x 构建 wasm,一起发布。

我前几天测试了2019.4.35f1c1,2019.4.8f1,Unity2021.3.3f1c1版本都是可以使用的,

不过在7月26号看到有开发者反馈说2019.4.8f1不好用了,官方回复:最近因为Android 12 的普及新增崩溃太多了,所以发新版需要升级了。

因为插件本身也在开发中,所以建议在开发是加入意见反馈群(在官方文档文末),及时关注动态,以免重复趟坑。

我这里用的是Unity2021.3.3f1c1版本:

发布Android就在下载时添加:Android Build Support 模块:

发布WebGL的话就在下载时添加:WebGL Build Support 模块:
(想上线IOS的话只能使用WebGL的方式进行发布)

1.3 检查AppID是否有效

审核通过后就可以在应用中心看一个以07结尾且长度是20位AppID,若不是需要重新申请(后面打包时用)


二,开始集成

2.1 创建项目

下载字节SDK:开发者后台,建议先读一遍文档,因为当你看的时候有可能有更新:

导入后在工具栏选:ByteGame --> ByteGame Develop Tools

打开后下载:StarkSDKStarkSDKUnityTools两个包:

下载完成后目录大致如下:


2.2 接入SDK

发布抖音小游戏,只需要一个录屏分享功能即可上线。所以这里只提供录屏和分享功能示例,其他功能可按需接入,官方文档地址。

逻辑也非常简单,创建三个按钮分别为开始游戏,游戏结束,分享录屏来模拟游戏过程中的功能实现;带有详细注释的接入代码如下:

using System.Collections;
using System.Collections.Generic;
using StarkSDKSpace;
using UnityEngine;
using UnityEngine.UI;

public class StarkSDKTest : MonoBehaviour
{
    public Button startBtn;
    public Button endBtn;
    public Button shareBtn;
 
    void Start()
    {
        startBtn.onClick.AddListener(StartVideo);
        endBtn.onClick.AddListener(StopVideo);
        shareBtn.onClick.AddListener(ShareVideo);
    }

    void StartVideo()
    {
        Debug.Log("抖音 开启录制视频 ...");
        // <param name="isRecordAudio">是否录制声音,默认为录制声音</param>
        // <param name="maxRecordTimeSec">最大录制时长,单位 s。小于等于 0 则无限制。默认为10分钟</param>
        // <param name="startCallback">视频录制开始回调</param>
        // <param name="errorCallback">视频录制失败回调</param>
        bool isStart = StarkSDK.API.GetStarkGameRecorder().StartRecord(true, 200,
            StartCallback, FailedCallback, SuccessCallback);
        Debug.Log("视频开启录制结果 ..." + isStart);
    }

    void StopVideo()
    {
        Debug.Log("抖音 停止录制视频 ...");
        bool isStop = StarkSDK.API.GetStarkGameRecorder().StopRecord(SuccessCallback, FailedCallback, null, false);
        Debug.Log("停止录制视频状态 ..." + isStop);
    }

    void StartCallback()
    {
        Debug.Log("视频开始录制回调执行 ...");
        // 开始回调逻辑,比如:显示录屏中按钮
    }

    void FailedCallback(int errCode, string errMsg)
    {
        Debug.Log("录制视频失败回调执行 ... 错误码是:" + errCode + " ,错误消息是:" + errMsg);
        // 失败回调逻辑,比如:隐藏录屏中按钮
    }

    void SuccessCallback(string videoPath)
    {
        Debug.Log("视频录制完成实际路径:" + videoPath);
        // 成功回调逻辑,比如:隐藏录屏中按钮
    }

    void ShareVideo()
    {
        Debug.Log("ShareVideo ShareVideo ...");
        // 只有回调,不带预定义标题和话题
        StarkSDK.API.GetStarkGameRecorder().ShareVideo(SuccessCallback, FailedCallback, CancelledCallback);

        // <param name="successCallback">分享成功回调</param>
        // <param name="failedCallback">分享失败回调</param>
        // <param name="cancelledCallback">分享取消回调</param>
        // <param name="title">分享视频的标题,如不需要设置标题,可以传null或空字符串</param>
        // <param name="topics">分享视频的话题,如不需要设置话题,可以传null或空列表</param>
        //StarkSDK.API.GetStarkGameRecorder().ShareVideoWithTitleTopics(SuccessCallback, FailedCallback,
        //    CancelledCallback, "自定义标题", new List<string>() {"自定义话题1", "自定义话题2"});

        void SuccessCallback(Dictionary<string, object> dictionary)
        {
            Debug.Log("视频分享成功回调 ...");
            // 成功回调逻辑,比如:弹窗提示并发放奖励
        }

        void CancelledCallback()
        {
            Debug.Log("取消分享回调 ...");
            // 取消回调逻辑,比如:弹窗提示
        }

        void FailedCallback(string errMsg)
        {
            Debug.Log("分享视频失败回调执行 ... " + " ,错误消息是:" + errMsg);
            // 失败回调逻辑,比如:弹窗提示
        }
    }
}

最后将代码挂载到游戏场景中并将上面创建的三个按钮赋值给代码中预留的公开变量。

然后运行:点击开始游戏按钮 -——> 调用录屏逻辑 -——> 游戏中出现:开发阶段…文字提示,-——> SDK接入成功 -——> 进入真机测试阶段。


三,发布游戏

在工具栏选择 ByteGame --> StarkSDKTools --> Build Tool 即可打开打包的工具面板

3.1 发布安卓Apk

在面板的运行框架选择Native,然后按照需求填写,构建即可。


3.2 发布双端WebGL

在面板的运行框架选择WebGL,然后选择构建WebGL:

构建完成后,会在指定目录生成 --> 一个webgl的目录和一个压缩包,如下图:

然后在3.1图1中选择发布WebGl:

最后按需填写完成后,选择发布,等待发布完成即可在弹出二维码,使用抖音扫描就可以进行测试了。


3.3 IOS15.4版本问题

测试IOS时发现,使用IOS15.4版本的测试机,不能成功加载出游戏场景,报错如下:

报错原文:

10:08:30.703 exception thrown: RuntimeError: Out of bounds memory access (evaluating ‘dynCall_ii(index,a1)’),<?>.wasm-function[59627]@[wasm code]
.wasm-function[146029]@[wasm code]
.wasm-function[83839]@[wasm code]
wasm-stub@[native code]
invoke_ii@blob:file:///ce3cf2cf-9cb3-4723-a499-98a7b0c93a71:3:413696
.wasm-function[83839]@[wasm code]
.wasm-function[19042]@[wasm code]
.wasm-function[1057]@[wasm code]
.wasm-function[66513]@[wasm code]
.wasm-function[4560]@[wasm code]
.wasm-function[118584]@[wasm code]
wasm-stub@[native code]
invoke_iii@blob:file:///ce3cf2cf-9cb3-4723-a499-98a7b0c93a71:3:411844
.wasm-function[118584]@[wasm code]
.wasm-function[2239]@[wasm code]
.wasm-function[63653]@[wasm code]
.wasm-function[18940]@[wasm code]
.wasm-function[541]@[wasm code]
.wasm-function[540]@[wasm code]
.wasm-function[111580]@[wasm code]
.wasm-function[134747]@[wasm code]
.wasm-function[18950]@[wasm code]
.wasm-function[118583]@[wasm code]
wasm-stub@[native code]
invoke_iiii@blob:file:///ce3cf2cf-9cb3-4723-a499-98a7b0c93a71:3:412366

应该unity引擎有些代码变动导致,一个相关说明

解决方法:升级IOS版本就不会有问题啦。


相关文章:

  • Web配置过滤器,Cookie对象的简单使用
  • 进程入门与PCB基础知识.
  • 【云原生】设备云之基于FlexManager的C#SDK开发案例代码
  • Rust(7):数组类型
  • STM32——FLASH闪存编程原理与步骤
  • 计算机毕业设计之java+javaweb的大学生就业帮助系统-就业招聘网站
  • 跳表论文解读
  • 1061:求整数的和与均值
  • Day04JavaWeb第四次笔记---Maven的使用
  • Unrecognized option: --no-transfer-progress
  • 加载指定 having lines separator 时max_data_processor 不起作用
  • 高薪程序员面试题精讲系列150之电商专题(上)-你们的电商项目有什么特色?是B2B还是B2C、还是C2C的?直播电商你了解吗?
  • kafka是啥?虽然很难学,但是实验入门很简单
  • MySQL8.0 索引优化-invisible index
  • 基于java仓库管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  • 【391天】每日项目总结系列128(2018.03.03)
  • django开发-定时任务的使用
  • java8-模拟hadoop
  • Java应用性能调优
  • OSS Web直传 (文件图片)
  • PHP 的 SAPI 是个什么东西
  • React-flux杂记
  • SSH 免密登录
  • Swoft 源码剖析 - 代码自动更新机制
  • windows-nginx-https-本地配置
  • 搭建gitbook 和 访问权限认证
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 深度学习在携程攻略社区的应用
  • 探索 JS 中的模块化
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 再谈express与koa的对比
  • 中文输入法与React文本输入框的问题与解决方案
  • # centos7下FFmpeg环境部署记录
  • #includecmath
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #NOIP 2014#Day.2 T3 解方程
  • #WEB前端(HTML属性)
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (区间dp) (经典例题) 石子合并
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)用.Net的File控件上传文件的解决方案
  • .Net CF下精确的计时器
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET gRPC 和RESTful简单对比
  • .Net IE10 _doPostBack 未定义
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net 高效开发之不可错过的实用工具
  • .NetCore 如何动态路由
  • .NET设计模式(2):单件模式(Singleton Pattern)