14. 打包发布上线

专栏收录该内容

Hi I'm Shendi



WebGL

首先配置WebGL部分

点击菜单的文件 - 生成设置(或者Ctrl+Shift+B)

代码优化选大小,IL2CPP选更快更小生成

设置


然后按照之前的方法转换成小游戏即可

期间Unity控制台报错的话则要解决完错误再次打包。



问题解决

报了以下错误

Assets\Scripts\Main.cs(513,17): error CS0103: The name 'EditorUtility' does not exist in the current context


这部分是商品购买弹出的弹窗,既然不能使用,那就只能自己用UI写弹窗了

制作的弹窗UI效果如下

弹窗


在代码内动态更改弹窗内容,使用一个变量来指定点击按钮1执行什么操作

Main中定义以下变量

 /// <summary>
/// 弹窗
/// </summary>
public GameObject dialog;
/// <summary>
/// 弹窗点击按钮1做什么操作
/// </summary>
[HideInInspector]
public string dialogOkType;
/// <summary>
/// 弹窗点击按钮1携带的参数
/// </summary>
[HideInInspector]
public Dictionary<string, object> dialogOkData;

将弹窗拖到摄像机的Main对应变量中,然后取消勾选弹窗,让其隐藏


在 Main 中增加两个点击事件,一个按钮1点击(处理内容然后隐藏),一个按钮2点击(直接隐藏)

/// <summary>
/// 弹窗按钮1点击
/// </summary>
public void DialogOk()
{
    switch (dialogOkType)
    {
        case "buyShop":
            State.gold -= (int) dialogOkData["gold"];
            curBuyWeapon.Add((string)dialogOkData["weapon"]);
            ShopWeaponClick((string)dialogOkData["weapon"], (GameObject)dialogOkData["clickObj"]);
            OpenShop();
            break;
    }

    // 隐藏弹窗
    DialogHide();
}

public void DialogHide()
{
    dialog.SetActive(false);
}

增加函数用于代码内调用显示弹窗

public void ShowDialog(string title, string content, string btn2Name)
{
    ShowDialog(title, content, null, btn2Name);
}
public void ShowDialog(string title, string content, string btn1Name, string btn2Name)
{
    dialog.transform.GetChild(0).GetComponent<Text>().text = title;
    dialog.transform.GetChild(1).GetComponent<Text>().text = content;
    var btn1 = dialog.transform.GetChild(2);
    var btn1IsShow = btn1Name != null;
    btn1.gameObject.SetActive(btn1IsShow);
    if (btn1IsShow)
    {
        btn1.GetChild(0).GetComponent<Text>().text = btn1Name;
    }
    dialog.transform.GetChild(3).GetChild(0).GetComponent<Text>().text = btn2Name;

    dialog.SetActive(true);
}

在购买商品(ShopWeaponClick)部分,代码部分更改如下

public void ShopWeaponClick(string weapon)
{
    ShopWeaponClick(weapon, null);
}

/** 武器商品点击 */
public void ShopWeaponClick(string weapon, GameObject clickObj)
{
    if (clickObj == null) clickObj = EventSystem.current.currentSelectedGameObject;

    if (!isBuy)
    {
        // 检查是否有足够的金额,没有则弹出提示,这里直接通过按钮的文字获取金币数
        var text = clickObj.transform.GetChild(0).GetComponent<Text>().text;
        var index = text.IndexOf("金币");
        if (index == -1) return;

        int gold = int.Parse(text.Substring(0, index));

        if (State.gold < gold)
        {
            showDialog("购买商品", "金币不足, 需要" + gold + "金币", "确定");
            return;
        }

        // 弹出框,提示是否购买
        showDialog("购买商品", "需要 " + gold + "金币,是否购买?", "购买", "取消");
        dialogOkType = "buyShop";
        dialogOkData = new Dictionary<string, object>() { { "gold",gold }, {"weapon", weapon}};
    }
}

给Canvas的排序次序设置为10,然后给按钮绑定上事件即可

效果



后面打包又报了以下信息

C:\Program Files\nodejs\node.exe不存在。使用环境变量PATH寻找node,如果仍然报错,请重启电脑刷新环境变量后重试


首先要去下一个Node,我已经有Node了,也配置了环境变量依然报这个问题,在Unity内,打开微信SDK的文件夹 - Editor - Mini Game Config,在 Custom Node Path改为本地Node的地址

地址


Unity 2021版本使用Embeded Symbols, 代码包中含有函数名体积较大, 发布前使用代码分包工具进行优化

这个可以不用管


开发工具报错plugin.js:77 RenderTexture.Create failed: depth/stencil format unsupported - D32 SFloat S8 UInt (94).

报错内容:

plugin.js:77 RenderTexture.Create failed: depth/stencil format unsupported - D32 SFloat S8 UInt (94). There is no compatible format on this platform or this fallback to a compatible format is disabled in the import inspector.
(env: Windows,mg,1.06.2206090; lib: 2.27.2)

是因为游戏纹理的问题,在Unity将Assets创建的三个纹理的深度模板格式改为无

更改纹理



微调

微信小游戏右上角是有关闭和三个点的,于是我们右上角的ui部分就需要进行微调,改变下位置

发现文字没有显示的话代表没有更改字体

界面位置等不好就微调



微信小游戏上线

导出后打开微信开发工具,测试功能是否有问题,并在真机上测试

一切没有问题则上传代码

上传会出现一个问题,就是一直上传,让我摸不着头脑,后面才知道是要更改编码为UTF-8

在 VS Studio中,打开脚本文件,点击文件 - 另存为

另存为

在保存按钮处点击下拉菜单,选择编码保存,然后选择65001那个UTF-8即可

保存


当然也可以使用其他工具来更改编码,更改后重新转换微信小游戏


如果还不行,那检查微信开发者工具是否为最新版,不是则更新到最新版(我这更新后问题就解决了)



上传代码包过大解决

报错为:代码包大小为 20980 kb,上限为 20480 kb,请删除文件后重试

尝试更改参数等依然无法改到20M内,只能在转换微信小游戏时首包资源加载方式选择 CDN


CDN配置我这里放在了另一篇文章里了

Unity转换微信小游戏代码包过大使用CDN方式:https://sdpro.top/blog/html/article/1074.html



最终解决

靠着CDN,加载3,4分钟才进入游戏,可能因为我服务器的带宽低吧

今天到处找了一天了,这方面文档特别的少,官方文档有,但给不出我想要的答案

于是就查看项目有什么占用资源比较大,毕竟制作的这个游戏使用的资源比较少

预制体几k一个,背景音乐300多k,其余两个几k,这些都没啥问题,后来发现字体文件占用了11MB


...


于是从减少字体体积开始入手

可以使用字体裁剪,将使用的字体提取出来,没使用的都去掉

可以自己去找裁剪工具


下面是我统计的使用到的文字:

1234567890.跳跳快乐方块你能坚持秒吗?开始游戏商店历史分数关于声音关确认定取消| 继续返回结束得:金币时间武器x角色破铜烂铁攻击力冷却速已选择精装筒对打中的附近一圈也造成伤害火箭最高长作者砷碲(Shendi)版本简述这是我独立制第款小,用来练手熟悉发到上线全过程次针进行。将以博文形式记录下放在了专栏里htps:/roblgmca?=直都有那么几比较闲想法付诸动购买不足否翻倍额外减半格+-()品

经过裁剪后的字体只有200多kb,这下可以不使用CDN直接打包上传了

之前那个15MB的txt文件变成了7MB


分包

本着能优化就优化的想法尝试了下分包

官方文档:https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/WasmSplit.md

微信开发工具的设置 - 扩展设置,安装wasmCodeSplit

然后点击启用分包

分包


然后就是,分包工具后台预处理完成即可进行下一步,处理中,请等待...

期间会进行一些自动操作,然后会按照提示进行操作即可,最终分包收集完成,有两个选项,选Release

分包完成,分包前如下

分包前


分包后效果如下

分包



上线

上传代码,在小程序的版本管理中提交审核...

其中的审核全部都要两张图,提交

等结果出来再发本专栏最后一篇总结文章了



本文链接:https://sdpro.top/blog/html/article/1075.html

♥ 赞助 ♥

尽管去做,或许最终的结果不尽人意,但你不付出,他不付出,那怎会进步呢?