跳到主要内容

作品开发

信号量总览

Unity-WebGL 作品协议:

  1. init
  2. ready
  3. start
  4. end

完整代码示例(Unity C#,基于环境配置完成)

using System;
using UnityEngine;

public sealed class NianxieGameController : MonoBehaviour
{
[Serializable]
private sealed class InitPayload
{
public string userId;
public string storyId;
public bool debug;
}

private bool _inited;
private bool _started;
private bool _ended;
private NianxieBridge _bridge;

private void Awake()
{
_bridge = GetComponent<NianxieBridge>();
if (_bridge == null)
{
Debug.LogError("[Nianxie] NianxieBridge not found on this GameObject.");
}
}

// [init] JS -> Unity:接收初始化参数,只做准备动作
public void OnMiniInit(string json)
{
var payload = JsonUtility.FromJson<InitPayload>(json);
Bootstrap(payload);
_inited = true;
// [ready] 准备完成后通知宿主可开始
_bridge?.SendReady("{\"stage\":\"game-paused-await-start\"}");
}

// [start] JS -> Unity:收到开始信号后才开启正式运行
public void OnMiniStart(string _)
{
if (!_inited || _started) return;
_started = true;
Time.timeScale = 1f;
EnableGameplay();
}

// [end] 游戏结束时上报结果,且只上报一次
public void OnGameOver(int score, bool win)
{
if (_ended) return;
_ended = true;
var resultJson = $"{{\"score\":{score},\"win\":{win.ToString().ToLowerInvariant()}}}";
_bridge?.SendEnd(resultJson);
}

private void Bootstrap(InitPayload payload)
{
Time.timeScale = 0f;
// TODO: 资源预加载、状态初始化、UI 准备
Debug.Log($"Init user={payload.userId}, story={payload.storyId}");
}

private void EnableGameplay()
{
// TODO: 开启输入、计时、关卡逻辑
}
}

开发约束与提审建议

  • 推荐生命周期顺序:
    1. Host -> WebGL:window.OnMiniInit(payload)
    2. Unity 预启动并暂停(如 Time.timeScale = 0
    3. WebGL -> Host:NianxieMiniReady
    4. Host -> WebGL:window.OnMiniStart(payload)
    5. Unity 恢复运行(Time.timeScale = 1
    6. 结束后主动上报 NianxieMiniEnd
  • 导出前检查 index.html 是否使用 Unity 官方模板变量({{{ ... }}}
  • 打包前确认 ZIP 根目录包含 index.htmlBuild/

可参考:

常见错误统一见:常见问题