作品开发
信号量总览
Unity-WebGL 作品协议:
initreadystartend
完整代码示例(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: 开启输入、计时、关卡逻辑
}
}
开发约束与提审建议
- 推荐生命周期顺序:
- Host -> WebGL:
window.OnMiniInit(payload) - Unity 预启动并暂停(如
Time.timeScale = 0) - WebGL -> Host:
NianxieMiniReady - Host -> WebGL:
window.OnMiniStart(payload) - Unity 恢复运行(
Time.timeScale = 1) - 结束后主动上报
NianxieMiniEnd
- Host -> WebGL:
- 导出前检查
index.html是否使用 Unity 官方模板变量({{{ ... }}}) - 打包前确认 ZIP 根目录包含
index.html与Build/
可参考:
常见错误统一见:常见问题